Нет никакого способа добавить пункт меню стандартным вызовом Delphi. Вы должны заманить в ловушку сообщение Windows WM_SYSCOMMAND окна и проверить элемент сообщения wParam, чтобы определить, что Ваш пункт меню был выбран. В основном Вы должны сделать это:
Создать новую форму, отменить событие OnMessage, назначив новую процедуру обработки события OnMessage. Создайте константу, которая будет использоваться как порядковый идентификатор для Вашего пункта меню.
В FormCreate сделайте Ваше меню вызовом Windows API AppendMenu. Вот код, который показывает, как сделать это:
uses
SysUtils, WinTypes, WinProcs, Messages, Classes,
Graphics, Controls, Forms, Dialogs, Menus;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ ... }
public
{ Это объявление имеет тип TMessageEvent, который является
указателем на процедуру которая получает два переменных
параметра типа TMsg и Boolean, соответственно }
procedure WinMsgHandler(var Msg : TMsg; var Handled : Boolean);
end;
var
Form1: TForm1;
const
MyItem = 100; // Идентификатор меню. Это может быть любое значение WORD
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
{ Сначала сообщим приложению, что его обработчик события отличается от
заданного по умолчанию }
Application.OnMessage := WinMsgHandler;
{ Добавим разделитель }
AppendMenu(GetSystemMenu(Self.Handle, False), MF_SEPARATOR, 0, '');
{ Добавьте Ваше меню. Так как Item ID высок, использование константы MF_BYPOSITION
разместит его в конец системного меню }
AppendMenu(GetSystemMenu(Self.Handle, False),
MF_BYPOSITION, MyItem, 'My Men&u Choice');
end;
procedure TForm1.WinMsgHandler(var Msg: TMsg; var Handled: Boolean);
begin
{ Если сообщение - системное... }
if Msg.Message = WM_SYSCOMMAND then
if Msg.wParam = MyItem then
{ Помещаем здесь код обработки. Здесь выбрано ShowMessage для демонстрации }
ShowMessage('Вы щелкнули мое меню!!!');
end;
end.
Как Вы, наверное, уже знаете, команда AppendMenu может использоваться также со свернутыми приложениями.
Например, если Вы сворачиваете форму, значок представляет приложение, а не Вашу форму. Поэтому, чтобы сделать системное меню с Вашим пунктом меню видимым в свернутой форме, нужно использовать Application.Handle вместо Self.Handle , чтобы иметь дело с системным меню приложения.
|