MFC 中消息循环实例
2011-06-09 11:43
267 查看
让 APP 发送和处理自定义消息
1,自定消息;由于 app 不是继承与窗口类,所以不能向窗口那样 send 或 post message;
2,可以直接在 app 中 post thread message,例如这里的 WM_APP1;也可以从窗口中 post WM_COMMAND,例如这里的 WM_APP2;
2,防止 thread message 丢失,下面这个例子中,WM_APP2在主窗口创建后被post,处理函数弹出一个dialog,这时如果不显示滴用PeekMessage,thread message就被发到了窗口线程里,就丢失了。参考:http://support.microsoft.com/kb/183116
-
1,自定消息;由于 app 不是继承与窗口类,所以不能向窗口那样 send 或 post message;
2,可以直接在 app 中 post thread message,例如这里的 WM_APP1;也可以从窗口中 post WM_COMMAND,例如这里的 WM_APP2;
2,防止 thread message 丢失,下面这个例子中,WM_APP2在主窗口创建后被post,处理函数弹出一个dialog,这时如果不显示滴用PeekMessage,thread message就被发到了窗口线程里,就丢失了。参考:http://support.microsoft.com/kb/183116
#define WM_APP1 (WM_APP+1) #define WM_APP2 (WM_APP+2)
BEGIN_MESSAGE_MAP(CProgramApp, CWinApp) ON_THREAD_MESSAGE(WM_APP1, &CProgramApp::OnHandleApp1) ON_COMMAND(WM_APP2, &CProgramApp::OnHandleApp2) ON_COMMAND(ID_APP_ABOUT, &CProgramApp::OnAppAbout) // Standard file based document commands ON_COMMAND(ID_FILE_NEW, &CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, &CWinApp::OnFileOpen) END_MESSAGE_MAP()
BOOL CProgramApp::InitInstance() { ... // Dispatch commands specified on the command line. Will return FALSE if // app was launched with /RegServer, /Register, /Unregserver or /Unregister. if (!ProcessShellCommand(cmdInfo)) return FALSE; // The main window has been initialized, so show and update it pMainFrame->ShowWindow(m_nCmdShow); pMainFrame->UpdateWindow(); // // WM_APP2 was posted after main window created, need dispatch all those msg, // then post the thread msg, otherwise, the thread message lost. // MSG Msg; while(PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } this->PostThreadMessage(WM_APP1, 0, 0); return TRUE; } void CProgramApp::OnHandleApp1(WPARAM wParam, LPARAM lParam) { AfxMessageBox(_T("WM_APP1 handler")); } void CProgramApp::OnHandleApp2() { AfxMessageBox(_T("WM_APP2 handler")); }
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndStatusBar.Create(this)) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)); // this->PostMessage(WM_COMMAND, WM_APP2, 0); return 0; }
-
相关文章推荐
- MFC的来龙去脉-----消息循环,找处理场所
- MFC中的CListCtrl添加右键菜单消息响应实例分析
- 深入探讨MFC消息循环和消息泵
- MFC 子线程消息循环的实现
- 深入探讨MFC消息循环和消息泵(一)
- 深入探讨MFC消息循环和消息泵 .
- (转) MFC的入口点与消息循环,消息映射
- MFC消息循环和消息泵的分析
- 分析:由 XToolTip类 联想到 WTL (MFC) 消息循环
- MFC模态对话框的消息循环
- MFC中PeekMessage的使用,非阻塞消息循环
- 深入探讨MFC消息循环和消息泵(转载)
- MFC消息循环
- vc 修改MFC 消息循环的两种方法
- 深入探讨MFC消息循环和消息泵
- MFC 定时触发器实现循环给指定线程进行发送消息
- MFC消息循环
- MFC---理解Windows消息循环机制
- 深入探讨MFC消息循环和消息泵
- 深入探讨MFC消息循环和消息泵