线程中创造对话框。
单独的消息映射测试过了,没问题.
连上线程后就错误,点击按钮就出错了.怎么做呢?
void CTestDlg::OnBnClickedButton2()
{
HANDLE hThread = (HANDLE)_beginthreadex(
NULL,
0,
ProcCreate,
this,
0,
NULL
);
CloseHandle(hThread);
}
unsigned int WINAPI ProcCreate(LPVOID lpParameter)
{
CWnd* pParent= new CTestDlg();
pParent->SendMessage(UM_CREATE_DLG);
return 0;
}
消息函数LRESULT CTestDlg::OnCreateDlg(WPARAM wParam,LPARAM lParam)
工作线程用AfxBeginThread函数来创建
如果想让线程与CTestDlg通讯,应该把lpParameter参数强制转换为CTestDlg*类型:
CTestDlg* dlg = (CTestDlg*)lpParameter;
dlg->SendMessage(UM_CREATE_DLG);
之后要Create
pParent->Create(xxx);
pParent->ShowWindow(SW_SHOW);
unsigned int WINAPI ProcCreate(LPVOID lpParameter)
{
CTestDlgDlg* dlg = (CTestDlgDlg*)lpParameter;
dlg->SendMessage(UM_CREATE_DLG,0,0);
return 0;
} void CTestDlgDlg::OnButton2()
{
// TODO: Add your control notification handler code here
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, ProcCreate, this, 0, NULL );
CloseHandle(hThread);
}LRESULT CTestDlgDlg::OnCreateDlg(WPARAM wParam,LPARAM lParam)
{
CTestDlgDlg dlg;
dlg.DoModal();
// dlg.Create(...)
return 0;
}
{
CWnd* pParent= new CTestDlg();
pParent->SendMessage(UM_CREATE_DLG);
return 0;
}
改为:
unsigned int WINAPI ProcCreate(LPVOID lpParameter)
{
CTestDlg dlg;
dlg.Create(xxx); //xxx为CTestDlg的ID
dlg.SendMessage(UM_CREATE_DLG);
return 0;
}
你创建的工作者线程。
创建对话框,发送消息, 应该创建UI线程,
用CWinThread类来创建
但是我理解错了,我做的是要在一个对话筐中用线程调用dll中的create.create方法是创造对话框,该对话框是在dll中的。
主对话框只能用线程调同create,不能再设消息循环。怎么弄呢?
我做的
class CMyThread:public CWinThread
{
DECLARE_DYNCREATE(CMyThread)
public:
BOOL InitInstance();
};
IMPLEMENT_DYNCREATE(CMyThread,CWinThread)
BOOL CMyThread::InitInstance()
{
g_Dlg=CreateMyDlg();
return 0;
}
void CTestDlg::OnBnClickedButton3()
{
CWinThread* pThread = AfxBeginThread(RUNTIME_CLASS(CMyThread));
}
但是创建的窗口闪下就没了,为什么呢,dll中的
MYDLL_API VDLG CreateMyDlg(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
MyDllDlg *pDlg = new MyDllDlg();
pDlg->Create(IDD_DIALOG1); pDlg->ShowWindow(SW_SHOW ); return pDlg;
}
的方法就行了,我看书上也说用创建UI线程的方法,这是为什么呢?
{
g_Dlg=CreateMyDlg();
return TRUE;
}
class CMyThread2:public CWinThread
{
DECLARE_DYNCREATE(CMyThread2)
public:
BOOL InitInstance();
};
IMPLEMENT_DYNCREATE(CMyThread2,CWinThread)
BOOL CMyThread2::InitInstance()
{
DestoryVtDlg(&g_Dlg);
return TRUE;
}void CTestDlg::OnBnClickedButton4()
{
CWinThread* pThread = AfxBeginThread(RUNTIME_CLASS(CMyThread2));
}
DLL中的
MYDLL_API void DestoryVtDlg(VDLG *dlg)
{
if(*dlg == NULL)
return; AFX_MANAGE_STATE(AfxGetStaticModuleState())
MyDllDlg *pDlg = (MyDllDlg*)(*dlg);
pDlg->SendMessage(WM_CLOSE);
delete pDlg;
*dlg = NULL;
}
就会出现错误,想解决的就是这个问题
有一个dll,调用dll中的函数createDlg()创造一个非模态对话筐,destroy(void*)摧毁一个非模态对话筐.
希望实现的是在随便一个客户的mfc中使用线程来createDlg(),和destroy(void*).但是在该客户只是简单的使用线程来调用这两个函数,不用创造消息循环.
程序出错的话只能改dll中的程序.
现在的dll中只是简单的创造非模态对话筐.
这句话不是很理解,新手,谢谢了.
EXE通过调用createDlg来创建非模态对话框,创建完后自然要返回,而不能在该函数中执行消息循环,否则就等于是模态了。
因为要求EXE不需要处理消息循环,而createDlg又必须在创建对话框之后立即返回,所以只能是创建一个线程,在线程中来处理消息循环。
又因为对话框与消息循环需要在同一线程中,所以对话框也要在线程中创建。
您说的"在MFC应用程序项目(对话框、SDI、MDI)中,主线程会执行MFC中提供的消息循环,所以在某个消息响应函数中,创建非模态对话框之后可以直接返回,不需要自己写消息循环。"
就是说在EXE的消息循环中调用DLL的CreateDlg,那样就因为"在MFC应用程序项目(对话框、SDI、MDI)中,主线程会执行MFC中提供的消息循环",所以就可以实现了是吧.
但是我在dll中用线程创造窗口后,怎么处理消息循环.自己在dll中自定义消息循环??
还有一个小问题不理解,就是如果在mfc中不用线程而是直接创造非模态窗口的话,您说的窗口是属于线程的,那是不是MFC中自己创造线程了建立窗口呢?