Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Win32 API - Чекбокс в меню

Ответить
Настройки темы
Win32 API - Чекбокс в меню

Новый участник


Сообщения: 20
Благодарности: 0

Профиль | Отправить PM | Цитировать


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


Меню

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.

Отправлено: 21:53, 14-07-2007

 

Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


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 для получения описателя меню.


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

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 14:50, 15-07-2007 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 20
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: rar Menu Checkbox Window On Top.rar
(9.7 Kb, 8 просмотров)

Благодарю. Я уже и забыл что здесь сообщение оставлял. Присоединяю архив с исходником по этой теме, когда дошло как это делать. Чтобы может быть меньше вопросов задавали как я .
Ммм... Добавлю: А что надо в коде изменить, чтобы вместо чекбоксов были точки такие большие (Ну как в Диспетчере задач при выборе приоритета)?

Отправлено: 15:43, 17-07-2007 | #3


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Цитата 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, изменяя каждый раз только третий параметр в зависимости от того, какой член меню (радиокнопку) нажал пользователь.

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 21:08, 17-07-2007 | #4


Новый участник


Сообщения: 20
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо.

Отправлено: 23:28, 17-07-2007 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Win32 API - Чекбокс в меню

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - [решено] История переходов в меню Пуск (все вопросы) kortez Microsoft Windows 7 35 02-05-2011 10:09
Разное - [решено] Доп-ое меню в св-вах "Мой компьютер" и Меню восстановление forcik Microsoft Windows 2000/XP 3 24-12-2008 02:42
Разное - Отсутствует меню "Свойства папки" в меню "сервис" папки. __sa__nya Microsoft Windows 2000/XP 1 12-08-2008 16:12
меню bruder Вебмастеру 1 12-05-2008 03:48
Меню Suvor Вебмастеру 8 22-07-2003 15:30




 
Переход