MFC中SendMessage和PostMessage

好久不用MFC了,最近工作需要,这里顺带做个笔记。


我这里在VS2012中,建立了一个PCTool.sln的工程。

全局结构体定义,可以考虑放在类CPCToolApp的前面。

typedef struct LogMsg_t 
{
	CString szLog;
	int iWriteLogFilgFlag;
}LogMsg;

// CPCToolApp:
// See PCTool.cpp for the implementation of this class
//

class CPCToolApp : public CWinApp

那全局变量可以考虑放在和theApp的变量一起

// The one and only CPCToolApp object

CPCToolApp theApp;

LogMsg gLog;

同样,也要做extern

extern CPCToolApp theApp;

extern LogMsg gLog;

我们要在几个对话框之间传递消息,那么SendMessage和PostMessage都是可以的,但是也有一些区别,
SendMessage是及时处理的,要处理结束之后才接着后面的代码执行,所以它可以传递一个局部结构;
PostMessage是不等处理完毕就返回了,所以马上就接着后面的代码执行了,所以它无法传递一个局部结构,但可以以全局变量作为载体来间接的传递结构体。
我们来看下面的代码:

A:
发送端

gLog.szLog = TEXT("Hello world");
gLog.iWriteLogFilgFlag = 1;
::SendMessage(AfxGetApp()->m_pMainWnd->m_hWnd, WM_LOGMSG, 0, 0);
::PostMessage(AfxGetApp()->m_pMainWnd->m_hWnd, WM_LOGMSG, 0, 0);//都对,都可以
接收端
在.h中添加

afx_msg LRESULT LOGMSGHandler(WPARAM, LPARAM);
在.cpp中添加消息映射
ON_MESSAGE(WM_LOGMSG, &CPCToolDlg::LOGMSGHandler)
在.cpp中实现LOGMSGHandler函数添加处理

LRESULT CPCToolDlg::LOGMSGHandler(WPARAM w, LPARAM l)
{
	//CPCToolDlg类中的public函数
	WriteLogs(gLog.szLog, gLog.iWriteLogFilgFlag);	
	return 0;
}


B:
发送端

LogMsg lm;
lm.szLog = TEXT("xxxxxxx");
lm.iWriteLogFilgFlag = 1;
::SendMessage(AfxGetApp()->m_pMainWnd->m_hWnd, WM_LOGMSG, (WPARAM)&lm, 0);//此处只能用SendMessage,不能用PostMessage
接收端
在.h中添加

afx_msg LRESULT LOGMSGHandler(WPARAM, LPARAM);
在.cpp中添加消息映射

ON_MESSAGE(WM_LOGMSG, &CPCToolDlg::LOGMSGHandler)
在.cpp中实现LOGMSGHandler函数添加处理

LRESULT CPCToolDlg::LOGMSGHandler(WPARAM w, LPARAM l)
{
	LogMsg *lm;
	lm = (LogMsg *)w;
	TRACE(TEXT("%s, %d\n"), lm->szLog, lm->iWriteLogFilgFlag);
	WriteLogs(lm->szLog, lm->iWriteLogFilgFlag);	
	return 0;
}

完毕。










你可能感兴趣的:(MFC)