Win32 API - Чекбокс в меню

Ответить
Аватара пользователя
Maksim V

Win32 API - Чекбокс в меню

Сообщение Maksim V »

Приветствую. Интересует создание чекбокса в меню. Само меню грузится из ресурса. Вообщем если что, то сразу тут показал "наброски" ресурсов и кода. Подскажите как правильно подправить код (или ресурс меню), чтобы при нажатии в меню появлялся/исчезал чекбокс. Заранее спасибо.





Меню



101 MENU

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL

{

POPUP "Действие"

{

MENUITEM "Поверх окон", 1001

}

}



Диалог



101 DIALOGEX 0, 0, 70, 20

STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_SYSMENU

CAPTION "Поверх окон"

MENU 101

LANGUAGE LANG_RUSSIAN, 0x1

FONT 8, "MS SHELL DLG"

{

}



Код



program example;



{$R example.res}



uses Windows, Messages;



const

MAIN_DIALOG = 101;

MAIN_MENU = 101;

MENU_ON_TOP = 1001;

APP_NAME = 'Поверх окон';



var

Inst, HWND : integer;



function MainDlgProc(hWin, uMsg, wParam, lParam : Integer) : Integer; stdcall;

begin

Result := 0;

HWND := FindWindow(nil, APP_NAME);

case uMsg of

WM_COMMAND : begin

if wParam = WM_COMMAND then EndDialog(hWin,0);

if MF_UNCHECKED = GetMenuState(MAIN_MENU, MENU_ON_TOP, MF_BYCOMMAND) then

begin

CheckMenuItem(MENU_ON_TOP, MF_CHECKED,MF_BYCOMMAND); Setwindowpos(hWnd, hWnd_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW);

end

else

begin

CheckMenuItem(MENU_ON_TOP, MF_UNCHECKED,MF_BYCOMMAND); Setwindowpos(hWnd, hWnd_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW);

end;

end;

WM_DESTROY : begin

EndDialog(hWin,0);

end;

WM_CLOSE : begin

EndDialog(hWin,0);

end;

end;

end;



begin

Inst := hInstance; DialogBoxParam(Inst, PChar(MAIN_DIALOG), 0, @MainDlgProc, 0);

end.
Аватара пользователя
DillerInc

Re: Win32 API - Чекбокс в меню

Сообщение DillerInc »

Maksim V

Исходник давать нет смысла, т.к. я писал на ассемблере, но заметки дам.



При объявлении ресурса меню необходимо выставить свойство CHECKED следующим образом:



Код:

Код: Выделить всё

101 MENU
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
{
POPUP "Действие"
{
MENUITEM "Поверх окон", 1001, CHECKED
}
}

Далее в оконной процедуре диалога нужно добавить обработку сообщения WM_INITDIALOG, т.е. когда диалог будет инициализироваться.В это время вызвать функцию CheckMenuItem, чтобы убрать галочку(MF_UNCHECKED),если ты хочешь,чтобы галка была по-умолчанию снята.

Ты её(функцию) кстати походу неправильно вызываешь, должно быть:



Код:

Код: Выделить всё

var
 g_hMenu : HANDLE
function MainDlgProc(hWin, uMsg, wParam, lParam : Integer) : Integer; stdcall;
begin
...
 g_hMenu := GetMenu(hWin);
 CheckMenuItem(g_hMenu, MENU_ON_TOP, MF_UNCHECKED);
...

Ещё...при вызове функции GetMenuState первым параметром должен быть описатель(handle), а не идентификатор(identificator).Это разные вещи.Именно поэтому я использовал функцию GetMenu для получения описателя меню.





Используй теги кода в сообщениях.

На этом форуме практикуется нажатие на кнопочку "полезное сообщение" под конкретным сообщением,которое тебе помогло.
Аватара пользователя
Maksim V

Re: Win32 API - Чекбокс в меню

Сообщение Maksim V »

Благодарю. Я уже и забыл что здесь сообщение оставлял. Присоединяю архив с исходником по этой теме, когда дошло как это делать. Чтобы может быть меньше вопросов задавали как я Изображение .

Ммм... Добавлю: А что надо в коде изменить, чтобы вместо чекбоксов были точки такие большие (Ну как в Диспетчере задач при выборе приоритета)?
Вложения
Menu Checkbox Window On Top.rar
(9.73 КБ) 0 скачиваний
Menu Checkbox Window On Top.rar
(9.73 КБ) 0 скачиваний
Аватара пользователя
DillerInc

Re: Win32 API - Чекбокс в меню

Сообщение DillerInc »

Цитата Maksim V:

Добавлю: А что надо в коде изменить, чтобы вместо чекбоксов были точки такие большие

..."большая точка" -- это т.н. RADIOBUTTON.Обычно изображается в виде пули(bullet).

Техника следующая:

Код:

Код: Выделить всё

#define IDM_RB_1     101
#define IDM_RB_2     102
#define IDM_RB_3     103
...
POPUP "Radio Buttons"
  BEGIN
   MENUITEM "Radio button nr.1", IDM_RB_1, CHECKED
   MENUITEM "Radio button nr.2", IDM_RB_2, CHECKED
   MENUITEM "Radio button nr.3", IDM_RB_3, CHECKED  
  END
...

...далее в диалоговой процедуре обрабатываем сообщение WM_INITDIALOG и изменяем свойства членов POPUP-меню с помощью функции CheckMenuRadioItem:

Код:

Код: Выделить всё

var
 g_hMenu : HANDLE
function MainDlgProc(hWin, uMsg, wParam, lParam : Integer) : Integer; stdcall;
begin
...
 g_hMenu := GetMenu(hWin);
 CheckMenuRadioItem(g_hMenu,   // описатель меню
                                    IDM_RB_1,  // первый в группе членов меню
                                    IDM_RB_3,  // последний в группе
                                    IDM_RB_1,  // член,который надо отметить
                                    MF_BYCOMMAND);

...данный код сделает необходимые члены меню по типу RADIOBUTTON и выделит первый -- IDM_RB_1.

Наконец,при обработке сообщения WM_COMMAND в той же диалоговой процедуре необходимо снова вызывать функцию CheckMenuRadioItem, изменяя каждый раз только третий параметр в зависимости от того, какой член меню (радиокнопку) нажал пользователь.
Ответить

Вернуться в «Программирование и базы данных»