总结:发送自定义消息

来源:互联网 发布: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()
}

 

消息处理器的格式为:

使用WPRAMLPARAM参数并返回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");

 

并使用ON_REGISTERED_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步骤同上。

向其他进程发送消息:

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();


原创粉丝点击