【发布时间】:2016-07-05 19:12:35
【问题描述】:
我写了一个 Vis。 Studio 对话框应用程序可远程控制一台设备,其中包括我们需要从对话框中查看的小型 LCD 图形显示器。 V.Studio 对话框编辑器似乎没有提供固定解决方案。作为一名 Windows 程序员,需要而不是业余爱好,我所做的是:
- 在对话框中添加了一个编辑控件。
- 当 LCD 图像更新到达时,在编辑控件上创建 CClientDC
- 调用 GDI 函数设置像素值
这看起来很麻烦,但在图像到达时确实有效。重绘对话框时显然不会重绘图像。该代码保存图像数据以进行重绘,但在重绘对话框时尝试找到某个地方调用图像重绘函数并不愉快。
- 添加重绘调用作为对话框 OnPaint() 函数中的最后一条语句会创建图像,但在 OnPaint() 返回时会立即消失。
- 在 OnPaint() 中发布自定义 WM_DRAWLCD_MESSAGE 时结果相同 - 图像已创建,但已删除。
- 框架似乎没有调用 EndPaint(),因此无法在那里重绘图像。
两个问题:
1. 有没有普遍接受的方法来达到这个目的?
2. 如果没有,重绘对话框时代码在哪里调用重绘函数?
@zeromus: 我的“烤面包机”已连接到对话应用程序并且通信良好。所讨论的 LCD 图像是安装在机器上供操作员使用的 LCD 面板的内容。当我远程诊断时,通过单击图像下方的对话框按钮控件来执行控制/状态操作并查看响应会更简单,而不是通过其他方式复制所有机器功能。只要对话框保持在顶部,事情就会按预期工作。当对话框不在顶部时,将其重新置于顶部不会恢复图像 - 创建位图的数据和代码不是 CEdit 控件的一部分。所以问题是(1)是否有向导批准的方式来显示和恢复对话应用程序中不断变化的位图图像(而不是显示静态图像)和(2)如果没有,对话代码中是否有一些地方在重绘对话框期间拼接对我的位图绘图函数的调用?谢谢!
【问题讨论】:
-
解决方案很简单:将
CBitmap对象作为成员添加到您的对话框类中。每当数据到达时,更新位图数据,并调用InvalidateRect触发更新。在您的OnPaint-handler 中,只需渲染位图。如果您需要在对话框资源中使用占位符,请使用不可见的静态控件。由于您都沉迷于使用 MFC 向导,您应该考虑退后两步:1学习 Windows API,2深入了解 MFC 预处理器宏。如果您跳过任一步骤,MFC 将使 Windows 编程变得更加困难。
标签: visual-studio mfc dialog gdi