Delphi在系统菜单中添加删除系统菜单项
Delphi在系统菜单中添加删除系统菜单项,利用Windows提供的API函数GetSystemMenu可以得到窗口的系统菜单句柄,再通过AppendMenu和DeleteMenu就可以添加和删除菜单了。
方法/步骤
-
打开Delphi7,创建新的工程,默认新窗体的Name属性为Form1
-
在Form1的Object Inspector中Events里双击OnCreate为Form1创建OnCreate方法,此方法在窗体创建时调用。
-
在OnCreate方法中添加以下代码:
var
h: integer;
begin
h := getsystemmenu(handle,false);
appendmenu(h,mf_separator,0,nil);
appendmenu(h,mf_string,1001,‘我建的系统菜单(&E)‘);
end;
解释一下:
function GetSystemMenu(hWnd:HWND;bRevert:BOOL):HMENU;stdcall;
参数说明:
hWnd: 所要取得系统菜单句柄的目标窗口句柄。
bRevert:是否修改原始菜单。
返回一个HMENU型的菜单句柄。
第一个参数为handle即当前窗口的handle,即Form1.handle
第二个不修改原始菜单,保留原始菜单
得了窗体系统菜单句柄h后调用了appendmenu方法。
function AppendMenu(hMenu:HMENU;uFlags,uIDNewItem:UNIT;lpNewItem:Pchar):BOOL;stdcall;
参数说明:
hMenu: 用GetSystemMenu函数得到的菜单句柄。
uFlag:。如果这个参数包括mf_string常数,该lpnewitem参数指向的字符串
uIDNewItem:标识符的新菜单项。
lpNewItem:菜单的类型。
用这个appendmenu方法先增加了一个分割线,再添加了一个唯一标识为1001的“我建的系统菜单(&E)”菜单项
-
F9运行程序,右键系统标题位置,弹出系统菜单,最后一项就是我们刚刚添加的菜单了
-
为新添加的系统菜单增加点击响应方法,在TForm1类的private添加方法
procedure sysmenu(var msg: twmmenuselect);message wm_syscommand;
这个函数参数为菜单选择类型。
-
鼠标光标点到这个函数的声明,同时按住CTRL+Shift+C即可以创建这个函数体,在函数体内写:
begin if msg.IDItem = 1001 then showmessage(‘你选择了自己添加的菜单!‘) else inherited;end;
-
F9运行程序,右键系统标题位置,弹出系统菜单,点击最后一项我们添加的菜单会弹出对话框。
-
再回到Form1窗体,为窗体添加一个Button
-
双击新添加的Button1进入Button1的点击响应函数Button1Click(Sender: TObject);在函数体写下:
var
i: integer;
begin
i := getsystemmenu(handle,false);
Deletemenu(i,1001,MF_BYCOMMAND);
end;
解释一下:
先获取到Form1窗体的系统菜单句柄
DeleteMenu(hMenu :HMENU; uPosition :Cardinal; uFlags :Cardinal)
hMenu Long,菜单句柄
nPosition Long,欲删除菜单条目的标识符。如在wFlags中设置了MF_BYCOMMAND标志,这个参数就代表要改变的菜单条目的命令ID。
wFlags Long,MF_BYPOSITION或MF_BYCOMMAND
我们新添加的菜单默认是MF_BYCOMMAND方式,对应的唯一标识是1001,所以最后参数是MF_BYCOMMAND
-
F9运行程序,点击Button1,再查看系统菜单会发现我们添加的系统菜单项已经没了。
END