前几天要做一个dll的接口函数,在调用该接口函数时要弹出一个对话框,必须等对
话框销毁后函数才能返回,当时想到了用模态对话框来实现这个功能,但模态对话框
有个缺点是阻塞消息,这样我的程序就不能做其他事情了,这个方案被pass了,接下
来只能用非模态对话框了,我是通过双线程来实现的,在主线程中创建了一个子线程,
子线程负责创建对话框并处理与之有关的消息,主线程在创建完子线程后开始等待直
到对话框销毁再返回,好了废话不多说,下面是我的实现过程:
1先定义线程函数和消息
#define WM_DLGDESTORY_MSG WM_USER+89
UINT ThreadFunc(LPVOID pParm); //线程函数的定义
2 再在主线程中启动该线程并等待消息
void CMainDlg::OnBnClickedButton()
{
AfxBeginThread((AFX_THREADPROC)ThreadFunc,this);
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
if(msg.message==WM_DLGDESTORY_MSG) //如果是子窗口发送的消息则返回
{
AfxMessageBox(TEXT("函数返回"));
return;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
3 接下来就是最关键的实现子线程
UINT ThreadFunc(LPVOID pParm)
{
CMainDlg *pInfo=(CMainDlg*)pParm;
CTestDlg *testdlg=new CTestDlg();
testdlg->Create(IDD_DIALOG1);
testdlg->ShowWindow(SW_SHOW);
testdlg->m_mainWnd=pInfo->m_hWnd; //在子窗口中保存主窗口的句柄,目的是在子窗口销毁时向主窗口发送消息
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
4在子窗口的销毁函数中发送消息
void CTestDlg::OnDestroy()
{
CDialogEx::OnDestroy();
// TODO: 在此处添加消息处理程序代码
::PostMessage(m_mainWnd, WM_DLGDESTORY_MSG, 0, NULL); //向主窗口发送消息
}