数用法都是类似的上面已经说了ModifyMenu函数的用法,下面仅用AppendMenu函数在
系统菜单中添加一个关于菜单来说明,虽然它本身是没有什么意义的,但希望可以起到抛砖引玉的作用。
AppendMenu 函数原型:
BOOL AppendMenu(
HMENU hMenu, // 要定制的菜单句柄
UINT uFlags, // 怎样定制菜单项
UINT uIDNewItem, // 要定制的菜单项标识或子菜单句柄
LPCTSTR lpNewItem // 要定制的菜单项(字串)
);
在 AppendMenu 函数里,lpNewItem 和 uIDNewItem 参数依赖 uFlags 的不同标志而有所变化。
唯一限制:系统菜单中添加的菜单项的ID值(uIDNewItem)必须小于 $F000(十进制:61440);否则会与Windows系统菜单命令所使用的ID值相冲突。还要记住当为这些新菜单在窗口过程中处理WM_SYSCOMMAND消息时,必须把其它的WM_SYSCOMMAND消息发给DefWindowsProc(在Delphi中秩序在事件处理
程序最后加入一句 Inherited;),否则,嘿嘿,你试试就知道了。
首先创建一个新工程,因为要用到Menus单元中的内容,故在文件Unit1.pas的uses语句中加入Menus。
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls,Menus;
然后在窗体Form1的OnCreate事件处理过程加入以下代码:
procedure TForm1.FormCreate(Sender: TObject);
var hSysMenu:hMENU;
begin
hSysMenu:=GetSyst
emMenu(Handle,False);//得到系统菜单句柄
AppendMenu(hSysMenu,MF_SEPARATOR,0,'');//添加一个分隔符
AppendMenu(hSysMenu,MF_STRING,3,'关于(&;A)');
end;
在TForm1的类型定义中,添加系统菜单中新建菜单项的OnClick事件的处理过程的声明(即对消息WM_SYSCOMMAND的处理声明):
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure SysMenuCommand(var Msg:TWMMENUSELECT);
message WM_SYSCOMMAND;
{ Private declarations }
public
{ Public declarations }
end;
接着按Shift+Ctrl+C完成类声明。在其中填入以下代码:
procedure TForm1.SysMenuCommand(var Msg: TWMMENUSELECT);
begin
if Msg.IDItem=3 then
MessageBox(0,'A Poor-Person''s Menu Program'+#13+
' Copyright Skyey ,2000','Skyey',
MB_OK+MB_ICONINFORMATION);
Inherited;
end;
编译、运行程序,测试其效果。
附:uFlags 一些定义值://选译自Delphi 5带的Windows SDK 帮助
MF_BITMAP 指明该菜单项是一位图,在 lpNewItem 参数代表位图句柄
MF_CHECKED 在菜单项的前面放上一个"选中"标记
MF_DISABLED 屏蔽该菜单项,但不使它变成灰色
MF_ENABLED 使该菜单项有效,与 MF_DISABLED 相反
MF_GRAYED 除了有 MF_DISABLED 的作用以外,还把该菜单项变灰
MF_MENUBREAK 把该菜单与现有菜单并排放在一起
MF_MENUBARBREAK 与MF_MENUBREAK 相同,除了在中间放一条竖线外
MF_OWNERDRAW 表明该菜单项为自绘菜单项,还必须处理一切的显示、更新问题
MF_POPUP 该菜单项为一子菜单,uIDNewItem 参数代表其句柄
MF_SEPARATOR 在菜单项画上一分割线
MF_STRING 该菜单项是一文本字串,lpNewItem 是其内容
MF_UNCHECKED 取消该菜单项前面的"选中"标记
以下几组标志中每组的标志不能同时使用:
< 1> MF_DISABLED, MF_ENABLED, and MF_GRAYED
< 2> MF_BITMAP, MF_STRING, and MF_OWNERDRAW
< 3> MF_MENUBARBREAK and MF_MENUBREAK
< 4> MF_CHECKED and MF_UNCHECKED
-- 3 为菜单动态定义快捷键
其实就是改变菜单的ShortCut属性,在程序中加入一个HotKey组件,然后把其HotKey属性赋给菜单的ShortCut属性即可。如:
procedure TForm1.BtnChange1Click(Sender: TObject);
begin
New1.ShortCut:=Hotkey1.HotKey;
end;
如果你只需要程序自行更改有限的几个快捷键而不需要用户自己改变,那么也可以不用HotKey组件,直接把一个TSho