手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

工具栏中的主菜单实现自定义快捷键的方法

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
singler(原创)

假如做过“把主菜单放到工具栏里”的兄弟们都会发现一个问题:那就是系统会自动给菜单选项加上热键(假如您的菜单选项是英文,那么会在第一个字母下加横线,假如您的菜单选项是中文,那么会在菜单选项的后面加上类似(Y)、(Z)的快捷键),而使您自己定义的快捷键失效!(注:我后来发现,假如自己加的是类似(H)的快捷键时,就不会出现这样的问题。而只有当我们加的是类似Ctrl A,F1,Ctrl Alt D等的快捷键时才会出现问题;另外当为TMainMenu配置了Images属性后,也就是说给菜单项加了图片,英文菜单的问题会消失,但中文菜单的问题依然存在。这其中的原因,我也搞不清楚)。即使我们配置mainMenu的AutoHotkeys=maManual也解决不了。

当初我在碰到这个问题后,一筹莫展,只好向高手们请教。后来在BCB_FANS和JSP两位老大的帮助下,才解决问题。因此,这篇文章实际上是整理的两位老大的方法。

首先,让我们去掉系统自动加的热键。

当我们把菜单放到工具栏里后,我们在程式运行时看到的菜单其实不是我们在设计时加的TMainMenu,而是系统临时new的一个TPopupMenu,而这个临时的菜单的AutoHotkeys属性默认为maAutomatic,所以就会给菜单自动加上热键。这个问题是BCB_FANS发现的(我不可能有这么厉害,呵呵),他的原话是这样的:

“实际上显示菜单的时候,TToolBar并不是使用原来已设计好的菜单了,而是重新建立一个临时的TPopupMenu,并把原来的那个菜单的菜单项添加到这个TPopupMenu当中,最后才显示这个临时的TPopupMenu。这个TPopupMenu的AutoHotkeys为maAutomatical,并且没有任何方式能够控制这个临时的TPopupMenu的属性。所以显示出来的菜单都会自动添加快捷字符。”

然后BCB_FANS就自己做了一个TMenuBar,专门用来制作工具栏里的菜单(我现在用的就是他)。他在TMenuBar中的实现方法是用自己的TPopupMenu替换系统new的TPopupMenu,配置自己的TPopupMenu的AutoHotkeys=maManual:

“既然没有办法控制那个临时的TPopupMenu,自然而然就会想到使用自己的TPopupMenu去替换那个临时的TPopupMenu,OK,这个好办,只要配置TToolButton的DropdownMenu属,而不是配置MenuItem属性就能够了。然后再配置自己的TPopupMenu的AutoHotkeys为maManual,这样就没有快捷字符了。”

当然,并不是每个人都象我这样幸运,能得到BCB_FANS老大TMenuBar的,呵呵。所以我昨天就在TR老大的“不可能解决的问题”帖子里问了这个问题,结果让JSP老大把我认为“不可能解决的问题”给解决了!

JSP老大的实现方法和其实和BCB_FANS的是相同的,也是用自己的TPopupMenu替换系统的临时菜单。只是BCB_FANS老大的TMenuBar封装了TToolBar,并且能自动产生ToolButton来和菜单项关联,而无需我们手动配置;而JSP的代码只是完成去掉自动产生的快捷键而写的,其他工作还得我们自己做。

JSP老大的代码如下(注释是我自己加的):

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
TMenuItem* Item;
TMenuItem* Item1;
TPopupMenu* Menu;
for(int n=0; n<ToolBar1->ButtonCount; n )
{
TToolButton* Btn = ToolBar1->Buttons[n];
if(Btn->DropdownMenu != NULL)
Btn->MenuItem = NULL; //去掉系统产生的快捷菜单
else if(Btn->MenuItem != NULL)
{
Item = Btn->MenuItem;
Menu = new TPopupMenu(this);
Menu->AutoHotkeys = maManual; //不自动产生热键
Btn->DropdownMenu = Menu; //给ToolButton添加自己new的菜单
if (Item->GetParentMenu()) //配置该快捷菜单的配置和TMainMenu相同
{
Menu->BiDiMode = Item->GetParentMenu()->BiDiMode;
Menu->Images = Item->GetParentMenu()->Images;
}
Menu->HelpContext = Item->HelpContext;
Menu->TrackButton = tbLeftButton;
for(int i=Item->Count-1; i>=0; i--) //把菜单选项添加到自己new的TPopupMenu里
{
Item1 = Item->Items[i];
Item->Delete(i);
Menu->Items->Insert(0, Item1);
}
}
}
}

有了JSP老大的这段代码后,就能够去掉那些讨厌的快捷键了(实际上是替换了菜单,当然快捷键也就没有了)。但是现在问题还自解决了一半,也就是还只去掉了自动产生的快捷键,而我们自己配置的快捷键还没有起作用!我要说明白的是,这时并不是任何我们配置的快捷键都不起作用,类似(N)这种括弧里的和字母下加横线的快捷键还是好用的。只有类似Ctrl a,Ctrl Alt Z和F1这些类型的快捷键不起作用。为什么会这样?我很难找到原因。

那我们下面就想办法让自己的快捷键起作用!我是通过使用TActionList来实现这一功能的,其实也是借鉴了以前的帖子,然后自己加以完善。

我们知道TActionList能够定义许多Actions(方法:设计时双击TActionList控件,出现配置对话框后,就能够自己定义Actions了),而每个Actions都能够使用快捷键来触发他们的OnExecute事件。说到这里我想大家应该明白怎么做了。假如我们把某个Actions的快捷键和某个菜单选项的快捷键配置为相同,例如把菜单项“Redo”和一Actions的快捷键都配置为Ctrl R。然后再在该Actions的OnExecute事件触发“Redo”菜单项的OnClick事件(也就是在Actions的OnExecute事件里加入代码:RedoMenu->Click();//RedoMenu为“Redo”菜单选项的名称),那么当我们按下Ctrl R时,就会触发“Redo”的OnClick事件了,这样看起来,我们给菜单配置的快捷键(Ctrl R)就起作用了!

这样,我们就能够去掉系统自动产生的热键,而且能够自己定义各种合适的快捷键了!




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS