重载WndProc、WindowProc、消息映射BEGIN_MESSAGE_MA 转载

方法一、重载WndProc
private: // User declarations
void __fastcall WndProc(Messages::TMessage &Message);
void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
if (Message.Msg == WM_MOUSEWHEEL && Message.WParam )
{
Caption = Now();
}
TForm::WndProc(Message);
}

方法二 、消息映射

使用消息映射,一般需要三步:
  (1).声明消息映射表,把某些消息的处理权,交给自己定义的函数
  以一个没有参数的BEGIN_MESSAGE_MAP宏开始,
  以END_MESSAGE_MAP宏结束(唯一参数是组件的父类的名字,通常为TForm)
  在中间插入一个或多个MESSAGE_HANDLER宏,其将一个消息句柄和一个消息处理函数联系在一起。
  MESSAGE_HANDLER(windows消息名,消息结构体名,消息处理函数名)
  (2)声明消息处理函数
  函数名称和参数必须和MESSAGE_HANDLER宏定义的一样
  (3)实现消息处理函数
  与一般类函数差不多,只是在最后加上一条语句,完成VCL对消息的默认处理
  TForm::Dispatch(&Message);

VCL_MESSAGE_HANDLER写法,是为了调用ATL时,命名不冲突
class TForm1 : public TForm
 {
 __published: // IDE-managed Components
         TEdit *Edit1;
 private: // User declarations
 void __fastcall OnEditMouseWell(TMessage &Message);
 BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_MOUSEWHEEL, TMessage, OnEditMouseWell)
END_MESSAGE_MAP(TForm)
public:  // User declarations
         __fastcall TForm1(TComponent* Owner);
 };
 void __fastcall TForm1::OnEditMouseWell(TMessage &Message)
  {
    if(String(ActiveControl->ClassName())=="TEdit")  //所有的Edit
       Caption   = Now(); //测试
//TForm::Dispatch(&Msg);
}
方法三、重载WindowProc
void __fastcall OnEditMouseWell(Messages::TMessage &Message); //增加
Classes::TWndMethod OldEdit1WndProc; //增加
void __fastcall TForm1::OnEditMouseWell(Messages::TMessage &Message)
{
if (Message.Msg == WM_MOUSEWHEEL)
{
//::MessageBox(NULL,"OK","Message",0); //测试
Caption = Now();
}
else
OldEdit1WndProc(Message);
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
OldEdit1WndProc=Edit1->WindowProc;
Edit1->WindowProc=OnEditMouseWell;
}

时间: 2024-11-03 17:12:31

重载WndProc、WindowProc、消息映射BEGIN_MESSAGE_MA 转载的相关文章

c++builder 重载WindowProc、WndProc 截获消息(比Delphi多一个Message Map方法)

c++builder 重载WindowProc.WndProc 截获消息 方法一WindowProc void __fastcall  myWindowProc(Messages::TMessage &msg); //增加Classes::TWndMethod OldWindowProc;  //增加 void __fastcall  TForm1::myWindowProc(Messages::TMessage &msg) {   if (msg.Msg == WM_MOUSEWHEEL

【转】MFC消息映射详解(整理转载)

消息:主要指由用户操作而向应用程序发出的信息,也包括操作系统内部产生的消息.例如,单击鼠标左按钮,windows将产WM_LBUTTONDOWN消息,而释放鼠标左按钮将产生WM_LBUTTONUP消息,按下键盘上的字母键,将产生WM_CHAR消息. 消息处理:在MFC中,每个专门的处理函数单独处理每个消息.消息处理函数通常是某一类的成员函数,编写消息处理函数是编写框架应用程序的主要任务.可以使用ClassWizard创建消息处事函数,然后从Classwizard直接跳到源文件消息处理函数,编写处

MFC消息映射与命令传递

