【问题标题】:MFC dialog freezes when it looses focusMFC 对话框在失去焦点时冻结
【发布时间】:2012-04-17 12:12:01
【问题描述】:

我是 MFC 的新手,所以请多多包涵。我有一个在双屏显示器上全屏显示的对话框。此对话框在另一个非模态对话框中实例化(单击按钮时)。类似的东西:

void MyCParentDlg::OnBnClickedButton1()
{
        dlg2 = new MyChildNonModalDlg();
        dlg2->ShowWindow(SW_SHOW);
}

在MyChildNonModalDlg 的OnInitDialog() 中,调用ShowWindow(SW_MAXIMIZE) 使其成为无边框全屏对话框。现在,MyChildNonModalDlg内部有一个按钮回调事件:

void MyChildNonModalDlg::onBnClickedBut2() {
    // Display images on the dialog one by one for a very long time 
}

当onBnClickedBut2 正在运行并且对话框不断更新时,如果我在对话框外(比如在另一个屏幕上)用鼠标单击,这意味着当对话框失去焦点时,它会冻结!

我知道这也许可以通过多线程解决,OnBnClickedBut2() 中的进程必须在线程内运行,但是作为对线程知之甚少的人,有人可以指出我正确的方向或提供可以做到这一点的代码示例?

【问题讨论】:

  • 注意,当子对话框不是全屏时也会出现同样的问题,所以这个问题不是因为它处于全屏模式。
  • 它冻结是因为 Windows 设置了“无响应”幽灵窗口。这在 UI 代码中无效,您必须在另一个线程上运行长循环。
  • 好的,我想我已经弄明白了,这是 MFC 中线程的极好介绍,下载示例代码并研究它实际上帮助我在一个小时内学会了如何进行多线程和这个线程背景也很少。链接:codeproject.com/Articles/5542/…

标签: c++ windows multithreading mfc


【解决方案1】:

使用AfxBeginThread 在onBnClickedBut2 中创建新线程。您不应该阻止 UI 事件处理程序。希望你现在明白了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 2023-03-27
    相关资源
    最近更新 更多