通常在應用程序中,如果單擊標題欄的左側圖標,就會彈出一個窗體的系統菜單,在其中可以完成最小化、最大化和關閉等操作。本實例將演示如何在窗體的系統菜單中添加自己的選項。
在窗體中添加一個TMainMenu組件,其中TMainMenu組件中的選項將要被添加到窗體的系統菜單中。添加組件後的窗體如圖1所示。
圖1 添加組件後的窗體
在TMainMenu組件生成的菜單中添加一個File菜單,在這個菜單下面添加一個Exit選項。
在本程序開始運行時就會把TMainMenu組件生成的菜單添加到窗體的系統菜單中,響應代碼如下:
procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
AppendMenu (GetSystemMenu (Handle, FALSE), MF_SEPARATOR, 0, '');
with MainMenu1 do
begin
for I := 0 to Items.Count - 1 do
AppendMenu(GetSystemMenu(self.Handle,FALSE),mf_Popup,
Items[I].Handle,PAnsiChar(Items[I].Caption));
end;
end;
程序首先通過GetSystemMenu (Handle, FALSE)來取得窗體的系統菜單,並且調用AppendMenu函數添加一個MF_SEPARATOR類型的選項,也就是菜單分隔條。然後通過一個循環,調用AppendMenu函數把TMainMenu組件生成的菜單逐個添加到窗體的系統菜單中。
現在,雖然選項已經添加到窗體的系統菜單中,但是選項還不能夠響應用戶的操作。為了能夠正常響應用戶的操作,需要攔截WM_SysCommand消息,所以要添加攔截消息的過程——procedure WMSysCommand(var Msg:TWMSysCommand);message WM_SysCommand,它的響應代碼如下:
procedure TForm1.WMSysCommand (var Msg: TWMSysCommand);
var
Item: TMenuItem;
begin
Item := MainMenu1.FindItem(Msg.CmdType, fkCommand);
if Item <> nil then
Item.Click;
inherited;
end;
這樣,新添加的選項就可以正常工作了。
單擊窗體系統菜單File中的Exit選項,就會結束程序的運行。
程序代碼如下:
unit Unit1;
interface
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs,
Menus, StdCtrls;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
Exit1: TMenuItem;
procedure Exit1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure WMSysCommand(var Msg:TWMSysCommand);message WM_SysCommand;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMSysCommand (var Msg: TWMSysCommand);
var
Item: TMenuItem;
begin
Item := MainMenu1.FindItem (Msg.CmdType, fkCommand);
if Item <> nil then
Item.Click;
inherited;
end;
procedure TForm1.Exit1Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
AppendMenu (GetSystemMenu (Handle, FALSE), MF_SEPARATOR, 0, '');
with MainMenu1 do
begin
for I := 0 to Items.Count - 1 do
AppendMenu(GetSystemMenu(self.Handle,FALSE),mf_Popup,
Items[I].Handle,PAnsiChar(Items[I].Caption));
end;
end;
end.
保存文件,然後按F9鍵運行程序,程序運行結果如圖2所示。
圖2 程序運行結果
本實例演示的是如何向窗體的系統菜單中添加選項。取得系統選項的句柄後,不但可以添加選項,還可以修改選項,這樣讀者就可以在自己編寫的程序中更加充分地控制窗體的系統菜單。