procedure TForm1.FormCreate(Sender: TObject);
begin
// добавить в меню разделитель и дополнительный пункт
AppendMenu (GetSystemMenu (Handle, FALSE), MF_SEPARATOR, 0,' ');
AppendMenu (GetSystemMenu (Handle, FALSE), MF_STRING, idSysAbout, '&About... ');
// добавить эти же самые пункты в системное меню приложения
AppendMenu (GetSystemMenu (Application.Handle, FALSE), MF_SEPARATOR, 0,' ');
AppendMenu (GetSystemMenu (Application.Handle, FALSE), MF_STRING, idSysAbout, '&About...');
end;
В первой части кода в системное меню главной формы добавляется дополнительный разделитель и новый
пункт. Два других вызова добавляют те же самые два элемента в системное меню приложения, при этом
используется дескриптор Application. Handle. Этого вполне достаточно для того, чтобы отобразить
обновленное системное меню, в чем можно убедиться, запустив программу. Второй шаг — организация
обработки выбора нового пункта меню.
Чтобы организовать обработку сообщений формы, достаточно просто написать новый обработчик
события или метод, осуществляющий обработку сообщения. Однако сделать то же самое в отношении
окна приложения нельзя в первую очередь потому, что создание классов, являющихся производными
от TApplication, — это не такое уж простое дело. В большинстве случаев достаточно просто организовать
обработку события OnMessage этого класса. Это событие возникает каждый раз, когда приложение
извлекает из очереди сообщений очередное сообщение.
Чтобы обработать событие OnMessage глобального объекта Application, достаточно просто добавить
на главную форму программы компонент ApplicatonEvents и определить обработчик для события
OnMessage для данного компонента. В нашем случае требуется осуществить обработку только
одного сообщения: wm_SysCommand. Это требуется сделать только если параметр wParam указывает
на то, что пользователь выбрал только что добавленный нами пункт меню idSysAbout:
procedure TForm1.ApplicationEventslMessage(var Msg: tagMSG; var Handled: Boolean);
begin
if (Msg.Message = wm_SysCommand) and (Msg.wParam = idSysAbout) then
begin
ShowMessage ('Mastering Delphi: SysMenu2 example');
Handled := True;
end;
end;
Этот метод очень напоминает собой метод, который используется для обработки соответствующего пункта системного меню главной формы:
procedure WMSysCommand (var Msg: TWMSysCommand);
message wm_SysCommand;
...
procedure TForm1.WMSysCommand (var Msg: TWMSysCommand);
begin
// обработке некоторой команды
if Msg.CmdType = idSysAbout then
ShowMessage ('Mastering Delphi: SysMenu2 example');
inherited;
end;