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

限时码!20+流AI编程工具免费用 购周边赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

    

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

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

BCB鼠标钩子Hook技术实现指南 Windows操作系统中的钩子(Hook)机制是系统提供的一种用于监视系统或应用程序中的各种事件消息,以便进行拦截和处理的机制。它常被用于实现如键盘输入记录、鼠标动作捕捉等底层系统功能。钩子本质上是一个处理系统消息的回调函数,它可以设置在系统的消息处理链中的特定点,当系统传递消息到这个点时,钩子程序可以先于目标窗口接收到消息,并进行相应的处理。为了便于理解,可以把Windows钩子机制类比于现实生活中的钓鱼钩子。 阅读详情

相关推荐

编程实现图形绘制项目:BCB6 Drawing

本文还有配套的精品资源,点击获取 简介:本项目介绍了一个名为"Drawing"的编程项目,其核心是使用算法在计算机上创建图形。涉及的教学、可视化或设计工具允许用户通过编程方式生成图形。若项目与BCB6相关,则可能是用C++和BCB6的图形库或API实现。介绍可能用到的图形库包括GDI、Direct2D和OpenGL,分析源代码文件来理解图形绘制的算法实现和交互逻辑。 ...

weixin_30674431的博客 1871

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

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

BCB弹弹堂计算工具详解:提升游戏命中率的辅助软件

弹弹堂游戏辅助工具是一个专为《弹弹堂》游戏设计的实用软件,它帮助玩家快速掌握游戏中的弹道计算、策略制定,以及提高射击命中率。为了不违反游戏公平性,该工具不提供任何破坏游戏平衡的功能,而是通过科学分析和算法辅助,让玩家能够通过学习和实践,提升自己的游戏技巧。本工具的核心功能涵盖了弹道模拟、角度计算、风向调整和游戏策略建议等,其设计初衷是作为玩家学习和研究游戏机制的辅助工具,帮助玩家通过实际操作和策略运用,达到提升个人游戏技能的目的。

weixin_28850145的博客 1821

C++Builder函数一览

C++Builder函数一览 包含BCB绝大多数函数,并付有功能注释

BCB中的TButton

BCB拥有强大的组件功能, 在本文中, 我们先来学习看看最简单的按钮: //--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit1.h" //------------------------------------

认知 行动 坚持 8776

C++ Builder 初学问与答 (十)

10.菜单组件77)问:菜单是Windows常用的用户界面。对于一个能够实际应用的程序,菜单是必不可少的组成部分。C++Builder中是怎样实现菜单的? 答:C++Builder为我们提供了两种菜单组件:一种是菜单组件MainMenu;另一种是弹出菜单PopMenu组件。菜单组件的作用是在窗体上生成菜单条。菜单组件刚放到窗体上时,菜单是不可见的,当双击它打开菜单编辑器并且增

ch_builder的专栏 1855

BCB界面布局之控件调整、排列

BCB界面布局之控件调整、排列     1、在对任何一个控件做进一步的调整操作之前需要将其选中,单击该控件此时控件的四周将出现一个虚拟的边框,边框由上、下、左、右、左上、左下、右上、右下位置上的八个黑色控制点组成。将鼠标按住边框内的一点并拖动即可在保持元件大小情况下改变元件的位置。而当鼠标按住边框上的控制点并拖动时可以使得元件的大小发生相应的变化。除了选中单个元件CBuilder IDE还允许我

2970

C++ Builder初学问与答

一直以来都想写一点为BCB初学者快速入门的东西,前不久写了几篇《闲谈BCB》想把自己学习BCB中如何来解决难点的方法说给大家,没想到被骂得不成样子。本想不写了,但觉得这些东西留下来能做什么呢?还是用另一种方法来重新演译我的思维吧,最近有些忙,那几篇没有写完的文章,我也会尽快写完的,至于《深入QR》,我想我一定会用另一种手法来写,让你一看就会把QR这个娇女的所有衣服都脱光,不整理到这个地步,我是

左超 7265

BCB和Delphi 执行顺序与快捷键

BCB和Delphi中Form的事件触发顺序 实现一项功能通常要做两件事:a)首先要知道在哪控制;b)其次要知道如何控制。然而,很多情况下都是我们已经知道怎么去控制,但不知道控制点选在哪。这要是因为我们对组件事件的触发顺序搞不清楚。 构造函数->OnCreate->OnShow->OnActivate->OnPaint->OnCloseQuery->...

huang714的专栏 670

