万里悲秋常作客,百年多病独登台。博学之,审问之,慎思之,明辨之,笃行之。运筹帷幄之中,决胜千里之外。青,取之于蓝,而青于蓝。月上柳梢头,人约黄昏后。Delphi有关菜单的几个技巧
本人在
学习使用Delphi中,遇到了一些关于菜单的编程问题,其中一些比较由代表性或比较实用,先把它从笔记中整理出来,与大家分享,请多多指教。
-- 1 将菜单项移到菜单栏的最右边
在一些应用程序中,常把一些特殊的菜单项放在菜单栏的最右边(如WPS2000 中的"定制界面"菜单,一些应用程序的帮助菜单),这些菜单项放在菜单栏(menu bar)的右边比较好。Delphi中虽然没有直接提供把菜单放在菜单栏右边的函数,但是Delphi的Windows单元封装了可以实现这种效果的Windows API函数(ModifyMenu、GetMenuItemInfo)。因此,我们在
Delphi中可以直接使这些函数来实现这种效果。
使用ModifyMenu和GetMenuItemInfo都可以将菜单项移到菜单栏的最右边,那么选那个较好呢?
据 Windows SDK
文档: ModifyMenu函数可以改变一个已经存在的菜单项的设置,这个函数用于指定一个菜单的标题、显示外观等项目,不过,ModifyMenu函数现在已经被功能更强大的SetMenuItemInfo函数取代。虽然如此,如果你的程序不需要SetMenuItemInfo函数提供的扩展功能,你仍旧可以继续使用ModifyMenu函数。
ModifyMenu函数支持 Windows 32、9x、NT/2000。
SetMenuItemInfo函数支持 Windows 9x、NT/2000,不支持windows 32(较早版本也不支持NT/2000)。
另外,SetMenuItemInfo函数功能比ModifyMenu函数强大,不过使用函数SetMenuItemInfo需要的参数也比ModifyMenu函数复杂的多。所以这里我依然使用比较简单的ModifyMenu函数来实现。
ModifyMenu函数原型为:
BOOL ModifyMenu(
HMENU hMnu, // handle of menu
UINT uPosition, // menu item to modify
UINT uFlags, // menu item flags
UINT uIDNewItem, // menu item identifier or handle of drop-down menu or submenu
LPCTSTR lpNewItem // menu item content
);
第一个参数hMENU 指的是要修改的菜单的句柄(如:MainMenu1.Handle);
第二个参数uPosition 指的是要修改的菜单项索引值(菜单栏左边第一个其值为零,从左向右递增,最大值为菜单项的总数减一);
第三个参数uFlags指的是(第二个参数所指的菜单项修改后的)新菜单项的状态;
第四个参数uIDNewItem 是指向新菜单的句柄;
第五个参数lpNewItem指的是新菜单的标题。
举例如下:
创建一个带有菜单的新工程,设其MainMenu组件的名字为MainMenu1,其中要移到菜单栏的最右边的那个菜单的名字
为Help1。
在窗体的OnCreate时间的处理程序中加入以下代码
procedure TForm1.FormCreate(Sender: TObject);
begin
ModifyMenu(MainMenu1.Handle,2,
MF_BYPOSITION or MF_HELP,
Help1.Handle,Pchar(Help1.Caption));
//其中:MF_HELP 参数决定菜单项(Help1)在窗口的最右端显示。
end;
然后运行,看看效果如何
-- 2 定制系统菜单
常见的应用程序的主窗体中,利用鼠标左键点击左上角的图标,会弹出一个系统菜单,这个菜单一定程度上给了我们很大方便,
问题是那些都是缺省的系统菜单命令,对于我们来说没有太大的帮助。当然,我们可以自己定制系统菜单,加上我们需要的东西,在Delphi 中,窗体组件并没有提供系统菜单对应的组件,所以定制系统菜单时就有我们自己动手用Windows API函数来实现。Windows API函数中,
常用于对菜单操作的函数有:
AppendMenu 在现有的菜单项尾部插入一个新菜单项;
DeleteMenu 删除菜单中一个现有的菜单项,并清除该项;
RemoveMenu 在现有的菜单项中删除某一项;
InsertMenu 在现有的菜单项中插入一个新项;
ModifyMenu 修改一个现有菜单项;
这些函