用Delphi为窗体的系统菜单中添加选项

通常在应用程序中,如果单击标题栏的左侧图标,就会弹出一个窗体的系统菜单,在其中可以完成最小化、最大化和关闭等操作。本实例将演示如何在窗体的系统菜单中添加自己的选项。   在窗体中添加一个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;interfaceusesSysUtils, 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 程序运行结果  本实例演示的是如何向窗体的系统菜单中添加选项。取得系统选项的句柄后,不但可以添加选项,还可以修改选项,这样读者就可以在自己编写的程序中更加充分地控制窗体的系统菜单。   方法二: 为什么Windows的系统菜单总是一成不变?这个例子教你如何往系统菜单添加一个菜单项如about或information等。    这个例子将一个菜单项加到系统菜单中去。我们需要两个东西,一个是项名,这可以是如何整数;我们还需要一个程序去收取Windows对确认点击我们创建的菜单项的信息。 Unit OhYeah; Interface Uses    SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, Menus; Type   TForm1 = Class (TForm)      Procedure FormCreate (Sender : TObject);          Private {Private declarations}   Public {Public declarations}      Procedure WinMsg (Var Msg : TMsg; Var Handled : Boolean);      Procedure DoWhatEever; End; Var   Form1 : TForm1; Implementation {$R *.DFM} Const     ItemID = 99; // 这个ID number代表你的菜单项,可以是任何值。Procedure Tform1.WinMsg (Var Msg : TMsg; Var Handled : Boolean); Begin     If Msg.Message = WM_SYSCOMMAND Then        If Msg.WParam = ItemID Then DoWhatEver; End; Procedure TForm1.FormCreate (Sender : TObject); Begin     Application.OnMessage := WinMsg;     AppendMenu (GetSystemMenu (Form1.Handle, False), MF_SEPARATOR, 0, '');     AppendMenu (GetSystemMenu (Form1.Handle, False), MF_BYPOSITION, ItemID, '&My menu');     AppendMenu (GetSystemMenu (Application.Handle, False), MF_SEPARATOR, 0, '');     AppendMenu (GetSystemMenu (Application.Handle, False), MF_BYPOSITION, ItemID,'&My menu minimized'); End; Procedure TForm1.DoWhatEver; Begin     Exit; //你可以添加任何你想加的东西到这里End; End.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蝈蝈(GuoGuo)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值