BCB非可视组件的消息处理技巧

基于BCB的实时表盘显示系统设计与实现 在现代工业监控、仪表盘展示等场景中,表盘控件因其直观的视觉呈现方式,成为用户界面中不可或缺的元素。Borland C++ Builder(简称BCB)作为一款强大的可视化开发工具,其丰富的图形库和控件继承机制,为自定义表盘控件的开发提供了坚实的基础。本章将围绕表盘控件的设计与实现展开深入探讨,重点介绍其组成结构、功能接口、图形绘制机制以及控件的测试与集成方式。通过本章内容,读者将掌握如何在BCB环境中创建高度可定制的表盘控件,并实现其动态刷新与交互功能。 阅读详情

CB非可视组件的消息处理技巧
            

  一个非可视的组件必须对Windows操作系统或用户定义的消息作出响应。然而,由于一个非可视组件没有窗口,因此它也没有窗口句柄,自然它也不能接收到消息,为了解决这一问题,我们的思路是创建一个隐藏的窗口,使非可视组件能够接收到消息。

  为了给你的非可视组件创建一个隐藏的窗口,需要有以下:

  1.一个私有变量型(Private Variable)的HWnd来取得窗口句柄。

  2.一个用来捕捉窗口发送给组件的函数(a WndProc)。

  3.对AllcolateHwnd的调用使之创建窗口句柄并设置WndProc。

  为了清楚的解释上述思路和展示创建过程,下面我们将以一个具体的实例来说明。
  首先我们先创建一个新的组件,在C++Builder中,选择FILE|NEW...双击组件图标显示一个新的组件对话框改变Ancestor Type为Tcomponent和Class name为TTest并设置完毕。
  然后,切换到新组件的头文件,在类的私有部分(private section)加入以下声明:

  HWnd FHandle;
  void―fastcall WndProc(TMessage& Msg);

  第一行声明了一个调用Fhandle的HWnd变量,这个变量将用于窗口创建后捕获窗口句柄。第二行声明了一个用于接收消息的WndProc函数。这个函数的声明必须加以标识,以便限定它是一个WndProc,然后在类声明Public(公有)部分构造以下声明:

  Viod DoIt( );

  这个公有函数将被我们用来测试组件,类声明应如下:

  class PACKAGE TTest : public

TComponent
  {
   private:

   HWnd FHandle;
   void―fastcall WndProc(TMessage& Msg);

   protected:

   public:

    ―fastcall TTest(TComponent* Owner);

    void DoIt( );

   ―published:

  };

  现在切换到组件的代码单元,将下面一行加入到单元的顶部(在函数上也许是不错的地方)

  #define MY_Message.WM_USER+1

  这一行声明了一个在DoIt函数被调用时,组件将发送给它自己的用户自定义消息。此时我们必须为组件分配一个窗口句柄。这个句柄将提供一个隐藏的窗口使我们可以捕捉组件中的消息。找到组件构造代码,加入下面代码:

  ―fastcall Test::Test(TComponent* Owner): TComponent(Owner)
  {
  FHandle=AllocateHWnd(WndProc);
  }

  好,重要的一步已完成,AllocateHWnd函数创建了一个隐藏窗口并且返回它的句柄,注意这里我们为了使Windows知道哪里发来了消息,传递WndProc的地址;

  现在我们来创建WndProc的函数部分。在源文件中加入:

  void―fastcall TTest::WndProc(TMessage& Msg)
  {
   if (Msg.Msg == MY_MESSAGE)
  MessageBox(0, ″Got here!″, ″Message″, 0);
   try {
   Dispatch(&Msg);
   }
   catch (...) {

   Application-〉HandleException(this);

   }

  }

  无论何时Windows发送消息给组件,Windows都会调用这个函数。这部分代码完成了两件事。首先,它检查被接收的消息是否是我们用户自定义的消息。如果是,一个消息框将被显示,你可以看到实际上我们接收到的消息。其次,这段代码传送了系统(或VCL)处理过程中的消息,try/catch块用来保证,如果异常出现,它将成为缺省风格下的句柄。

  概括地说,WndProc函数在为缺省句柄传递所有其他消息,监控了所有客户消息。现在我们创建DoIt函数,完成我们的组件,加入我们创建DoIt函数,完成我们的组件,加入代码:

  void TTest::DoIt()

  {

  PostMessage(FHandle, MY_MESSAGE, 0, 0);

  }

  这个函数发送一个消息组件的窗口句柄(记住,这个窗口句柄是以前存入到Fhandle数据成品中的)。现在我们已经完成了创建组件选择,用SelectFile|ColseAll来保存我们的工作测试组件。

  下一步将测试组件。如果你使用BCB3,那么你必须把组件加入到“包”(Packege)中,然后用Componet|install(可以使用DCLSTD35 Packege来快速测试)。再选择你刚存的TestBCB.Cpp,一旦你安装完成组件后,它将出现在组件板上。双击按钮,为按钮的OnClick事件创建以下代码:

   Test1-〉 DoIt( );

  现在运行程序,当你点击按钮时,将看到一个消息框显示“Got here".

  ListingA和B包含了头文件和源代码以下列出。

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

