函数等待对话框销毁才返回

前几天要做一个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);  //向主窗口发送消息

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值