




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、菜单的几个技巧-1将菜单项移到菜单栏的最右边在一些应用程序中,常把一些特殊的菜单项放在菜单栏的最右边(如WPS2000中的"定制界面"菜单,一些应用程序的帮助菜单),这些菜单项放在菜单(menubar)的右边比较好。Delphi中虽然没有直接提供(呵呵,也许是我没找到)把菜单放在菜单栏右边的函数,但是Delphi的Windows单元封装了可以实现这种效果的WindowsAPI函数(ModifyMenu、GetMenuItemInfo)。因此,我们在Delphi中可以直接使这些函数来实现这种效果。使用ModifyMenu和GetMenuItemInfo都可以将
2、菜单项移到菜单栏的最右边,那么选那个较好呢?据WindowsSDK文档:ModifyMenu函数可以改变一个已经存在的菜单项的设置,这个函数用于指定一个菜单的标题、显示外观等项目,不过,ModifyMenu函数现在已经被功能更强大的SetMenuItemInfo函数取代。虽然如此,如果你的程序不需要SetMenuItemInfo函数提供的扩展功能,你仍旧可以继续使用ModifyMenu函数。ModifyMenu函数支持Windows32、9x、NT/2000。SetMenuItemInfo函数支持Windows9x、NT/2000,不支持windows32(较早版本也不支持NT/2000)。另
3、外,SetMenuItemInfo函数功能比ModifyMenu函数强大,不过使用函数SetMenuItemInfo需要的参数也比ModifyMenu函数复杂的多。所以这里我依然使用比较简单的ModifyMenu函数来实现。ModifyMenu函数原型为:BOOLModifyMenu(HMENUhMnu,/handleofmenuUINTuPosition,/menuitemtomodifyUINTuFlags,/menuitemflagsUINTuIDNewItem,/menuitemidentifierorhandleofdrop-downmenuorsubmenuLPCTSTRIpNew
4、Item/menuitemcontent);第一个参数hMENU旨的是要修改的菜单的句柄(如:MainMenu1.Handle);第二个参数uPosition指的是要修改的菜单项索引值(菜单栏左边第一个其值为零,从左向右递增,最大值为菜单项的总数减一);第三个参数uFlags指的是(第二个参数所指的菜单项修改后的)新菜单项的状态;第四个参数uIDNewItem是指向新菜单的句柄;第五个参数lpNewItem指的是新菜单的标题。举例如下:创建一个带有菜单的新工程,设其MainMenu组件的名字为MainMenu1,其中要移到菜单栏的最右边的那个菜单的名字为Help1。在窗体的OnCreate时间
5、的处理程序中加入以下代码procedureTForm1.FormCreate(Sender:TObject);beginModifyMenu(MainMenu1.Handle,2,MF_BYPOSITIONorMF_HELP,Help1.Handle,Pchar(Help1.Caption);其中:MF_HEL常数决定菜单项(Help1)在囱口的最右端显不end;然后运行,看看效果如何-2定制系统菜单WindowsAPI函数来实现。WindowsAPI常见的应用程序的主窗体中,利用鼠标左键点击左上角的图标,会弹出一个系统菜单,这个菜单一定程度上给了我们很大方便,问题是那些都是缺省的系统菜单命令
6、,对于我们来说没有太大的帮助。当然,我们可以自己定制系统菜单,加上我们需要的东西,在Delphi中,窗体组件并没有提供系统菜单对应的组件,所以定制系统菜单时就有我们自己动手用函数中,常用于对菜单操作的函数有:AppendMenu在现有的菜单项尾部插入一个新菜单项;DeleteMenu删除菜单中一个现有的菜单项,并清除该项;RemoveMenu在现有的菜单项中删除某一项;InsertMenu在现有的菜单项中插入一个新项;ModifyMenu修改一个现有菜单项;这些函数用法都是类似的上面已经说了ModifyMenu函数的用法,下面仅用AppendMenu函数在系统菜单中添加一个关于菜单来说明,虽然
7、它本身是没有什么意义的,但希望可以起到抛砖引玉的作用。AppendMenu函数原型:BOOLAppendMenu(HMENUhMenu,要定制的菜单句柄UINTuFlags,/怎样定制菜单项UINTuIDNewItem,/要定制的菜单项标识或子菜单句柄LPCTSTRlpNewItem/要定制的菜单项(字串);在AppendMenu函数里,lpNewItem和uIDNewItem参数依赖uFlags的不同标志而有所变化。唯一限制:系统菜单中添加的菜单项的ID值(uIDNewItem)必须小于肝000(十进制:61440);否则会与Windows系统菜单命令所使用的ID值相冲突。还要记住当为这些新
8、菜单在窗口过程中处理WM_SYSCOMMAND时,必须把其它的WM_SYSCOMMAND发给DefWindowsProc(在Delphi中秩序在事件处理程序最后加入一句Inherited;),否则,嘿嘿,你试试就知道了。首先创建一个新工程,因为要用到Menus单元中的内容,故在文件Unitl.pas的uses语句中加入Menus。usesWindows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,ComCtrls,Menus;然后在窗体Forml的OnCreate事件处理过程加入以下代码:procedur
9、eTForm1.FormCreate(Sender:TObject);varhSysMenu:hMENU;beginhSysMenu:=GetSystemMenu(Handle,False);/得到系统菜单句柄AppendMenu(hSysMenu,MF_SEPARATOR,0,'');/添加一个分隔符AppendMenu(hSysMenu,MF_STRING,3,'关于(&A)');end;onClick事件的处理过在TForml的类型定义中,添加系统菜单中新建菜单项的程的声明(即对消息WM_SYSCOMMAND
10、的处理声明):typeTForml=class(TForm)procedureFormCreate(Sender:TObject);privateprocedureSysMenuCommand(varMsg:TWMMENUSELECT);messageWM_SYSCOMMAND;PrivatedeclarationspublicPublicdeclarationsend;接着按Shift+Ctrl+C完成类声明。在其中填入以下代码:procedureTForm1.SysMenuCommand(varMsg:TWMMENUSELECT);beginifMsg.IDItem=3thenMessag
11、eBox(0,'APoor-Person''sMenuProgram'+#13+'CopyrightSkyey,2000','Skyey',MB_OK+MB_ICONINFORMATION);Inherited;end;编译、运行程序,测试其效果。附:uFlags一些定义值:选译自Delphi5带的WindowsSDK帮助MF_BITMAP旨明该菜单项是一位图,在lpNewItem参数代表位图句柄MF_CHECKE底菜单项的前面放上一个"选中&
12、;quot;标记MF_DISABLEDW蔽该菜单项,但不使它变成灰色MF_ENABLEDt该菜单项有效,与MF_DISABLED相反MF_GRAYE除了有MF_DISABLED的作用以外,还把该菜单项变灰MF_MENUBREAK该菜单与现有菜单并排放在一起MF_MENUBARBREAKMF_MENUBREAK同,除了在中间放一条竖线外MF_OWNERDRAW该菜单项为自绘菜单项,还必须处理一切的显示、更新问题MF_POPU骸菜单项为一子菜单,ulDNewItem参数代表其句柄MF_SEPARATOR菜单项画上一分割线MF_STRING该菜单项是一文本字串,lpNewItem是其内容MF_UNC
13、HECKED消该菜单项前面的"选中"标记以下几组标志中每组的标志不能同时使用:<1>MF_DISABLED,MF_ENABLED,andMF_GRAYED<2>MF_BITMAP,MF_STRING,andMF_OWNERDRAW<3>MF_MENUBARBREAKandMF_MENUBREAK<4>MF_CHECKEDandMF_UNCHECKED-3为菜单动态定义快捷键其实就是改变菜单的ShortCut属性,在程序中加入一个HotKey组件,然
14、后把其HotKey属性赋给菜单的ShortCut属性即可。如:procedureTForm1.BtnChange1Click(Sender:TObject);beginNew1.ShortCut:=Hotkey1.HotKey;end;如果你只需要程序自行更改有限的几个快捷键而不需要用户自己改变,那么也可以不用HotKey组件,直接把一个TShortCut类型的数值赋给菜单的ShortCut属性即可。如:procedureTForm1.BtnChange1Click(Sender:TObject);beginNew1.ShortCut:=32833;/就是Alt+Aend;一个快捷键的值可以按
15、下面的方法在设计时得到:先在设计时改变菜单的ShortCut属性的为你需要的快捷键,然后在窗体上->右键->ViewasText,在DFM文件中找到那个组件,那个ShortCut后面的就是。如:需要Ctrl+Alt+NobjectNew1:TMenuItemCaption='&New'ShortCut=49230/就是这个onClick=New1Clickend-4动态改变菜单就是改变菜单项的Enabled属性和Visible属性。这两个属性既可以在设计时改变,也可以在运行时改变。如果将Enabled属性设置为Fals
16、e,则菜单项呈灰色状态,不可用;如果设置为True,则菜单项处于正常能用的状态。如果将Visible属性设置为False,则该菜单项在运行时不显示;如果设置为True,则该菜单项显示。菜单项现在可以使用菜单项现在不显示如:New1.Enabled:=False;/New菜单项变成灰色,菜单现在不可用New1.Enabled:=True;/NewNew1.Visible:=False/NewNew1.Visible:=True;/New菜单项现在显示唯一需要注意的是:Visible和Enabled属性时两个互相独立的属性,二者互不干扰,如果一个菜单拥有一个快捷键且其Enabled属性为True,
17、即使其Visible属性为False(即运行时不可见),仍可以用快捷键来访问。在程序运行期间,修改菜单项的这两个属性,即可以动态地改变菜单显示。-5获取用户错误按键信息如果用户按Alt和一个与菜单项不匹配的字符时,或者当显示弹出式菜单而用户按下一个与弹出式菜单里的项不匹配的字符键时。我们怎么知道用户按错了键,又怎么知道用户按了那个键呢?事实上,当发生上面假设的情况时,Windows会发出一个WM_MENUCHAR,通常我们不需要处理这个消息,Windows程序通常会把它传给DefWindowProc,它一般给Windows返回0,即使Windows发出一个短的蜂鸣声。如果我们需要处理上面假设的
18、情况时,只要拦截这个消息就可以了。让我们先了解一下这个消息的参数:WM_MENUCHARLOWORD(wParam);即用户按键的ASCII码HIWORD(wParam);/选择码lParam;/菜单句柄选择码含义:0:不显示弹出菜单;MF_POPUP显示下拉菜单、子菜单、快捷菜单(弹出式菜单)MF_SYSMENU显示系统弹出式菜单消息返回值:0:通知Windows丢弃用户按的这个字符并发出一个短的蜂鸣声;1:通知Windows应该关闭当前活动菜单;Windows决2:通知Windows返回一个相对于菜单项的零基点的低位字,它由了解这一点后,让我们具体做一下:创建一个带有菜单的新工程,在窗体上放一个Mem曲件(Name:Memo1在窗体的公有变量后加入消
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 3.2 有限的耕地资源教学设计-2025-2026学年初中地理晋教版八年级上册-晋教版2012
- 装饰艺术设计专业毕业实习报告范文
- 薪酬内部核算管理办法
- 电工断路器新手知识培训课件
- 设备管理中心管理办法
- 财务电子证书管理办法
- 数学课程标准助力跨学科教学的心得体会
- 购物中心公寓管理办法
- 做推销的合同协议书模板
- 公寓房首付购房合同范本
- 兽药生产经营使用管理
- 护理安全警示:跌倒与坠床
- 2025年全家岗前培训考试题及答案
- 2025教育方针解读
- 教师职业道德与专业发展知到智慧树章节测试课后答案2024年秋鲁东大学
- 多尺度有限元分析-深度研究
- 骨科用药课件
- 知识产权管理评审报告
- 医院员工手册培训
- 尿毒症伴心梗个案护理
- 《发热护理》课件
评论
0/150
提交评论