c++ - win32 对话框应用程序 : how to show text from callback on the DialogBox?

标签 c++ winapi

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

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

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

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

  2. 当冗长的操作发生时,对话框程序被阻塞。这无关紧要,因为它是一个嵌入式系统。但是,如果我在对话框过程被阻止时发出 SendDlgItemMessage(),Windows 是否会在对话框中显示文本?

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

最佳答案

好吧,您的对话框 HWND 是一个单例,所以它不是世界末日。但是,是的,完成此操作的标准方法是将不透明指针传递给完成工作的代码。例如,与 EnumWindows() 的 lParam 参数比较,回调会返回该指针。

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

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

关于c++ - win32 对话框应用程序 : how to show text from callback on the DialogBox?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3212925/

相关文章:

c++ - 为什么显示 "Received a connection from 0.0.0.0, port 0"?

c++ - WaitForMultipleObjects 会修改*多个*对象的状态吗?

c - 将命令行参数作为一个大字符串获取

c++ - 不粘 cout 修饰符?

c++ - 如何在 cppunit 中断言语句抛出 Excp1 或 Excp2 类型的异常?

c++ - 如何设置 VSCode 以使用适用于 Windows 的 Visual C++ 构建工具

winapi - 通过 Win32 API 或 NVidia API 启用/禁用多个显示器?

c++ - 串口通讯初始化

winapi - 如何在Windows-7上使进程崩溃而不显示WER对话框?

c++ - 如何在 Windows C++ 中创建带标题栏的无边框窗口