深入浅出MFC:对话框消息路由
来源:互联网 发布:程序员转行可以做什么 编辑:程序博客网 时间:2024/05/16 12:22
[appmodul.cpp]
extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){ return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);}
[winmain.cpp]
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){ int nReturnCode = -1; CWinThread* pThread = AfxGetThread(); CWinApp* pApp = AfxGetApp(); pApp->InitApplication(); if (!pThread->InitInstance()) { return nReturnCode; } nReturnCode = pApp->Run(); return nReturnCode;}
CWinApp::InitApplication
CWinThread::InitInstance
CWinThread::Run
均是virtual函数
[ProjName.cpp]
BOOL CProjNameApp::InitInstance(){ CWinAppEx::InitInstance(); CTestWYDlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); if (nResponse == IDOK) { } else if (nResponse == IDCANCEL) { } return FALSE;}
由于该函数返回FALSE,所以在AfxWinMain中函数结束后直接退出,
不会运行pApp->Run()
[dlgcore.cpp]
INT_PTR CDialog::DoModal(){ AfxHookWindowCreate(this); CreateDlgIndirect(); RunModalLoop(); //消息循环 DestroyWindow(); //销毁了窗口 return;}
[wincore.cpp]
int CWnd::RunModalLoop(DWORD dwFlags){ for (;;) { if (!AfxPumpMessage()) { AfxPostQuitMessage(0); return -1; } } return 0;}
[thrdcore.cpp]
BOOL AFXAPI AfxPumpMessage() { CWinThread *pThread = AfxGetThread(); return pThread->PumpMessage(); }
[thrdcore.cpp]
BOOL CWinThread::PumpMessage(){ return AfxInternalPumpMessage();}
[thrdcore.cpp]
BOOL AFXAPI AfxInternalPumpMessage(){ MSG msg; ::GetMessage(&msg); if (!AfxPreTranslateMessage(&msg)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } return TRUE;}
[thrdcore.cpp]
BOOL AfxPreTranslateMessage(MSG* pMsg){ CWinThread *pThread = AfxGetThread(); return pThread->PreTranslateMessage(pMsg);}
[thrdcore.cpp]
BOOL CWinThread::PreTranslateMessage(MSG* pMsg){ return AfxInternalPreTranslateMessage(pMsg);}
[thrdcore.cpp]
BOOL AfxInternalPreTranslateMessage(MSG* pMsg){ CWnd* pMainWnd = AfxGetMainWnd(); if (CWnd::WalkPreTranslateTree(pMainWnd->GetSafeHwnd(), pMsg)) return TRUE; return FALSE;}
[wincore.cpp]
//// 返回TRUE or FALSE// 由以上流程得:该函数返回TRUE,则pMsg指向的消息将会被忽略而不处理// 返回FALSE,则会DispatchMessage到对应的窗口过程函数处理//BOOL PASCAL CWnd::WalkPreTranslateTree(HWND hWndStop, MSG* pMsg){ // // 先调用本窗口对应CWnd类的PreTranslateMessage // 再往父窗口层层上溯调用对应CWnd类的PreTranslateMessage直到上溯到hWndStop对应的窗口 // 若其中的某个PreTranslateMessage返回TRUE, 则函数退出返回TRUE // 否则上溯完成返回FALSE // for (HWND hWnd = pMsg->hwnd; hWnd != NULL; hWnd = ::GetParent(hWnd)) { CWnd* pWnd = CWnd::FromHandlePermanent(hWnd); if (pWnd != NULL) { if (pWnd->PreTranslateMessage(pMsg)) return TRUE; } if (hWnd == hWndStop) break; } return FALSE;}
0 0
- 深入浅出MFC:对话框消息路由
- 深入浅出MFC:消息路由
- 深入浅出MFC学习笔记2--消息映射和消息路由
- MFC深入浅出--消息映射
- MFC深入浅出--消息映射
- MFC中的消息路由
- MFC的消息路由
- MFC消息路由
- MFC—消息对话框
- 对话框中消息的路由
- MFC深入浅出之消息映射
- 深入解析MFC消息路由
- MFC消息映射及路由
- mfc消息响应和消息路由
- 深入浅出MFC:MFC的消息机制
- MFC对话框消息传递顺序
- MFC对话框消息传递顺序
- MFC对话框消息传递顺序
- Source Insight如何改变代码显示大小
- 友盟自动更新步骤
- Android Studio 中设置Getter,Setter &鼠标悬浮查看api
- rtrt
- pip install PIL 报错
- 深入浅出MFC:对话框消息路由
- gpuimage123
- system.map文件详解
- 详解Linux /etc/passwd文件
- Java并发编程】之十三:生产者—消费者模型(含代码)
- 2015第六届省赛总结
- MyEclipse2015安装Emmet && SVN
- yii2学习笔记(九)用户登录基础
- mac下chrome快捷键