相关推荐

TComm串口类

自编的一个BCB的串口类,使用超级简单,当然功能也超级简单,支持10以上的串口,只支持全双工。不过对于大多数的使用情况来说是足够了。编这个的目的是由于自己下载的串口控件基本上都实现了太多的功能,弄得代码很复杂,不容易分析,本着能用就够和简单最美的原则,同时也为了学习串口编程,自己编了一个串口类。自己在几个程序中用着还挺好的。<br><br> 该串口类就两个.cpp文件和他们的头文件 (TComm.cpp,TCommThread.cpp),使用超级简单<br>#include "TComm.h"<br>TComm Comm=new TComm(this); //生成串口类<br>if(Comm) Comm->fCommReceived=&ReceiveFunc; //你的接收处理函数<br><br>Comm->Open(1); //打开你要用的串口,可以填数字,也可以填“com1"等名称,建议填数字,可以支持超过10的数字<br>Comm->SetComm( 波特率,字长,校验位,停止位 );//校样位0为无,1为奇,2为偶<br>//好了,可以发数了<br>Comm->SendData(data,leng);<br><br>当收到数的时候会调用你的接收处理函数,比如<br>ReceiveFunc(TComm *Comm){<br> char buf[256];<br> int len;<br> if((len=Comm->GetReceivedCount())!=0){<br> len=Comm->ReadComm(buf,len);<br> }<br>}<br>最后使用完后记得关串口喔<br> Comm->Close();<br>上传的文件是一个包含有测试例子的项目,很简单的,看一看就明白了。

C++BUILDER非可视组件的消息处理技巧

 C++BUILDER非可视组件的消息处理技巧  一个非可视的组件必须对Windows操作系统或用户定义的消息作出响应。然而,由于一个非可视组件没有窗口,因此它也没有窗口句柄,自然它也不能接收到消息,为了解决这一问题,我们的思路是创建一个隐藏的窗口,使非可视组件能够接收到消息。   为了给你的非可视组件创建一个隐藏的窗口,需要有以下:   1.一个私有变量型(Private Var

luhongjun的专栏 1145

Unity游戏开发:从零开始适配Nintendo Switch的完整指南

本文详细介绍了如何使用Unity进行Nintendo Switch游戏开发的完整流程,包括开发环境搭建、Unity工程适配、手柄与硬件特性开发、存储与性能优化等关键步骤。特别强调了Switch SDK的配置、输入系统改造和内存优化技巧,帮助开发者高效完成跨平台适配。

vodka的博客 1069

C#让窗体在启动时直接隐藏

最完美的解决办法,不闪烁。思路为:首先将窗体透明度设置为0,这样窗体在启动时就不显示了,然后再调用Hide将窗体隐藏再将其透明度设置为1即可。 其实就设置2个地方就行了。 1:设置窗体透明度为0 2:在load事件里使用委托调用Hide //注意,这里很重要,使用BeginInvoke调用里面的代码将会在Load执行完毕后调用否则没办法实现因为Load的时候窗体还不显示,当然你可以用...

simpleshao的博客 2130

第7篇-SAP MM模块-JIT应用实战解析,从计划协议到JIT供应的关键配置与流程

本文深入解析SAP MM模块中的JIT(Just In Time)供应模式,从计划协议到JIT供应的关键配置与流程。通过动态计划行管理、需求聚合与分解等核心功能,实现精确数量、时间和地点的物料供应。文章详细介绍了主数据准备、计划协议配置、MRP参数精调及EDI集成方案,并提供了实施中的典型问题与解决方案,助力企业优化供应链管理。

weixin_30363509的博客 948

手把手复现论文:SVPWM过调制I区与II区算法仿真(附MATLAB源码)

本文详细介绍了SVPWM过调制I区与II区算法的MATLAB仿真实现,从理论推导到Simulink建模逐步解析。通过源码示例展示幅值补偿和六边形跟踪等关键技术,帮助电力电子研究者掌握过调制算法的核心实现方法,适用于电机控制、变频器等工业应用场景。

weixin_28739079的博客 530

[delphi] 让AllocateHwnd接受一般函数地址作参数

Classes单元的AllocateHWnd函数是需要传入一个处理消息的类的方法的作为参数的,原型: Delphi(Pascal) code function AllocateHWnd(Method: TWndMethod): HWND; 很多时候,我们想要创建一个窗口,而又不想因为这个参数而创建一个类,怎么办? 换句话说,就是能不能使传入的参数是个普通的函数而不是类的方法呢

s11ss的专栏 2082

0009 用VisualStudio设计Max工具

这次分享个独家专利^)^:在Visual Studio中设计3dsMax脚本工具界面。 某次做原型设计时,需求改来改去,实在懒得搞GUI;虽然也尝试在Axure RP里画原型,但还是Visual Studio更顺手,也更容易测试一些交互,就直接在VS里做了。后来突发奇想,想实验一把能否直接用到Max里去,结果没想到成功了,效果还挺好。发现了新大陆,记录一下。   开始: 在VS里新建W...

