【实例说明】
普通的Windows窗口包含系统菜单、主菜单和弹出菜单3种菜单,主菜单和弹出菜单都可以用Delphi提供的菜单设计器来设计实现,可是系统菜单不能随意改变。那么如何向系统菜单中添加菜单项呢?本例中的主窗口将在系统菜单中增加一个菜单项。运行效果如下图所示。
【技术要点】
利用Windows提供的API函数GetSystemMenu可以得到窗口的系统菜单句柄,该函数原型如下:
function GetSystemMenu(hWnd:HWND;bRevert:BOOL):HMENU;stdcall;
参数说明如下。
- hWnd:所要取得系统菜单句柄的目标窗口句柄。
- bRevert:是否修改原始菜单。
返回值是1个HMENU型的菜单句柄。
通过GetSystemMenu取得句柄后可以使用AppendMenu函数为系统菜单增加一个菜单项,该函数原型如下:
function AppendMenu(hMenu:HMENU;uFlags,uIDNewItem:UNIT;lpNewItem:PChar):BOOL;stdcall;
参数说明如下。
- hMenu:用GetSystemMenu函数取得的菜单句柄。
- uFlags,uIDNewItem:菜单唯一标志,弹出菜单标志。
- lpNewItem:菜单的类型。
【实现过程】
(1)新建1个标准工程,创建1个新窗体,默认主窗体的Name属性为Form1。
(2)完整程序代码如下:
unit Sample001;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure SysMenu(var msg: TWMMenuSelect); message wm_syscommand;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
begin
i := GetSystemMenu(handle, false);
AppendMenu(i, mf_separator, 0, nil); // 添加分割线
AppendMenu(i, mf_string, 100, '我的菜单(&E)'); // 添加菜单项
end;
procedure TForm1.SysMenu(var msg: TWMMenuSelect);
begin
if msg.IDItem = 100 then
ShowMessage('您选择了自己添加的菜单!')
else
inherited;
end;
end.
【举一反三】
根据本实例,读者可以进行以下操作。
- 通过DeleteMenu()函数删除指定的菜单条。
作者:银月莲
出处:http://www.cnblogs.com/moonsilvering
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,包括文章,代码,图片等本站内所有资源,否则保留追究法律责任的权利。