线程中不能创建模态对话框

来源:百度知道 编辑:UC知道 时间:2024/05/31 21:05:18
在VC++ 6.0里中,自己做了一个对话框,并创建了对话框类CTestDlg;

使用CreateThread(NULL,0,_ThreadProc,NULL,0,NULL)启动了线程

线程函数如下:

WINAPI DWORD _ThreadProc(LPVOID pParam)
{
CTestDlg dlg;
dlg.DoModal();
return 0;
}

调试出现错误,发现dlg中的m_hWnd为Error:expression cannot be evaluted

也就是说dlg根本就没创建成功。

都有什么原因导致了创建失败呢?
刚才看了大家回答,说线程中不能创建模态对话框,那么为什么可以在线程中可以使用CFileDialog呢?

一般CDialog构造时不带资源模板参数,是建立的非模态窗口;
模态窗口构造时,一般用这两个
explicit CDialog(
LPCTSTR lpszTemplateName,
CWnd* pParentWnd = NULL
);
explicit CDialog(
UINT nIDTemplate,
CWnd* pParentWnd = NULL
);

你的类应该调用父类的这两个构造函数

WindowsAPI的线程不能调用MFC的东西,要创建MFC的线程才能调用,函数是AfxBeginThread

原形是CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);

可以给某个窗口发消息(PostMessage)
,由某窗口来弹出对话框。

在线程里当然不能建立摸态对话框,除非你在线程里使用托管试一下也许可以.