我正在开发一个基于 win32 DialogBox 的应用程序。这使用 DialogBox() 来创建对话框,并有一个对话框过程来完成所有常见的事情。
对话框上有一些静态文本控件,通常我在对话框过程中通过 SendDlgItemMessage() 显示这些文本。
然而,DialogBox 有时会启动一个冗长的操作。此操作有一个带有一系列状态消息的回调。我在对话框中显示这些消息时遇到一些问题,原因有二:
回调函数不知道对话框 HWND 是什么,因为它是从执行冗长操作的代码中调用的。我想我可以定义一个文件范围 HWND 变量,并在冗长的操作开始之前从对话框过程将对话框 HWND 复制到其中。这样,回调函数就可以访问对话框 HWND。但这似乎非常笨拙:有没有更优雅的方法?
当冗长的操作发生时,对话框程序被阻塞。这无关紧要,因为它是一个嵌入式系统。但是,如果我在对话框过程被阻止时发出 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/