在子线程中创建对话框时无法正确显示

Posted

技术标签:

【中文标题】在子线程中创建对话框时无法正确显示【英文标题】:the dialog desn't show correctly when it's created in sub-thread 【发布时间】:2010-10-11 09:22:08 【问题描述】:

我正在尝试在我的项目中添加弹出消息功能。我让它在子线程中运行,因为我需要实时通知。但是我发现通知对话框是否是在我的子线程中创建的(由 @ 开始987654321@),对话框的所有元素(按钮,urls....)都没有显示。消息框只是一个空白对话框。如果我提取函数并通过按钮启动它,那么它工作正常。这是函数,它很简单。

UINT sendNotification(LPVOID pParam)

   int x = GetSystemMetrics(SM_CXSCREEN);
   int y = GetSystemMetrics(SM_CYSCREEN);

   testPopDlg *testPop = new testPopDlg;
   testPop->Create(IDD_TEST,0);
   CRect lprect(0,0,0,0);
   testPop->GetWindowRect(lprect);
   int w = lprect.Width();
   int h = lprect.Height();
   testPop->web.Navigate("http://www.google.com",NULL,NULL,NULL,NULL);
   testPop->ShowWindow(SW_SHOW);
   for(int k=0;k<20;k++)    //slide out
   
      testPop->MoveWindow(x-w,y-h*k/20,w,y-h*k/20,1);
      Sleep(20);
   
   Sleep(5000);   //will close after 5 sec
   return 0;

为什么这个函数在子线程中不能正常工作?

【问题讨论】:

【参考方案1】:

要在 MFC 中的不同线程上使用对话框,您应该在 UI thread 上创建它。要创建 UI 线程,您基本上必须创建一个派生自 CWinThread 的类。另请参阅code project article。

【讨论】:

以上是关于在子线程中创建对话框时无法正确显示的主要内容,如果未能解决你的问题,请参考以下文章

如何释放在子对话框中创建的 CWin 对象以避免内存泄漏

如何在 VSCode 中创建自定义对话框?

QtQuick 按钮显示在对话框之外

在适配器中创建自定义对话框

显示对话框后无法将焦点返回到主窗口

怎么样在MFC中创建动态控件