分享
 
 
 

在BCB中把主菜单放到工具栏里后,实现自定义快捷键的方法

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

如果做过“把主菜单放到工具栏里”的兄弟们都会发现一个问题:那就是系统会自动给菜单选项加上热键(如果你的菜单选项是英文,那么会在第一个字母下加横线,如果你的菜单选项是中文,那么会在菜单选项的后面加上类似(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,并把原来的那个菜单的菜单项添加到这个RpopupMenu当中,最后才显示这个临时的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)就起作用了!

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有