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

从零开始掌握C++ Builder:创世纪级教程实战指南 C++ Builder 不是新技术,但它证明了一件事:真正优秀的工具不会被淘汰,只会不断进化。它既保留了可视化开发的便捷性,又拥抱了现代 C++ 和 DevOps 实践。无论你是维护老旧系统,还是开发新一代工业控制软件,它都能给你足够的灵活性和可靠性。所以,别再说它是“古董”了。下次当你看到某个医疗设备界面上熟悉的按钮样式时,不妨微微一笑:嘿,我知道你是谁养大的 😉本文还有配套的精品资源,点击获取。 阅读详情

 

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

  一个非可视的组件必须对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包含了头文件和源代码以下列出。

  总结:一个可以响应Windows消息的非可视组件有许多用途。最显而易见的就是用来封装某些方面的WindowsAPI。例如:TAPI和WinSock发送消息给事件的指定用户。如果你写的组件封装了一个这样的API。你将需要捕捉Windows发送的消息。而在你的组件中加入隐藏窗口将很好的帮你做到这一点。

  以上程序在C++ BUILDER 3.0中调试通过。

 

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>上传的文件是一个包含有测试例子的项目,很简单的,看一看就明白了。 立即下载

相关推荐

Borland C++Builder 应用开发大全、C++ Builder开发经验几则等

Borland C++Builder 应用开发大全、C++ Builder开发经验几则、C++ Builder数据库开发经典案例解析、C++Builder5高级技巧与范例、C++Builder深度历险、C++Builder学习大全

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

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

simpleshao的博客 2130

《C++ Builder组件大全》2

《C++ Builder组件大全》文件大小26M,一共4个包。解压时将解压出的19个卷放在一个目录中就可以完全解开。

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

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

s11ss的专栏 2082

C++Builder组件大全

C++Builder组件大全,基于bcb6的vcl组件进行介绍。

自动化测试软件设计:C# + VISA 库实现多接口(GPIB/USB)测试仪器控制

本文介绍了如何利用C#和VISA库开发支持多接口的自动化测试软件。VISA库作为标准化API,能够统一控制GPIB、USB等不同接口的测试设备。文章详细阐述了软件设计目标,包括多接口支持、统一控制、自动化脚本执行等功能。重点讲解了C#中VISA库的安装配置,并提供了设备控制类的核心代码实现,涵盖设备连接、命令发送、响应读取等关键操作。通过具体示例展示了GPIB和USB设备的连接方式,并扩展了自动化测试脚本功能。该方案具有高扩展性和维护性,适用于电子设备测试、生产线检测等多种场景,为自动化测试系统开发提供了实

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1713

使对象可以接收消息

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

沧海一粟 1680

PCout(n) -- STM32F103RCT6 位带操作

位带操作,sys.h,PCout,PAout,PAout

weixin_50212044的博客 4021

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

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

kim的专栏 3642

(三)从零开始学习模糊控制——模糊决策

模糊控制之基础——模糊数学 (一)模糊数学——基本概念 (二)模糊数学——模糊关系 (三)模糊数学——模糊决策 文章目录模糊控制之基础——模糊数学前言一、模糊决策法1.最大值原理2.模糊排序2.模糊寻优总结 前言   模糊决策是指在模糊环境下进行决策的数学理论和方法。这类问题─般具有大系统特征,系统之间的关系十分复杂,存在不能准确赋值的变量,这些变量属于模糊因素,涉及到一定的主观因素,使得子系统之间、变量之间的关系不清晰,从而必须借助排序、模糊评判等方法来进行处理。 一、模糊决策

qq_43667552的博客 4751

基于STM32F407的摄像头(不带FIFO的OV7670)图像采集及LCD显示实验-笔记整理

硬件说明 STM32F4开发板 stm32f4系列的芯片处理的能力可以说非常强大了的,而且内部还自带有数字摄像头接口(DCMI),可以说stm32f407的核心板和不带FIFO的摄像头模块OV7670简直就是绝配! 我手上的这块张这个样子 (图片来源:某宝): F4系列的DCMI接口内部结构框图如下图3所示,具体的配置使用方式可以参考以下这篇博文:《stm32f4的数字摄像头接口(DCMI)使用》 这位博主大大已经很详细地介绍了DCMI接口的具体使用方法和原理,更重要的是里面还有接口的配置函数,虽然不完

LiangWF22的博客 2万+

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

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

shine的现在进行时 834

我的世界模组开发——前言

避坑:在开发过程中一定不要过分依赖AI,虽说现在的人工智能很厉害,但是也有很大的弊端,很多AI生成的代码错误百出,还得自己修改,而且像deepseek这种AI的训练数据还停留在一年前,给出的maven仓库地址都是过时的甚至是错误的,开发模组就是要多学习,多看源码,这样开发模组的水平才能越来越高。总而言之,build.gradle文件在我的世界Forge模组开发中扮演了重要的角色,它定义了项目的构建过程、依赖关系和编译选项,为开发者提供了灵活而强大的构建工具。开发工具推荐使用idea,因为可以使用通灵义码。

qq_24992377的博客 2594

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

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

xjq2003的专栏 698

无人船 | 基于ROS的轻量级多无人艇自主导航仿真框架

无人水面艇USV是海上自主无人系统的关键组成部分,在民用、军用领域应用广泛,例如海上救援、水质测量、扫雷反潜等,因此对USV导航算法的研究具有重要意义。为了便于进行USV相关算法的验证与部署,本文介绍的这套基于ROS的多无人艇的自主导航仿真平台,轻量化地实现了建图、规划、控制等多种功能,同时自研框架保证了功能的高度可拓展和可定制

FRIGIDWINTER的博客 8008

ROS从入门到精通0-1:教程导读

ROS概念太多太复杂?ROS从入门到精通系列订阅必看

FRIGIDWINTER的博客 1万+

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

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

1080

看28377代码笔记

使用的是20MHz外部晶振,为取200MHz系统时钟,倍频设为20,分频设为2,这样sysclock = 20MHz * 20 / 2,正好200MHz。注意:SPISTE配置成普通的GPIO端口,是为了更好控制芯片,配置芯片的时序。FMULT_0:小数点位数,小数只能有0,0.25,0.5,0.75四个选择。XTAL_OSC:表示使用外部晶振。GPIO_MUX_CPU1:复用类型。GPIO_MUX_CPU1:复用类型。PLLCLK_BY_2:表示2分频。IMULT_20:表示倍频数。

小柚子的博客 807

C++ Builder中消息处理过程及应用

C++ Builder作为一种RAD方式的程序开发工具,其全新的可视化编程环境、面向组件的开发模式无疑会大大地提高编程效率。它对繁杂的Windows 消息及API作了较全面的封装,编程者在大多数情况下不需理会Windows消息的细节,只要将心思放在组件的事件处理函数上即可。  然而,毕竟Windows操作系统是一个以消息驱动的系统,运行其上的应用程序,自然无法脱离系统之外,因此掌握并运用消息处

xjq2003的专栏 1426

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

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

745

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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

weixu_2008的专栏 828

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++Builder 资料库

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用C++Builde

chiengod(钱神爷)的专栏 2万+

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

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

开心果的专栏 2083
上一篇: 软件开发评测规范
下一篇: 三层次数据库应用中的口令权限管理方案与实现
luhongjun
博客等级 码龄26年 12粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值