15,471
社区成员
发帖
与我相关
我的任务
分享
dlg.Create(IDD_DIALOG1);
dlg.ShowWindow(SW_SHOW);
MSG msg;
while(GetMessage (&msg, NULL, 0, 0 ))
{
if (dlg.GetSafeHwnd == 0 ¦ ¦
!::IsDialogMessage(dlg.GetSafeHwnd(), &msg)) //加上对话框消息处理
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
}
#include <process.h>
///////////////////////////// chBEGINTHREADEX Macro ///////////////////////////
// This macro function calls the C runtime's _beginthreadex function.
// The C runtime library doesn't want to have any reliance on Windows' data
// types such as HANDLE. This means that a Windows programmer needs to cast
// values when using _beginthreadex. Since this is terribly inconvenient,
// I created this macro to perform the casting.
typedef unsigned (__stdcall *PTHREAD_START) (void *);
#define chBEGINTHREADEX(psa, cbStack, pfnStartAddr, \
pvParam, fdwCreate, pdwThreadId) \
((HANDLE)_beginthreadex( \
(void *) (psa), \
(unsigned) (cbStack), \
(PTHREAD_START) (pfnStartAddr), \
(void *) (pvParam), \
(unsigned) (fdwCreate), \
(unsigned *) (pdwThreadId)))
void CDemoDlg::OnButton1()
{
// TODO: Add your control notification handler code here
AfxBeginThread(ThreadFun, NULL); //这里要用AfxBeginThread,不能用下面的_beginthreadex
//具体原因下面会说明
// DWORD dwThreadId;
// chBEGINTHREADEX (NULL, 0, ThreadFun, (PVOID)NULL,
// NULL, &dwThreadId);
}
UINT CDemoDlg::ThreadFun(LPVOID pParam)
{
AfxMessageBox("test"); //在这里无论上面用的是AfxBeginThread还是_beginthreadex都可以
//因为AfxMessageBox没有关系到MFC环境初始化
CDlg1 dlg;
///////////////////////////////////////////////////////////////////////////////////////
//modal dialog
//dlg.DoModal(); //这里和下面的一定要用AfxBeginThread不然的话就出现你所说的情况,
//AfxMessageBox内部初始化MFC环境然后它会调用_beginthreadex
//////////////////////////////////////////////////////////////////////////////////////
//non-modal dialog
dlg.Create(IDD_DIALOG1);
dlg.ShowWindow(SW_SHOW);
MSG msg; //如果是非模态对话框一定要加入这个消息循环
while(GetMessage (&msg, NULL, 0, 0 )) //模态对话就不要了,因为DoModal内部执行了这
{ //个工作
TranslateMessage (&msg); //只要是子线程中要创建窗口都要有一个消息循环
DispatchMessage (&msg);
}
return 0;
}