接收消息窗体,CMainFrame
1、 首先在stdafx.h中定义消息:例如
#indefine WM_MYMESSAGE (WM_USER+100)
WM_MYMESSAGE是定义的宏
2、定义消息处理函数。
消息处理函数为消息目标类的成员函数。首先应该在.h 文件中声明。这里以主窗口类为例,主窗口类名 CMainFrame,则首先在CMainFrame.h声明消息处理函数。
public:
afx_msg LRESULT OnCurTaskChanged(WPARAM wParam, LPARAM lParam);
3.在CMainFrame.cpp中实现消息处理函数
LPESULT CMainDialog::OnCurTaskChanged(WPARAM wParam, LPARAM lParam)
{
// TODO: 处理用户自定义消息
m_bIsOpen = false;
return 0;
}
4.在CMainFrame.cpp中映射消息ID和消息处理函数
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_TIMER()
ON_MESSAGE(WM_MY_MESSAGE, OnCurTaskChanged)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
5、在CMainFrame中创建非模态对话框,通过按钮Click::OnDebug_test
void CMainFrame::OnDebug_test()
{
m_bIsOpen = false;
Cam_TestDlg *dlg = new Cam_TestDlg();
if (!m_bIsOpen)
{
dlg->Create(IDD_DIALOG_TEST, GetDesktopWindow());
dlg->ShowWindow(SW_SHOW);
m_bIsOpen = !m_bIsOpen;
m_bIsOpen = true;
}
//TODO: Add your command handler code here
}
在对话框Cam_TestDlg中发送消息
CMainFrame *pFrame;
pFrame = (CMainFrame*)AfxGetMainWnd();
PostMessageW(pFrame->m_hWnd, WM_MY_MESSAGE, NULL , NULL);
PostMessage:把消息投放到线程的消息队列,不能消息被处理就立即返回
SendMessage:消息被处理完后才返回
几种发送消息的写法:
::PostMessage(GetSafeHwnd(), WM_USER_THREADEND, 0, 0); //GetSafeHwnd()表示得到当前窗口句柄,所以这条语句是发送给当前窗口
GetParent()->PostMessage(WM_USER_THREADEND, 0, 0);//发送给父窗口
this->PostMessage(WM_USER_THREADEND, 0, 0);//发送给当前窗口
HWND h= ::FindWindow(NULL, _T("窗口名字"));
::PostMessage(h, WM_PARASET, 0, 0);//发送给任意窗口
SendMessage也是同样的用法。
MFC发送自定义消息请参考:http://blog.csdn.net/penpenandtongtong/article/details/18598907