Blog. Just Blog

Добавление пунктов в системное меню окна

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Некоторые программы добавляют свои пункты меню в стандартное системное меню, которое появляется при клике на иконку окна. Как это делается? Очень просто. При инициализации окна или при наступлении каких-либо определенных условий выполняется примерно следующий код:
  1.         ; Получить хэндл системного меню окна
  2.         invoke  GetSystemMenu,[hwnddlg],0
  3.         mov     ebx,eax
  4.  
  5.         ; Добавить в меню полосу разделителя
  6.         invoke  InsertMenu,ebx,2,MF_BYPOSITION,0,0
  7.  
  8.         ; Идентификаторы сообщений при выборе пунктов меню
  9.         IDM_MENU1 = 101
  10.         IDM_MENU2 = 102
  11.  
  12.         ; Добавить свои пункты меню
  13.         invoke  InsertMenu,ebx,3,MF_BYCOMMAND,IDM_MENU1,szMenu1
  14.         invoke  InsertMenu,ebx,4,MF_BYCOMMAND,IDM_MENU2,szMenu2
  15.         ...
  16.         ...
  17. szMenu1 db 'About',0
  18. szMenu2 db 'Exit',0
В этом примере используется функция InsertMenu, так как нам надо просто добавить пункты в меню. Если планируется использование дополнительных спецэффектов, то эту функцию можно заменить на более современную InsertMenuItem.

Но просто добавлять пункты в меню бессмысленно, нам надо как-то обрабатывать события, возникающие при их выборе. Это тоже несложно. При выборе пункта системного меню родительскому окну отправляется сообщение WM_SYSCOMMAND, у которого wParam имеет значение заданного идентификатора этого пункта.
  1.         ; Обработчик сообщений окна
  2.         ...
  3.         cmp     [msg],WM_SYSCOMMAND
  4.         je      .wmmenu
  5.         ...
  6.  
  7.         ; Обработчик сообщений от системного меню
  8. .wmmenu:
  9.         ; Выбран первый добавленный пункт меню?
  10.         cmp     [wparam],IDM_MENU1
  11.         je      .action_1
  12.         ; Выбран второй добавленный пункт меню?
  13.         cmp     [wparam],IDM_MENU2
  14.         je      .action_2
  15.  
  16.         ; Передача системного сообщения дальше по цепочке обработчиков
  17.         invoke  DefWindowProc,[hwnddlg],[msg],[wparam],[lparam]
  18.         jmp     .processed
  19.         ...
Обратите внимание, что в обработчик сообщения добавлена функция DefWindowProc. Она нужна, чтобы все остальные системные сообщения, которые не относятся к системному меню, достигали своей цели. Если ее опустить, то окно вообще перестанет реагировать на внешние события: его нельзя будет закрыть нажатием на "крестик", переместить за заголовок, изменить размер и т.д.

В приложении пример программы с исходным текстом, демонстрирующий добавление своих пунктов в системное меню окна.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

System.Menu.Demo.zip (2,448 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 5937 | Комментариев: 5

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (22.08.2014 в 22:06):
Тоже ведь язык программирования, не вижу ничего плохого в умении кодить именно на нем. И получается всяко быстрее, чем на Ассемблере :)
brute (22.08.2014 в 22:01):
purebsic развратил мой мозг:
Procedure CB(hWnd,Msg,wParam,lParam)
  If Msg=#WM_SYSCOMMAND And wParam=1
    MessageRequester("I am here","PB is great!")
     EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
OpenWindow(0,0,0,350,200,"Добавлен пункт в системное меню",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
hsismenu = GetSystemMenu_(WindowID(0), #False)
AppendMenu_(hsismenu,#MF_STRING, 1,"messagebox")
SetWindowCallback(@CB(),0) ; Обработчик событий
Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
размер exe: 15-25кб в зависимости от версии PB
ManHunter (05.11.2013 в 21:36):
Не, смайликов точно не будет. Иначе начнутся злоупотребления, уже проверено.
avp1965 (05.11.2013 в 20:27):
Благодарствуем....
--------------------
PS. дяденька, добавь смайлики для вставки в комментарий....
Grey (05.11.2013 в 17:19):
спасибо

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0054 сек.) / Память: 4.5 Mb
Наверх