我正在开发基于Win32 DialogBox的应用程序。这使用DialogBox()创建对话框,并具有执行所有常规操作的对话框过程。

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

但是,对话框在某一时刻启动了冗长的操作。此操作有一个带有一系列状态消息的回调。由于两个原因,我在对话框上显示这些消息时遇到了一些麻烦:

  • 回调函数不知道对话框HWND是什么,因为它是从执行冗长操作的代码中调用的。我想我可以定义一个文件范围HWND变量,并在开始冗长的操作之前从对话框过程中将对话框HWND复制到其中。这样,回调函数可以访问对话框HWND。但这似乎太糟糕了:有没有更优雅的方法?
  • 进行冗长的操作时,对话框过程被阻止。没关系,因为它是嵌入式系统。但是,如果在对话框过程被阻止的情况下发出SendDlgItemMessage(),Windows甚至会在对话框中显示文本吗?

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

    最佳答案

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

    控件是否立即重绘自身是实现细节。我只知道进度栏正在这样做。您可以在对话框窗口句柄上调用UpdateWindow,以将所有待处理的绘画更新刷新到屏幕上。

    全方位更好的鼠标陷阱是在辅助线程上执行长时间运行的任务。避免Windows显示“无响应”幻影窗口,避免广播消息超时和许多潜在的死锁问题。但是正确起来往往比较棘手,您不能直接从辅助线程中更新窗口。

    关于c++ - Win32 DialogBox应用程序:如何在DialogBox上显示来自回调的文本?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3212925/

    10-11 22:46
    查看更多