whwst的专栏 769

使对象可以接收消息

在delphi中,有时候我们希望对象可以接收windows消息,怎么办呢?因为要接收windows消息起码要有windows Handle,难道要建立的一个可见窗口?那样似乎太差强人意了。delphi提供了一个函数Classes.AllocateHWnd。分析AllocateHWND发现delphi CreateWindowEx一个尺寸为0的窗口,窗口是生成了,Handle也有了,但窗口的消息要处

沧海一粟 1680

SAP中贸易伙伴的应用原理简析

公司也称为贸易伙伴,是出具合并报表的组织单位,可以为客户和供应商分配公司(贸易伙伴),用于识别集团内关闻公司间的业务往来,在编制合并报表时进行往来账务的计算处理。 如下图某贸易伙伴公司(关联方名称G0059)在我方公司的SAP系统中有多重身份(即是供应商,又是客户)。那么在我方公司SAP系统中建立起公司(贸易伙伴),并关联到供应商和客户主数据中。之后,就可以通过G0059这个贸易伙伴名称来识别与该贸易伙伴间的往来业务。 相应的配置设定如下: 定义公司(贸易伙伴或关联方) 会计凭证中会

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 9817

【Seurat绘图进阶】从参数调优到美学定制:解锁DimPlot与FeaturePlot的隐藏技巧

本文深入探讨了Seurat包中DimPlot与FeaturePlot的进阶使用技巧,旨在解决单细胞数据可视化中的常见痛点。通过参数调优(如order、shuffle、raster)、颜色美学定制(使用RColorBrewer、viridis配色)以及性能优化(栅格化处理),并结合scCustomize包与patchwork排版,帮助用户将基础图表提升为信息清晰、可直接用于论文发表的出版级可视化结果。

lake5的博客 629

让自己写的Delphi控件具备接收windows消息的能力

原理:该效果的实现主要是使用AllocateHwnd函数(可以查阅Delphi的帮助)生成一个非可视的窗口来响应消息,该函数的返回值既是非可视窗口的句柄。然后就可以在你的类中响应Windows的消息了。该函数只有一个参数就是要创建的非可视窗口的WinProc函数(就是处理该窗口消息的函数),当然你也可以在这个函数中处理你要处理的消息了。最后在类销毁时一定要DeallocateHWnd这个非可视窗口

kim的专栏 3642

esp8266步进电机驱动控制

blinker控制步进电机起保停,正反转(Arduino uno+esp8266+TB6600驱动器) Arduino uno的板子的程序 esp8266板子接入到Arduino uno的控制引脚上的5,6,7 esp8266程序 //****库***** #define BLINKER_WIFI //官方wifi协议库 #define BLINKER_PRINT Serial //串口协议库 #include <Blinker.h&gt

perseverance51博客 2855

[收]CB非可视组件的消息处理技巧