快速使用 C++ Builder IDE 心得

人比较懒,做事的时候总喜欢找点捷径。用 BCB 也有一段时间了,总结出来一些使用 IDE 的捷径,希望给用 BCB 的朋友们带来一点方便。这些看似很简单的的技巧,使用好了确能给你的编程工作提高不少效率,但确很少有人注意到。 一、使用快捷键  不是讲 BCB 快捷键大全,这只说说我平常经常使用的一些,应当被注意的。这些快捷键都是在使用过程中慢慢记住的,没有必要专门去背。  File:    S

shadowstar's blog 4225

BCB编写OCX组件过程

OCX开发――开始编 WRITER:WWIINNGD 现在利用OCX的程序真不少,在线杀毒、一些IM程序也有用,年头也爆出不少OCX控制漏洞,我也来混一下,学习如何写一个OCX。本文以BCB6.0中文版为例子。 1. OCX的编写 打开BCB6.0 单击菜单上的“新建”图标 弹出一个“新建项目”的窗口,选择“ActiveX”页面,再选择“ActiveX Library”,这样就会自动插入Activ

fflyn的专栏 3945

深入VCL 理解BCB的消息机制(三)

New Page 1<!--font { font-family: Arial; line-height: 140%;font-size:14; margin-top: 1; margin-bottom: 1 }body { font-family: font }-->

没吃过猪肉,光看见猪跑啦.................... 4715

深入 BCB理解 VCL的消息机制

深入 BCB理解 VCL的消息机制Tommy nag_amigo@yahoo.com.cn> TApplication、TScreen和TForm 构成了所有BCB风格的 Win32 GUI程序的脊梁,他们控制 着您程序的行为。TApplication类提供的属性和方法封装了标准Windows程序的行为。 TApplication表现了在Windows操作系统中创建、运行、支持和销毁应用程序的

910

BCB的一些技巧

1. C++ Builder网上资源 C++ Builder研究 http://www.ccrun.com/ C++ Builder程序员 http://mybcb.diy.myrice.com/ 电脑学习C++ Builder版块 http://www.itcomputer.com.cn/Programs/C/CB/ c++ Builder快捷键大全: http://www.itco...

AModestBoy的博客 1538

BCB6.0下编译的EXE文件,没有找到VCL60.BPL

问题: BCB6.0下编译的EXE文件,不能在其他机器上运行(只有装了C++BUILDER的机器才能执行)其提示为:没有找到vcl60.bpl. 解决方法: 打开工程选项(Ctrl + Shift + F11) 1.在c...

cuiweigk19423的博客 716

BCB:内存泄漏检查工具CodeGuard

一、为什么写这篇东西   自己在使用BCB5写一些程序时需要检查很多东西,例如内存泄漏、资源是否有释放等等,在使用了很多工具后,发觉BCB5本身自带的工具―CodeGuard,非常不错,使用也挺方便的,但是摸索了很久(以及翻查了一些资料,包括HELP)才算是会用了。写这篇文章的目的希望有这方面的问题的朋友可以借鉴一下,大家互相学习,共同进步。以下这篇文章算是拼凑出来的一篇文章,一些资料...

dixiongbi7761的博客 425

BCB中嵌入资源文件的研究

资源文件是一个以.rc结尾的文本文件,RC是资源脚本(Resource   Script)的意思,它的格式很简单,每行一个资源,按如下格式定义:   资源标识符   资源类型   资源的路径     RC文件用来描述各种系统资源,包括:     ACCELERATORS   菜单快捷键       BITMAP   位图       CURSOR   光标       DIAL

ribut9225的专栏 3232

BCB6实战指南:从环境搭建到项目开发,维护遗留系统的必备技能

在软件开发领域,维护和升级遗留系统是一项常见且重要的任务,尤其在一些工业控制、医疗设备等特定行业。理解经典开发工具的原理与应用,对于处理历史代码和系统至关重要。可视化组件库(VCL)作为快速应用开发(RAD)的核心框架,通过组件化的设计思想,将界面元素封装为可复用的对象,极大地提升了桌面应用的开发效率。其基于事件驱动的编程模型,允许开发者通过属性、方法和事件来构建交互逻辑,这种模式至今仍在许多GUI框架中有所体现。掌握这些基础技术概念,不仅能应对现有的维护需求,也能深对现代框架设计原理的理解。本文以Bor

weixin_30644369的博客 327
下一篇: 位图文件(BMP)格式分析以及程序实现
yyfzy
博客等级 码龄24年 211粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值