m_pMainWnd
来源:互联网 发布:老兵纹身网 全知之眼 编辑:程序博客网 时间:2024/05/01 21:52
今天写程序时遇到个简单而又很有意思的问题,封装了一个网络接口类,发送数据以及网络的回调接口都在这个类里面,打算在回调函数里给AfxGetMainWnd()发送消息以更新主界面的数据,同时程序有一个登录框,需要在登录的回调函数里判断是否登录成功,以决定是否显示主界面,于是就想到这样做:
- BOOL CXXXApp::InitInstance()
- {
- //...
- CDlgLogin dlgLogin;
- m_pMainWnd = &dlgLogin;
- if (IDCANCEL == dlgLogin.DoModal())
- {
- return FALSE;
- }
- CMainDlg dlg;
- m_pMainWnd = &dlg;
- int nResponse = dlg.DoModal();
- if (nResponse == IDOK)
- {
- // TODO: Place code here to handle when the dialog is
- // dismissed with OK
- }
- else if (nResponse == IDCANCEL)
- {
- // TODO: Place code here to handle when the dialog is
- // dismissed with Cancel
- }
- return FALSE;
- }
这样的话,登录的回调消息就可以发送到CDlgLogin对话框里,运行的时候却发现程序直接退出了。后来查了资料,才知道m_pMainWnd关联的对话框关闭时,如果该线程是主线程,则程序会终止。
“用该成员变量去存储你的线程主窗口对象。当和m_pMainWnd 相关的窗口被关闭后,MFC会自动终止你的线程。如果该线程是应用程序主线程,程序也将会被终止。如果该数据成员为NULL,应用程序CWinApp对象的主窗口将用来决定什么时候去终止线程。m_pMainWnd是一个CWnd*类型的public变量。
很明显,你需要在重载InitInstance时为m_pMainWnd赋值。在工作线程中,m_pMainWnd自动继承其父线程的值。”
后来在CDlgLogin类里,在窗口销毁之前,对m_pMainWnd赋空,问题解决。
- AfxGetApp()->m_pMainWnd = NULL;
- CDialog::OnOK();
- m_pMainWnd
- 关于m_pMainWnd
- AfxGetApp()->m_pMainWnd
- CWinThread::m_pMainWnd
- CWinThread::m_pMainWnd
- MFC - m_pMainWnd
- MFC - m_pMainWnd
- m_pMainWnd的由来
- 主窗口变量 m_pMainWnd
- AfxGetMainWnd与AfxGetApp->m_pMainWnd
- AfxGetApp()->m_pMainWnd和AfxGetMainWnd()
- 讲解 VC 中的变量 m_pMainWnd
- m_pMainWnd = &dlg错误解决方法
- m_pMainWnd = &dlg错误解决方法
- 关于m_pMainWnd的小问题
- 关于m_pMainWnd = &dlg错误……
- AfxGetApp()->m_pMainWnd和AfxGetMainWnd() 的区别
- MFC中m_pMainWnd = &dlg报错
- 正则表达式语法
- Android_Mars_数独开发01
- JBPM4.4学习之一:JBPM入门
- 在android settings.db数据库中添加一项新的设置
- iOS 5.1及6.0 屏幕旋转的兼容问题
- m_pMainWnd
- Web.xml配置
- C++编程思想读书笔记之 第十章 引用和拷贝构造函数
- Java调用C/C++
- ORACLE:ORA-12560解决方法
- 写Daemon程序框架
- bash: scp: command not found问题的解决
- ]使用OpenVPN搭建Linux下的VPN服务
- fatal error C1083: Cannot open include file: 'jni.h': No such file or directory