CB非可视组件的消息处理技巧出处:C++builder资源中心一个非可视的组件必须对Windows操作系统或用户定义的消息作出响应。然而,由于一个非可视组件没有窗口,因此它也没有窗口句柄,自然它也不能接收到消息,为了解决这一问题,我们的思路是创建一个隐藏的窗口,使非可视组件能够接收到消息。   为了给你的非可视组件创建一个隐藏的窗口,需要有以下:   1.一个私有变量型(Private

745

vue2/3 - [超详细] 实现企业微信扫码登录完整流程及代码,vue项目接入企业微信扫码登录功能教程,支持新跳页显示二维码或div容器里内嵌登录二维码(详细代码注释,一键复制开箱即用)

vue企业微信扫码登录,vue网页网站企业微信扫码登录教程,vue如何实现企业微信扫码登录功能,vue详细企业微信扫码登录功能实现,vue2实现企业微信扫码登录,前端vue企业微信扫码登录教程,vue pc电脑端企业微信扫码登录详细教程,vue项目中怎么做企业微信扫码注册登录,vue实现网站接入企业微信扫码登录,vue2做企业微信扫码登录的优质文章教程,vue网站对接企业微信扫码登录,vue企业微信扫码登录如何新开一页全屏显示登录二维码,vue企业微信登录二维码 内嵌在div容器里/跳页显示登录二维码,vu

✅ 精选推荐文章 5702

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

[C++] BC++ Builder 非可视组件的消息处理技巧

 Borland C++ Builder 非可视组件的消息处理技巧              一个非可视的组件必须对Windows操作系统或用户定义的消息作出响应。然而,由于一个非可视组件没有窗口,因此它也没有窗口句柄,自然它也不能接收到消息,为了解决这一问题,我们的思路是创建一个隐藏的窗口,使非可视组件能够接收到消息。   为了给你的非可视组件创建一个隐藏的窗口,需要有以下:  

shine的现在进行时 834

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C++BUILDER非可视组件的消息处理

 一个非可视的组件必须对Windows操作系统或用户定义的消息作出响应。然而,由于一个非可视组件没有窗口,因此它也没有窗口句柄,自然它也不能接收到消息,为了解决这一问题,我们的思路是创建一个隐藏的窗口,使非可视组件能够接收到消息。   为了给你的非可视组件创建一个隐藏的窗口,需要有以下:    1.一个私有变量型(Private Variable)的HWnd来取得窗口句柄。    2.一个用来捕捉

weixu_2008的专栏 828

C++Builder非可视组件的消息处理技巧

一个非可视的组件必须对Windows操作系统或用户定义的消息作出响应。然而,由于一个非可视组件没有窗口,因此它也没有窗口句柄,自然它也不能接收到消息,为了解决这一问题,我们的思路是创建一个隐藏的窗口,使非可视组件能够接收到消息。  为了给你的非可视组件创建一个隐藏的窗口,需要有以下:  1.一个私有变量型(Private Variable)的HWnd来取得窗口句柄。  2.一个用来捕捉窗口发送给组

xjq2003的专栏 698

深入VCL 理解BCB的消息机制

<!--write_title("深入VCL 理解BCB的消息机制 ");//-->

心情之旅 1582

C++ Builder高手进阶 (三)用BCB设计DBTreeView组件(小结)

 用BCB设计DBTreeView组件小结续二的最后一个函数,你是不是感到很纳闷:这个函数到底是用来干什么的呢?下面听我慢慢道来:我使用这个函数主要是用来实现定制属性编辑器。细心的读者一定还记得,我设计的控件中有三个关键的数据成员:ParentID,PrimaryIDField,DisplayField,这三个成员的函义是什么?相信不用我多说。为了使它们的设置更人性化,我选择了用下拉框的方

开心果的专栏 2083

深入VCL理解BCB的消息机制2

深入VCL理解BCB的消息机制2 2012-12-25 19:54未知admin . 关键字:   重载TControl的WndProc方法   还是先谈谈VCL的继承策略。VCL中的继承链的顶部是TObject基类。一切的VCL组件和对象都继承自TObject。   打开BCB帮助查看TControl的继承关系:   TObject->TPersistent->TComponent

ksrsoft的专栏 1476

60个BCB(C++Build)初学者 应用实例

1.怎样在C++Builder中创建使用DLL 2.用C++Bulider在WIN.INI中保存信息 3.如何在C++Builder中检测硬件 4.C++Builder如何响应消息及自定义消息 5.利用C++ Builder开发动画DLL 6.用C++ Builder 3制作屏幕保护程序 7.TCP/IP头格式 8.UDP 9.判断windows的Desktop及其它目录 10用

qq_31209383的博客 8327

BCB消息机制

方法1。使用消息映射(Message Map)重载TObject的Dispatch虚成员函数 BEGIN_MESSAGE_MAP VCL_MESSAGE_HANDLER( … …) END_MESSAGE_MAP( …) 熟悉MFC都知道,上面其实是定义了一段消息处理的宏 e.g BEGIN_MESSAGE_MAP VCL_MESSAGE_HANDLER(WM_PAINT,TMess

gaiazhang‘s blog 1679
上一篇: BCB控件制作和消息处理
下一篇: 两个程序之间传递数据可以使用wm_copydata
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值