MFC 如何添加自定义消息

MFC 如何添加自定义消息

分类: MFC2012-08-17 18:21 561人阅读 评论(0) 收藏 举报

mfcnullwindowsuser工作command

MFC如何添加自定义消息

 

MFC自定义消息

图解VC添加自定义消息

MFC激活自定义消息

如果用户自定义的类要求响应普通的Windows消息(也就是以WM_开头,除了WM_COMMAND以外的消息,这类消息在WM_USER以下的是系统消息,WM_USER以上的可以由用户自己定义),那就要求自定义的类必须从CWnd中派生。这是由于此类消息的处理机制决定的,这类消息没有命令消息那条繁琐的流动路径,而是消息发出者直接发给对应

CWnd的窗体句柄,由CWnd负责消息的响应。所以这类消息必须同一个CWnd类对应,更精确的说必须与一个HWND类型的窗体句柄相对应。这样得出一个重要的结论,就是从CCmdTarget中派生而没有从CWnd派生的类没有处理此类消息的能力。

综上所述,就是为什么命令消息可以放到大部分类中处理,包括CWinThread、CWinApp、CDocument、CView、CFrameWnd或是自定义的类中,而普通Windows消息和用户自定义的消息只能放到CFrameWnd和CView等派生与CWnd中的类中处理。

由此可见,我们自定义的类要想响应自定义消息就只能从CWnd中派生(当然不响应任何消息的类可以从CObject中派生)。先来看看如何自定义消息:

在.h中做的工作:

第一步要声明消息:

#define WM_MYMSG WM_USER+8

第二步要在类声明中声明消息映射:

DECLARE_MESSAGE_MAP()

第三步要在类声明中定义消息处理函数:

afx_msg LRESULTMyMsgHandler(WPARAM,LPARAM);

在.cpp中做的工作:

第四步要实现消息映射:

BEGIN_MESSAGE_MAP(CMainFrame,CMDIFrameWnd)

ON_MESSAGE(WM_MYMSG,OnMyMsgHandler)

END_MESSAGE_MAP()

第五步要实现消息处理函数(当然可以不实现):

LRESULTCMainFrame::OnMyMsgHandler(WPARAM w,LPARAM l)

{

AfxMessageBox("Hello,World!");

return 0;

}

在引发或发出消息的地方只用写上:

::SendMessge(::AfxGetMainWnd()->m_hWnd,WM_MYMSG,0,0);

到此,自定义消息完毕,这是好多网上文章都写的东西。大家会发现上面代码是在CMainFrame类中实现的,但是如果要用自定义类,就没有那么简单了。显然把第四步与第五步的CMainFrame换成自定义的类名(这里我用CMyTestObject来代表自定义类)是不能正常工作的。原因在于在发送消息的SendMessage函数中的第一个参数是

要响应消息对应的HWND类型的窗体句柄,而CMyTestObject类中的m_hWnd中在没有调用CWnd::Create之前是没有任何意义的,也就是没有调用CWnd::Create或CWnd::CreateEx函数时,CWnd不对应任何窗体,消息处理不能正常运作。

所以,又一个重要的结论,在自定义类能够处理任何消息之前一定要确保m_hWnd关联到一个窗体,即便这个窗体是不可见的。那么有人说,在自定义类的构造函数中调用Create函数就行了,不错,当然也可以在别处调用,只要确保在消息发送之前。但是,Create的调用很有说法,要注意两个地方,第一个参数是类的名称,我建议最好设为NULL;第五个参数是父窗体对象的指针,这个函数指定的对象一定要存在,我建议最好为整个程序的主窗体。还有很多人问第六个参数的意义,这个参数关系不大,是子窗体ID,用于传给父窗体记录以便识别。如下是我

的自定义类的构造函数:

CMyTestObject::CMyTestObject()

{

CWnd::Create(NULL,"MyTestObject",WS_CHILD,CRect(0,0,0,0),::AfxGetMainWnd(),1234);

}   //一定要在生成主窗体后使用,在主窗体完成OnCreate消息的处理后

CMyTestObject::CMyTestObject(CWnd*pParent)

{

CWnd::Create(NULL,"MyTestObject",WS_CHILD,CRect(0,0,0,0),pParent,1234);

}

不能如下调用Create,因为此时CMyTestObject不关联任何窗体,所以this中的m_hWnd无效:

CWnd::Create(NULL,"MyTestObject",WS_CHILD,CRect(0,0,0,0),this,1234);

这时上面四、五两步修改成:

BEGIN_MESSAGE_MAP(CMyTestObject,CWnd)

ON_MESSAGE(WM_MYMSG,OnMyMsgHandler)

END_MESSAGE_MAP()

LRESULTCMyTestObject::OnMyMsgHandler(WPARAM w,LPARAM l)

{

AfxMessageBox("My Messge Handler in MySelf-Custom Class!");

return 0;

}

在类外部发出消息:

CMyTestObject *test=newCMyTestObject();

::SendMessage(test->m_hWnd,WM_MYMSG,0,0);

在类内部某个成员函数(方法)中发出消息:

::SendMessage(m_hWnd,WM_MYMSG,0,0);

最后一个问题便是容易产生警告错误的窗体回收,自定义的类要显式调用窗体销毁,析构函数如下:

CMyTestObject::~CMyTestObject()

