【问题标题】:win32 DialogBox app: how to show text from callback on the DialogBox?win32 DialogBox 应用程序:如何在 DialogBox 上显示来自回调的文本?
【发布时间】:2010-07-09 13:20:42
【问题描述】:

我正在开发一个基于 win32 DialogBox 的应用程序。这使用 DialogBox() 来创建对话框,并且有一个对话框过程可以完成所有常见的事情。

对话框上有一些静态文本控件,通常我通过对话框过程中的 SendDlgItemMessage() 在这些控件中显示文本。

然而,DialogBox 有时会启动一个冗长的操作。此操作有一个带有一系列状态消息的回调。我无法在对话框中显示这些消息,原因有两个:

  1. 回调函数不知道对话框HWND是什么,因为它是从执行冗长操作的代码中调用的。我想我可以定义一个文件范围的 HWND 变量,并在冗长的操作开始之前从对话框过程中将对话框 HWND 复制到其中。这样,回调函数就可以访问对话框 HWND。但这似乎非常笨拙:有没有更优雅的方法?

  2. 在执行冗长的操作时,对话框过程被阻止。这没关系,因为它是一个嵌入式系统。但是,如果我在对话框过程被阻止时发出 SendDlgItemMessage(),Windows 甚至会在对话框中显示文本吗?

编辑 我已经使用 SendDlgItemMessage() 将 WM_SETTEXT 发送到对话框上的静态文本控件进行了一些调查。即使对话框过程被阻止,文本也会立即显示。

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    嗯,你的对话 HWND 是一个单例,所以它不是世界末日。但是,是的,完成这项工作的标准方法是将一个不透明的指针传递给完成工作的代码。例如,与 EnumWindows() 的 lParam 参数相比,回调将返回该指针。

    控件是否立即重绘自身是一个实现细节。我只知道进度条这样做。您可以在对话框窗口句柄上调用 UpdateWindow 以将任何挂起的绘制更新刷新到屏幕上。

    更全面的鼠标陷阱是在工作线程上执行长时间运行的任务。避免 Windows 显示“无响应”幽灵窗口,避免广播消息超时和许多潜在的死锁问题。但往往很难做到正确,您不能直接从工作线程更新窗口。

    【讨论】:

    • 所有好东西。我将使用不透明的指针路线,似乎效果很好。关于工作线程的观点;如果这是一个“真正的”应用程序,而不是没有鼠标或键盘的嵌入式应用程序,我当然会这样做。
    猜你喜欢
    • 1970-01-01
    • 2011-05-01
    • 2017-01-08
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多