win32 DialogBox app:如何在DialogBox上显示来自回调的文本?

时间:2010-07-09 13:20:42

标签: c++ winapi

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

全方位更好的鼠标陷阱是在工作线程上执行长时间运行的任务。避免Windows显示“无响应”重影窗口,避免广播消息超时和许多潜在的死锁问题。但是为了正确起来往往很棘手,你无法直接从工作线程更新窗口。