Delphi在系统菜单中添加删除系统菜单项

Delphi在系统菜单中添加删除系统菜单项,利用Windows提供的API函数GetSystemMenu可以得到窗口的系统菜单句柄,再通过AppendMenu和DeleteMenu就可以添加和删除菜单了。

工具/原料 

 
  • Delphi7
  • Windows电脑

方法/步骤

  1.  

    打开Delphi7,创建新的工程,默认新窗体的Name属性为Form1

    技术图片

     

  2.  

    在Form1的Object Inspector中Events里双击OnCreate为Form1创建OnCreate方法,此方法在窗体创建时调用。

    技术图片

     

  3.  

    在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)”菜单项

    技术图片

     

  4.  

    F9运行程序,右键系统标题位置,弹出系统菜单,最后一项就是我们刚刚添加的菜单了

    技术图片

     

  5.  

    为新添加的系统菜单增加点击响应方法,在TForm1类的private添加方法

    procedure sysmenu(var msg: twmmenuselect);message wm_syscommand; 

    这个函数参数为菜单选择类型。

    技术图片

     

  6.  

    鼠标光标点到这个函数的声明,同时按住CTRL+Shift+C即可以创建这个函数体,在函数体内写:

    begin  if msg.IDItem = 1001 then    showmessage(‘你选择了自己添加的菜单!‘)  else    inherited;end;

    技术图片

     

  7.  

    F9运行程序,右键系统标题位置,弹出系统菜单,点击最后一项我们添加的菜单会弹出对话框。

    技术图片

     

  8.  

    再回到Form1窗体,为窗体添加一个Button

    技术图片

     

  9.  

    双击新添加的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

    技术图片

     

  10.  

    F9运行程序,点击Button1,再查看系统菜单会发现我们添加的系统菜单项已经没了。

     
    技术图片

    技术图片

    END