Delphi有关菜单的几个技巧.doc

上传人:汽*** 文档编号:545289539 上传时间:2023-01-07 格式:DOC 页数:8 大小:35.50KB
返回 下载 相关 举报
Delphi有关菜单的几个技巧.doc_第1页
第1页 / 共8页
Delphi有关菜单的几个技巧.doc_第2页
第2页 / 共8页
Delphi有关菜单的几个技巧.doc_第3页
第3页 / 共8页
Delphi有关菜单的几个技巧.doc_第4页
第4页 / 共8页
Delphi有关菜单的几个技巧.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《Delphi有关菜单的几个技巧.doc》由会员分享,可在线阅读,更多相关《Delphi有关菜单的几个技巧.doc(8页珍藏版)》请在金锄头文库上搜索。

1、Delphi有关菜单的几个技巧万里悲秋常作客,百年多病独登台。博学之,审问之,慎思之,明辨之,笃行之。运筹帷幄之中,决胜千里之外。青,取之于蓝,而青于蓝。月上柳梢头,人约黄昏后。Delphi有关菜单的几个技巧本人在学习使用Delphi中,遇到了一些关于菜单的编程问题,其中一些比较由代表性或比较实用,先把它从笔记中整理出来,与大家分享,请多多指教。 - 1 将菜单项移到菜单栏的最右边 在一些应用程序中,常把一些特殊的菜单项放在菜单栏的最右边(如WPS2000 中的定制界面菜单,一些应用程序的帮助菜单),这些菜单项放在菜单栏(menu bar)的右边比较好。Delphi中虽然没有直接提供把菜单放在

2、菜单栏右边的函数,但是Delphi的Windows单元封装了可以实现这种效果的Windows API函数(ModifyMenu、GetMenuItemInfo)。因此,我们在Delphi中可以直接使这些函数来实现这种效果。 使用ModifyMenu和GetMenuItemInfo都可以将菜单项移到菜单栏的最右边,那么选那个较好呢?据 Windows SDK 文档: ModifyMenu函数可以改变一个已经存在的菜单项的设置,这个函数用于指定一个菜单的标题、显示外观等项目,不过,ModifyMenu函数现在已经被功能更强大的SetMenuItemInfo函数取代。虽然如此,如果你的程序不需要Se

3、tMenuItemInfo函数提供的扩展功能,你仍旧可以继续使用ModifyMenu函数。 ModifyMenu函数支持 Windows 32、9x、NT/2000。 SetMenuItemInfo函数支持 Windows 9x、NT/2000,不支持windows 32(较早版本也不支持NT/2000)。 另外,SetMenuItemInfo函数功能比ModifyMenu函数强大,不过使用函数SetMenuItemInfo需要的参数也比ModifyMenu函数复杂的多。所以这里我依然使用比较简单的ModifyMenu函数来实现。 ModifyMenu函数原型为: BOOL ModifyMen

