东西栏中的主菜单实现自界说快捷键的要领
当前位置:以往代写 > C/C++ 教程 >东西栏中的主菜单实现自界说快捷键的要领
2019-06-13

东西栏中的主菜单实现自界说快捷键的要领

东西栏中的主菜单实现自界说快捷键的要领

副标题#e#

假如做过“把主菜单放到东西栏里”的兄弟们城市发明一个问题:那就是系统会自动给菜单选项加上热键(假如你的菜单选项是英文,那么会在第一个字母下加横线,假如你的菜单选项是中文,那么会在菜单选项的后头加上雷同(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的属性。所以显示出来的菜单城市自动添加速捷字符。”


#p#副标题#e#

然后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来实现这一成果的,其实也是警惕了以前的帖子,然后本身加以完善。

#p#分页标题#e#

我们知道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)就起浸染了!

这样,我们就可以去掉系统自动发生的热键,并且可以本身界说各类符合的快捷键了!

    关键字:

在线提交作业