MFC 自定义 OnPaint 未被可靠调用

Posted

技术标签:

【中文标题】MFC 自定义 OnPaint 未被可靠调用【英文标题】:MFC custom OnPaint not being called reliably 【发布时间】:2012-02-13 19:36:29 【问题描述】:

我继承了一个 MFC 应用程序,它有一个窗口,其中包含多个响应 OnPaint 并进行各种绘图的所有者绘制小部件。

我注意到为了强制控件重绘以响应各种用户操作,有以下代码:

CRect rect;
m_myControl.GetWindowRect(&rect);
ScreenToClient(&rect);
InvalidateRect(&rect, FALSE);

我认为可以这样简化:

m_myControl.Invalidate(FALSE);

但是,在实践中,当我这样做时,控件有时会绘制,但有时不会绘制。具体来说,当我与窗口中的控件进行交互时,有时myControl 最终只会画成纯灰色。我将代码改回了更复杂的 InvalidateRect 样式,它再次运行良好。

为什么会有不同?

【问题讨论】:

是否有可能控件没有自己绘制,而是父窗口在绘制? 使用后一种方法变灰的控件由父窗口的 OnPaint 绘制。其中一个控件可以自行绘制并且没有任何问题。 【参考方案1】:

当您使一个窗口无效时,您不会使它下面的窗口无效。如果父窗口负责绘制控件,它不会被触发,因为您没有告诉它需要更新。在这种情况下,原始代码是正确的。

【讨论】:

酷,这就解释了!每天学习新东西。

以上是关于MFC 自定义 OnPaint 未被可靠调用的主要内容,如果未能解决你的问题,请参考以下文章

MFC图片自适应

如何创建自定义组件并将其添加到基于对话框的应用程序 (MFC)?

带位图和文本的 MFC 按钮

OnPaint 自定义渲染

无法清除 OnPaint 方法中的自定义控件

mfc 灰度图的绘制,数据与绘图分离