好久不用MFC了,最近工作需要,这里顺带做个笔记。
我这里在VS2012中,建立了一个PCTool.sln的工程。
那全局变量可以考虑放在和theApp的变量一起
同样,也要做extern
我们要在几个对话框之间传递消息,那么SendMessage和PostMessage都是可以的,但是也有一些区别,
SendMessage是及时处理的,要处理结束之后才接着后面的代码执行,所以它可以传递一个局部结构;
PostMessage是不等处理完毕就返回了,所以马上就接着后面的代码执行了,所以它无法传递一个局部结构,但可以以全局变量作为载体来间接的传递结构体。
我们来看下面的代码:
在.h中添加
B:
发送端
在.h中添加
完毕。
我这里在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;
}
完毕。