总结:发送自定义消息
来源:互联网 发布:2016网络热门词汇 编辑:程序博客网 时间:2024/05/16 15:42
总结:发送自定义消息
一:自定义消息的步骤:
1:定义一个消息
推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。
#define WM_MY_MESSAGE (WM_USER+100)
2:
在要用来处理该消息的类的头文件中声明一个消息处理器(消息处理器写在AFX_MSG块中):
class CMainFrame:public CMDIFrameWnd
{
...
// 一般消息映射函数
protected:
// {{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnTimer(UINT nIDEvent);
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
}
消息处理器的格式为:
使用WPRAM和LPARAM参数并返回LPESULT。
3:在源文件中实现消息处理器:
LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 处理用户自定义消息
...
return 0;
}
4:在源文件中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_TIMER()
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
注意宏模块不要找错了,因为在Dialog的源文件中有两个宏模块。
二:多个进程之间通过消息进行通讯
// RegisterWindowMessage用于进程之间的通讯
// 用户必须通过调用RegisterWindowMessage 函数来注册一个消息句柄。
// 这样就可以保证消息号在整个系统中是唯一的,从而避免了不同的进程使用相同的消息号,造成冲突
区别两种自定义消息:
用RegisterWindowMessage定义的消息:
If the message is successfully registered, the return value is a message identifier in the range 0xC000(49152) through 0xFFFF(65535).
If the function fails, the return value is zero.
RegisterWindowMessage定义的消息在整个操作系统中是唯一的,这通过消息互相通讯的这几个进程关闭之后,RegisterWindowMessage定义的消息被销毁(The message remains registered until the session ends. )
普通自定义消息:
For sending private messages within a window class, an application can use any integer in the range WM_USER(1024) through 0x7FFF(32767). (Messages in this range are private to a window class, not to an application. For example, predefined control classes such as BUTTON, EDIT, LISTBOX, and COMBOBOX may use values in this range.)
RegisterWindowMessage定义消息的方式:
如果用户需要一个定义整个系统唯一的消息,可以调用SDK函数RegisterWindowMessage定义消息:
static UINT WM_MY_MESSAGE = RegisterWindowMessage("User");
向其他进程发送消息:
DWORD result;
SendMessageTimeout(wnd->m_hWnd, // 目标窗口,通过窗口句柄系统可以找到定义该窗口的线程的消息队列,从而把该消息投递到消息队列之中。
WM_MY_MESSAGE, // 消息
0, // WPARAM
0, // LPARAM
SMTO_ABORTIFHUNG |
SMTO_NORMAL,
TIMEOUT_INTERVAL, // 这是一个时间间隔
&result);
该函数可以避免其它进程如果被阻塞而造成系统处在死等状态。
从一个类向另一个类发送消息:
如果需要向其它类(如主框架、子窗口、视类、对话框、状态条、工具条或其他控件等)发送消息时,可以通过获取某个类的指针而向这个类发送消息,而自定义消息的各种动作则在这个类中定义,这样就可以自由自在的向其它类发送消息了。
下面举的例子叙述了向视类和框架类发送消息的方法: ON_REGISTERED_MESSAGE(WM_MY_MESSAGE,OnMyMessage) //定义消息映射
在主框架类中向视类发送消息:
视类中定义消息:
视类定义消息处理函数:
// 消息处理函数
LRESULT CMessageView::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 处理用户自定义消息
...
return 0;
}
//发送消息的测试函数
void CMainFrame::OnTest()
{
CView * active = GetActiveView();//获取当前视类指针
if(active != NULL)
active->PostMessage(WM_MY_MESSAGE,0,0);
}
补充:
//获取主窗口指针
pFrame =(CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
// 获取子窗口指针
pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
- 总结:发送自定义消息
- 总结:发送自定义消息
- 总结:发送自定义消息
- 总结:发送自定义消息
- 自定义消息及发送
- 自定义消息发送字符串
- MFC - 发送自定义消息
- 定义和发送自定义消息
- 使用postmessage发送自定义消息
- SendMessage发送自定义消息及消息响应
- ROS---发送自定义消息,接收消息
- MFC总结(4)---MFC中如何使用子控件向父控件发送自定义消息
- 使用回调函数发送自定义“消息”
- VC++6.0中如何发送自定义消息
- 自定义消息发送unicode或ascii字符串
- VC++6.0中如何发送自定义消息
- 自定义消息的发送与接收处理
- 发送消息到自定义窗体类
- 123
- Linux内核的Makefile和kconfig解读
- 虚拟主机 简远出品
- 在sql语句中,怎样将参数做为表名传递到查询语句中
- 一个IT人七次跳槽的十点经验总结:跳槽一定要谨慎
- 总结:发送自定义消息
- ASP.NET 取得 Request URL 的各个部分和通过ASP.NET获取URL地址的方法
- 总结:发送自定义消息
- 总结:发送自定义消息
- 总结:发送自定义消息
- 2010.10.28,今天是个好日子,刚刚得到消息---俺要当爹了
- 大数据量问题
- Ubuntu下QQ总是自动退出
- 将Word表格一分为二的技巧