C++ builder消息的运用

本文详细介绍了C++ Builder中消息映射的使用步骤,包括声明消息映射表、声明及实现消息处理函数,以及深入讨论了VCL_MESSAGE_HANDLER的用意。此外,还探讨了非标准消息,如通知消息、自定义消息的创建和发送,以及如何在自定义消息中传递参数。
摘要由CSDN通过智能技术生成
一、TApplication的OnMessage事件
OnMessage事件只处理消息队列中的消息,SendMessage()发送的消息不会被截获。
任何窗体接收到一个windows消息,都会触发一次此事件
函数原型:
typedef void __fastcall (__closure *TMessageEvent) (tagMSG &Msg,bool &Handled);
Msg表示被截获的消息,Handled表示是否处理完成,为TRUE则防止被再次处理,设为FALSE则可以继续处理。
复制代码
// 计算程序响应的消息数
// ---------------------------------------------------------------------------

#ifndef Msg_testH
#define  Msg_testH
// ---------------------------------------------------------------------------
#include  < Classes.hpp >
#include 
< Controls.hpp >
#include 
< StdCtrls.hpp >
#include 
< Forms.hpp >
// ---------------------------------------------------------------------------
class  TForm1 :  public  TForm
{
__published:    
//  IDE-managed Components
    TLabel  * Label1;
    
void  __fastcall FormCreate(TObject  * Sender);
private :     //  User declarations
    
// 自定义消息响应函数
     void  __fastcall AppMessage(tagMSG  & MSG, bool   & Handled);
public :         //  User declarations
    __fastcall TForm1(TComponent *  Owner);
    
int  Num;
};
// ---------------------------------------------------------------------------
extern  PACKAGE TForm1  * Form1;
// ---------------------------------------------------------------------------
#endif

// ---------------------------------------------------------------------------

#include 
< vcl.h >
#pragma  hdrstop

#include 
" Msg_test.h "
// ---------------------------------------------------------------------------
#pragma  package(smart_init)
#pragma  resource "*.dfm"
TForm1 
* Form1;
// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent *  Owner)
    : TForm(Owner)
{
    Num 
=   0 ;
}
// ---------------------------------------------------------------------------

void  __fastcall TForm1::FormCreate(TObject  * Sender)
{
    
// 将自定义函数与OnMessage事件联系起来
    Application -> OnMessage  =  AppMessage;
}
// ---------------------------------------------------------------------------
void  __fastcall TForm1::AppMessage(tagMSG  & MSG, bool   & Handled)
{
    Num
++ ;
    Label1
-> Caption  =  AnsiString(Num);
    Handled 
=   false ;
}
复制代码

 

二、消息映射

使用消息映射,一般需要三步:

(1).声明消息映射表,把某些消息的处理权,交给自己定义的函数
以一个没有参数的BEGIN_MESSAGE_MAP宏开始,
以END_MESSAGE_MAP宏结束(唯一参数是组件的父类的名字,通常为TForm)
在中间插入一个或多个MESSAGE_HANDLER宏,其将一个消息句柄和一个消息处理函数联系在一起。
MESSAGE_HANDLER(windows消息名,消息结构体名,消息处理函数名)

(2)声明消息处理函数
函数名称和参数必须和MESSAGE_HANDLER宏定义的一样

(3)实现消息处理函数
与一般类函数差不多,只是在最后加上一条语句,完成VCL对消息的默认处理
TForm::Dispatch(&Message);

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值