4、u( 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 指的是要修改的菜单项索引值(菜单栏左边

5、第一个其值为零,从左向右递增,最大值为菜单项的总数减一); 第三个参数uFlags指的是(第二个参数所指的菜单项修改后的)新菜单项的状态; 第四个参数uIDNewItem 是指向新菜单的句柄; 第五个参数lpNewItem指的是新菜单的标题。 举例如下: 创建一个带有菜单的新工程,设其MainMenu组件的名字为MainMenu1,其中要移到菜单栏的最右边的那个菜单的名字为Help1。 在窗体的OnCreate时间的处理程序中加入以下代码 procedure TForm1.FormCreate(Sender: TObject); begin ModifyMenu(MainMenu1.Handl

6、e,2, MF_BYPOSITION or MF_HELP, Help1.Handle,Pchar(Help1.Caption); /其中:MF_HELP 参数决定菜单项(Help1)在窗口的最右端显示。 end; 然后运行,看看效果如何 - 2 定制系统菜单 常见的应用程序的主窗体中,利用鼠标左键点击左上角的图标,会弹出一个系统菜单,这个菜单一定程度上给了我们很大方便,问题是那些都是缺省的系统菜单命令,对于我们来说没有太大的帮助。当然,我们可以自己定制系统菜单,加上我们需要的东西,在Delphi 中,窗体组件并没有提供系统菜单对应的组件,所以定制系统菜单时就有我们自己动手用Windows A

7、PI函数来实现。Windows API函数中,常用于对菜单操作的函数有: AppendMenu 在现有的菜单项尾部插入一个新菜单项; DeleteMenu 删除菜单中一个现有的菜单项,并清除该项; RemoveMenu 在现有的菜单项中删除某一项; InsertMenu 在现有的菜单项中插入一个新项; ModifyMenu 修改一个现有菜单项; 这些函数用法都是类似的上面已经说了ModifyMenu函数的用法,下面仅用AppendMenu函数在系统菜单中添加一个关于菜单来说明,虽然它本身是没有什么意义的,但希望可以起到抛砖引玉的作用。 AppendMenu 函数原型: BOOL AppendM

8、enu( HMENU hMenu, / 要定制的菜单句柄 UINT uFlags, / 怎样定制菜单项 UINT uIDNewItem, / 要定制的菜单项标识或子菜单句柄 LPCTSTR lpNewItem / 要定制的菜单项(字串) ); 在 AppendMenu 函数里,lpNewItem 和 uIDNewItem 参数依赖 uFlags 的不同标志而有所变化。 唯一限制:系统菜单中添加的菜单项的ID值(uIDNewItem)必须小于 $F000(十进制:61440);否则会与Windows系统菜单命令所使用的ID值相冲突。还要记住当为这些新菜单在窗口过程中处理WM_SYSCOMMAND

9、消息时,必须把其它的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 TF

10、orm1.FormCreate(Sender: TObject); var hSysMenu:hMENU; begin hSysMenu:=GetSystemMenu(Handle,False);/得到系统菜单句柄 AppendMenu(hSysMenu,MF_SEPARATOR,0,);/添加一个分隔符 AppendMenu(hSysMenu,MF_STRING,3,关于(&A); end; 在TForm1的类型定义中,添加系统菜单中新建菜单项的OnClick事件的处理过程的声明(即对消息WM_SYSCOMMAND的处理声明): type TForm1 = class(TForm) proc

11、edure 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 P

12、oor-Persons 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_GRA

13、YED 除了有 MF_DISABLED 的作用以外,还把该菜单项变灰 MF_MENUBREAK 把该菜单与现有菜单并排放在一起 MF_MENUBARBREAK 与MF_MENUBREAK 相同,除了在中间放一条竖线外 MF_OWNERDRAW 表明该菜单项为自绘菜单项,还必须处理一切的显示、更新问题 MF_POPUP 该菜单项为一子菜单,uIDNewItem 参数代表其句柄 MF_SEPARATOR 在菜单项画上一分割线 MF_STRING 该菜单项是一文本字串,lpNewItem 是其内容 MF_UNCHECKED 取消该菜单项前面的选中标记 以下几组标志中每组的标志不能同时使用: MF_D

14、ISABLED, MF_ENABLED, and MF_GRAYED MF_BITMAP, MF_STRING, and MF_OWNERDRAW MF_MENUBARBREAK and MF_MENUBREAK MF_CHECKED and MF_UNCHECKED - 3 为菜单动态定义快捷键 其实就是改变菜单的ShortCut属性,在程序中加入一个HotKey组件,然后把其HotKey属性赋给菜单的ShortCut属性即可。如: procedure TForm1.BtnChange1Click(Sender: TObject); begin New1.ShortCut:=Hotkey1.HotKey; end; 如果你只需要程序自行更改有限的几个快捷键而不需要用户自己改变,那么也可以不用HotKey组件,直接把一个TShortCut类型的数值赋给菜单的ShortCut属性即可。如: procedure TForm1.BtnChange1Click(Sender: TObject); begin New1.ShortCut:= 32833;/就是Alt+A end; 一个快捷键

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号