MFC DoModal后不能显示提示框
各位大虾:下面是创建基于对话框的应用程序的初始化代码,当dlg.DoModal后返回IDOK,程序退出之前AfxMessageBox(L"ok",MB_OKCANCEL,...
各位大虾:
下面是创建基于对话框的应用程序的初始化代码,当dlg.DoModal后返回IDOK,程序退出之前AfxMessageBox(L"ok",MB_OKCANCEL,0);这个提示框为什么不能显示啊?跟进代码里,这段代码已经执行到了。很不解,哪位大虾救急!!!(开发环境vs2005)
BOOL CggggApp::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
AfxEnableControlContainer();
// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
CggggDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此处放置处理何时用“确定”来关闭
// 对话框的代码
AfxMessageBox(L"ok",MB_OKCANCEL,0);
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用“取消”来关闭
// 对话框的代码
}
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
} 展开
下面是创建基于对话框的应用程序的初始化代码,当dlg.DoModal后返回IDOK,程序退出之前AfxMessageBox(L"ok",MB_OKCANCEL,0);这个提示框为什么不能显示啊?跟进代码里,这段代码已经执行到了。很不解,哪位大虾救急!!!(开发环境vs2005)
BOOL CggggApp::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
AfxEnableControlContainer();
// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
CggggDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此处放置处理何时用“确定”来关闭
// 对话框的代码
AfxMessageBox(L"ok",MB_OKCANCEL,0);
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用“取消”来关闭
// 对话框的代码
}
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
} 展开
展开全部
没有人知道吗?
还是我告诉你吧。
问题出在这个地方
CggggDlg dlg;
m_pMainWnd = &dlg;//就是这里,删除改句你试一试。
INT_PTR nResponse = dlg.DoModal();
当然主要原因是 全局变量 m_pMainWnd
他是在 AfxWin.h 定义的,可通过AfxGetApp()->m_pMainWnd访问
他是CWinThread::m_pMainWnd的成员变量
MFC文档中这么解释的
Use this data member to store a pointer to your thread’s main window object. The Microsoft Foundation Class Library will automatically terminate your thread when the window referred to by m_pMainWnd is closed. If this thread is the primary thread for an application, the application will also be terminated. If this data member is NULL, the main window for the application’s CWinApp object will be used to determine when to terminate the thread. m_pMainWnd is a public variable of type CWnd*.
Typically, you set this member variable when you override InitInstance. In a worker thread, the value of this data member is inherited from its parent thread.
翻译如下:
用该成员变量去存储你的线程主窗口对象。当和m_pMainWnd 相关的窗口被关闭后,MFC会自动终止你的线程。如果该线程是应用程序主线程,程序也将会被终止。如果该数据成员为NULL,应用程序CWinApp对象的主窗口将用来决定什么时候去终止线程。m_pMainWnd是一个CWnd*类型的public变量。
很明显,你需要在重载InitInstance时为m_pMainWnd赋值。在工作线程中,m_pMainWnd自动继承其父线程的值
----------------------------------------
你明白为什么了吧,提示框当然是弹出来了,m_pMainWnd 相关的窗口被关闭,整个进程由于瞬间被终止了,所以你看不到了。所以把m_pMainWnd=NULL;就可以了 或者不进行任何赋值。
还是我告诉你吧。
问题出在这个地方
CggggDlg dlg;
m_pMainWnd = &dlg;//就是这里,删除改句你试一试。
INT_PTR nResponse = dlg.DoModal();
当然主要原因是 全局变量 m_pMainWnd
他是在 AfxWin.h 定义的,可通过AfxGetApp()->m_pMainWnd访问
他是CWinThread::m_pMainWnd的成员变量
MFC文档中这么解释的
Use this data member to store a pointer to your thread’s main window object. The Microsoft Foundation Class Library will automatically terminate your thread when the window referred to by m_pMainWnd is closed. If this thread is the primary thread for an application, the application will also be terminated. If this data member is NULL, the main window for the application’s CWinApp object will be used to determine when to terminate the thread. m_pMainWnd is a public variable of type CWnd*.
Typically, you set this member variable when you override InitInstance. In a worker thread, the value of this data member is inherited from its parent thread.
翻译如下:
用该成员变量去存储你的线程主窗口对象。当和m_pMainWnd 相关的窗口被关闭后,MFC会自动终止你的线程。如果该线程是应用程序主线程,程序也将会被终止。如果该数据成员为NULL,应用程序CWinApp对象的主窗口将用来决定什么时候去终止线程。m_pMainWnd是一个CWnd*类型的public变量。
很明显,你需要在重载InitInstance时为m_pMainWnd赋值。在工作线程中,m_pMainWnd自动继承其父线程的值
----------------------------------------
你明白为什么了吧,提示框当然是弹出来了,m_pMainWnd 相关的窗口被关闭,整个进程由于瞬间被终止了,所以你看不到了。所以把m_pMainWnd=NULL;就可以了 或者不进行任何赋值。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询