【问题标题】:MFC create Modeless dialog that does not lose focusMFC 创建不失去焦点的无模式对话框
【发布时间】:2015-04-29 09:50:09
【问题描述】:

我想在 MFC 中创建一个对话框,它一旦显示就不会失去焦点。 这是为了在处理数据时阻止用户访问主 SDI 窗口。流程类似于:

  1. 用户触发流程
  2. 应用程序显示对话框
  3. 应用程序启动进程函数

我无法使用模态对话框执行此操作,因为 DoModal() 函数在对话框关闭之前不会返回,因此这永远不会触发第 3 步。

如何做到这一点?

编辑

这些是通知任务开始和任务结束的函数:

void CmodguiApp::_notify_task_start() {
  _processing_dialog->DoModal();
}

void CmodguiApp::_notify_task_end() {
  _processing_dialog->EndDialog(1);
}

这是触发任务流程的代码:

void trigger_task(std::function<void()> f) {
  CmodguiApp::_notify_task_start();
  f();
  CmodguiApp::_notify_task_end();
}

【问题讨论】:

  • 启动一个线程并在那里进行处理。
  • 在线程中运行您的任务。您可以在WM_INITDIALOG 处理程序中启动线程,以确保在线程完成并且您想关闭对话框时对话框句柄可用。
  • @MichaelWalz 我的处理已经在一个单独的线程中完成了,但是 CmodguiApp::_notify_task_start();和 CmodguiApp::_notify_task_end();必须在该线程中调用
  • 使您的对话框成为模态并在 OnInitDialog 中启动线程。
  • @manatttta: TopMost Modal 对话框怎么样?

标签: c++ mfc


【解决方案1】:

尝试以下方法:

  1. 调用

    _processing_dialog-&gt;DoModal();

  2. 在 Process 对话框类中,在适当的地方进行操作:

    AfxGetApp()-&gt;GetMainWnd()-&gt;SendMessage(WM_YOUR_USER_MESSAGE)

  3. 在主窗口类消息映射上,添加

    ON_MESSAGE(WM_YOUR_USER_MESSAGE, YourUserMessageHandlerFunction)

  4. 实现YourUserMessageHandlerFunction()。现在您已经在主窗口重新进行了处理。

【讨论】:

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