{

CWnd::DestroyWindow();

}

时间: 2024-08-29 02:49:02

MFC 如何添加自定义消息的相关文章

C++ MFC中添加自定义消息映射宏及添加消息响应函数

下面是我自己在学习C++过程中遇到的问题及解决过程,我把这个共享出来,希望能帮到遇到同样问题的同胞! 一.添加消息响应函数 afx_msg void OnOwnerDraw(NMHDR * pNotifyStruct, LRESULT* pResult);   //这里是你自定义的函数 DECLARE_MESSAGE_MAP() 二.在源文本中添加反消息映射宏代码  BEGIN_MESSAGE_MAP(CCustomToolBar, CToolBarCtrl) ON_NOTIFY_REFLECT

在MFC中添加用户自定义消息

在MFC中添加用户自定义消息 (2009-03-23 13:44:18) 转载▼ 标签: mfc 消息 自定义消息 it 分类: 计算机编程 首先弄清楚两点: (1)谁要发送这个消息(2)谁要接受这个消息. 用一个简单的例子来说明.对象A向B(也可以就是A到A)发送消息. 1 发送消息 首先在A的头文件中定义这个消息: #define WM_USERMESSAGE WM_USER+30 所有自定义消息都是以WM_USER消息为基础加上一个任意的自然数来表示的.A是向外发送消息的对象,因此在A的某

Direct2D开发:向 MFC 项目添加 Direct2D 对象

目的: 介绍如何将基本 Direct2D (D2D) 对象添加到 Visual C++ Microsoft 基础类库 (MFC) 项目中,然后将该项目构建到在渐变背景上输出"Hello, world"的应用程序中. 此演练演示如何完成以下这些任务: 创建 MFC 应用程序. 创建一个纯色画笔和一个线性渐变画笔. 修改渐变画笔,以便在调整窗口大小时它会相应更改. 实现 Direct2D绘图处理程序. 验证结果. 系统必备: 若要完成本演练,需要 Visual Studio. 创建 MFC

MFC中添加ToolTip提示框

PART 1 MFC 对话框中的 Buttton添加提示 例如我们想在一个对话框中的一个button控件添加tooltip,实现的方法如下: 1. 在该对话框的类中添加一个CToolTipCtrl类型成员,并在适当的地方将其初始化如下: m_ToolTipCtrl.Create(this); m_ToolTipCtrl.AddTool(GetDlgItem(IDC_BUTTON1), _T("This is ToolTip")); m_ToolTipCtrl.SetMaxTipWidt

MFC中添加新的对话框

MFC工程中,除了系统自动生成的一些对话框之外,还需要根据自己的需求,添加新的对话框.这里总结下自己最近使用的方法. 首先,找到Resource View中自己新建的工程,然后右键,选择Add Class,然后弹出的对话框中对新增的类进行设置,在Base Class需要选择CDialog,然后输入新增类的名称之后,就新增了一个类.这个类不仅有对应的头文件还有.cpp文件,以及一个与这个类对应的UI界面. 然后,需要将新增的类对应的头文件包含到它对应的父类的头文件中,同时在protected域中声

修复VS2008 MFC类添加功能[转载+编辑]

VS2008 MFC类向导不能正确加载启动类向导给对话框添加类时出现网页错误提示:"行: 815错误: 对象不支持此属性或方法"勾选"使用 Internet Explorer 中的内置脚本调试程序"后再次出现页面错误提示:"行: 815char 3错误:对象不支持此属性或方法代码:0URL:file:///D:/Microsoft%20Visual%20Studio%209.0/VC/VCWizards/CodeWiz/MFC/Simple/HTML/20

VC/MFC如何添加启动界面

2015-05 转自 香远益清原文VC/MFC如何添加启动界面 1.基于框架类的应用程序添加启动画面的步骤(利用组件库中的Splash Screen组件生成Splash1.cpp 和Splash1.h 这两个文件) (1)用Photoshop等制作启动画面图像,保存为bmp格式.  (2)用Appwizard建一个基于单文档的工程Splash. (3)在资源中插入位图资源     打开VC++的资源编辑器,用鼠标右键单击Resources文件夹,选择Import命令,插入所制作的位图.如果位图超

再探MFC(七)用户自定义消息

用途 回调函数通信 子对话框与父对话框通信,子对话框间通信 线程通信 用户自定义消息使用 step1 定义消息ID 例如Resource.h #define                LBD_SET_CALL_STATE_MESSAGE                (WM_USER+100) step2 消息处理 类视图选中要发往消息的对话框类,在属性视图中重写WindowProc 在TODO下添加代码处理用户自定义消息 switch (message) { caseLBD_SET_CAL

WIN10 64位下VS2015 MFC直接添加 halcon 12的CPP文件实现视觉检测

近段时间开始接触halcon,但是在VS2015里面使用,无论是配置还是生产EXE文件,都不如意. 加上网上的教程很多,经过多次测试,其实有很多地方无需修改,如果修改的太多也失去了直接添加封装的意义. 我的环境为 WIN10 64位 halcon12 用64位到处C++ 文件,VS2015免费共享版. (如果要生成32位的话,需要halcon12 用32位程序  导出C++,并且需要把VC切换为X86平台, 库目录改为 C:\Program Files\MVTec\HALCON-12.0\lib