通常在应用程序中,如果单击标题栏的左侧图标,就会弹出一个窗体的系统菜单,在其中可以完成最小化、最大化和关闭等操作。本实例将演示如何在窗体的系统菜单中添加自己的选项。 在窗体中添加一个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.
用Delphi为窗体的系统菜单中添加选项
最新推荐文章于 2024-04-19 10:46:39 发布