题外话:刚开始学视窗程序设计的时候,我就打印了一本Windows消息详解,里面列举了各种已定义消息的意义和作用,共10多页,在编程的时候翻翻,有时觉得很受用.我发觉很多编程的朋友,虽然每天都面对消息,却很少关注它.C++程序员有一个通病,很想写“自己”的程序,即每一行代码都想自己写出来.如果用了一些库,总希望能完全理解库里的类或函数是怎么一回事,否则就“不踏实”.对于消息,许多朋友只关心常用的几个,对其余的漠不关心.其实,Windows中有很多不常用的消息却很有用,程序员可能通过响应这些消息实现

消息映射(C++)(转)

摘要:控件通知消息有很多种,但是有一种是很常用,但是又不是很容易掌握的,那就是WM_NOTIFY,我试着对此做一下比较全面的论述,有不对的地方,还希望各路大虾批评指正.     控件通知消息     在<深度解析VC中的消息(上)>中,我们提到了消息的分类有3种:窗口消息.命令消息和控件通知消息,我们这里要谈的是最后一种:控件通知消息.     控件通知消息,是指这样一种消息,一个窗口内的子控件发生了一些事情,需要通知父窗口.通知消息只适用于标准的窗口控件如按钮.列表框.组合框.编辑框,以及W

如何在vs2008中添加WM_INITDIALOG消息映射

vs2008版本为对话框添加WM_INITDIALOG消息映射时,在“消息”中找不到这个东西 原因在于:VS2003开始已经将WM_INITDIALOG移到了重写里面,重写里面有一个OnInitDialog,对应了VC6.0的 WM_INITDIALOG消息 解决方案: 在菜单[(视图)view] 里有(类视图)点选之后主窗口就显示这个视图了,在类视图上选中主要对话框的那个类,右键选择属性,属性视图上有六个按钮,点第六个按钮就显示了所有该类可以重载的函数,找到对应的OnInitDialog即可添

MFC消息映射的原理:笔记

多态的实现机制有两种,一是通过查找绝对位置表,二是查找名称表:两者各有优缺点,那么为什么mfc的消息映射采用了第二种方法,而不是c++使用的第一种呢?因为在mfc的gui类库是一个庞大的继承体系,而里面的每个类有很多成员函数(只说消息反映相关的成员函数啊),而且在派生类中,需要改写的也比较少(我用来做练习的程序就是那么一两个,呵呵).那么用c++的虚函数的实现机制会导致什么问题呢?就是大量虚表的建立使得空间浪费掉很多. 嗯-怎么办呢?于是各大c++名库(比如QT,MFC,VCL-)在消息映射的实

MFC消息映射机制详解

 MFC消息映射机制: 在每个能接收和处理消息的类中,定义一个消息与消息处理函数的映射表,即消息映射表.MFC有一个窗口句柄与C++对象指针的映射表,当窗口收到消息时,消息的第一个参数指明了该消息与哪个窗口句柄相关,通过映射表找到C++对象指针,然后将这个指针传递给应用程序框架窗口类的基类,基类调用WindowProc函数(在wincore.cpp文件中),这是一个虚函数,函数内部调用OnWndMsg函数,消息处理就是在这个函数内完成的,该函数也在wincore.cpp中.OnWndMsg函

MFC 消息映射(一)

---恢复内容开始--- 最近在看<深入浅出MFC>一书.消息映射流程图如下: 在此附加上不实用MFC Wizard 编写的简单MFC窗口程序,纯粹为学习消息映射.下载地址:Hello.06. MFC 程序入口: 1 int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,_In_ LPTSTR lpCmdLine, int nCmdShow) 2 { 3 4 CWinApp* pApp = AfxGetApp();

VS2010/MFC编程入门之五(MFC消息映射机制概述)

VS2010/MFC编程入门之五(MFC消息映射机制概述)-软件开发-鸡啄米 http://www.jizhuomi.com/software/147.html     上一讲鸡啄米为大家简单分析了MFC应用程序框架,这一讲是关于MFC消息映射机制的内容.        前面已经说过,Windows应用程序是消息驱动的.在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作.比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的