【实例说明】

普通的Windows窗口包含系统菜单、主菜单和弹出菜单3种菜单,主菜单和弹出菜单都可以用Delphi提供的菜单设计器来设计实现,可是系统菜单不能随意改变。那么如何向系统菜单中添加菜单项呢?本例中的主窗口将在系统菜单中增加一个菜单项。运行效果如下图所示。

image

【技术要点】

利用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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,包括文章,代码,图片等本站内所有资源,否则保留追究法律责任的权利。

posted on 2012-06-11 20:01  银月莲  阅读(898)  评论(0编辑  收藏  举报