Добавление пунктов в системное меню окна
Некоторые программы добавляют свои пункты меню в стандартное системное меню, которое появляется при клике на иконку окна. Как это делается? Очень просто. При инициализации окна или при наступлении каких-либо определенных условий выполняется примерно следующий код:Code (Assembler) : Убрать нумерацию
- ; Получить хэндл системного меню окна
- invoke GetSystemMenu,[hwnddlg],0
- mov ebx,eax
- ; Добавить в меню полосу разделителя
- invoke InsertMenu,ebx,2,MF_BYPOSITION,0,0
- ; Идентификаторы сообщений при выборе пунктов меню
- IDM_MENU1 = 101
- IDM_MENU2 = 102
- ; Добавить свои пункты меню
- invoke InsertMenu,ebx,3,MF_BYCOMMAND,IDM_MENU1,szMenu1
- invoke InsertMenu,ebx,4,MF_BYCOMMAND,IDM_MENU2,szMenu2
- ...
- ...
- szMenu1 db 'About',0
- szMenu2 db 'Exit',0
Но просто добавлять пункты в меню бессмысленно, нам надо как-то обрабатывать события, возникающие при их выборе. Это тоже несложно. При выборе пункта системного меню родительскому окну отправляется сообщение WM_SYSCOMMAND, у которого wParam имеет значение заданного идентификатора этого пункта.
Code (Assembler) : Убрать нумерацию
- ; Обработчик сообщений окна
- ...
- cmp [msg],WM_SYSCOMMAND
- je .wmmenu
- ...
- ; Обработчик сообщений от системного меню
- .wmmenu:
- ; Выбран первый добавленный пункт меню?
- cmp [wparam],IDM_MENU1
- je .action_1
- ; Выбран второй добавленный пункт меню?
- cmp [wparam],IDM_MENU2
- je .action_2
- ; Передача системного сообщения дальше по цепочке обработчиков
- invoke DefWindowProc,[hwnddlg],[msg],[wparam],[lparam]
- jmp .processed
- ...
В приложении пример программы с исходным текстом, демонстрирующий добавление своих пунктов в системное меню окна.
Просмотров: 6053 | Комментариев: 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
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. дяденька, добавь смайлики для вставки в комментарий....
--------------------
PS. дяденька, добавь смайлики для вставки в комментарий....
Grey
(05.11.2013 в 17:19):
спасибо
Добавить комментарий
Заполните форму для добавления комментария