【问题标题】:WINAPI question (about flickering)WINAPI问题(关于闪烁)
【发布时间】:2010-02-24 17:46:06
【问题描述】:

我正在使用 IPicture 绘制 jpeg 图像。 首先我加载它,然后如果满足某些条件,我使用 IPicture::Render 函数在 WM_Paint 中绘制它。问题是如果窗口被另一个窗口关闭,它不会绘制图像,当我删除关闭窗口时,只有该图像显示窗口关闭它的位置。我使用了双缓冲但同样的问题,并且 我知道我应该使用 InvalidateRect,但我不明白在哪里使用它?有没有什么特别的活动——你必须更新你的窗口? 我需要一个可以使用 InvalidateRect 函数的地方。 你能帮助我吗? 现在我尝试在开关的默认情况下在 CALLBACK WndProc 中使用它。 我刚刚检查了它(使用双缓冲),即使有另一个窗口部分关闭它,图像也会立即绘制,但是如果我调整大小、移动窗口或移动另一个窗口,我每次都会闪烁。

【问题讨论】:

  • 您需要在这个问题中获得更多信息——您使用的是什么(.NET、MFC、VCL?)为什么您要使每个窗口消息都无效,因为默认的 wndproc 开关处理程序暗示您是?请重写整个事情以更清晰:)

标签: winapi


【解决方案1】:

这个问题并不能很好地解释这种情况。然而:

问:一开始我加载它,然后如果满足某些条件,我使用IPicture::Render 函数在WM_PAINT 中绘制它。

答:总是在WM_PAINT 中画图。 WM_PAINT 会在窗口内容损坏时发送(通过调整窗口大小或被其他窗口覆盖),因此您必须在 WM_PAINT 期间进行绘制,否则您将获得未绘制的区域。

问:我知道我应该使用 InvalidateRect,但我不明白在哪里使用它?有没有像

这样的特别活动

答:当 Windows 损坏您的窗口内容时(例如当您打开窗口、恢复窗口或调整窗口大小时),Windows 会自动调用 InvalidateRect。这可确保将 WM_PAINT 消息发送到您的窗口。 每当 更改窗口的内容时,您都需要调用 InvalidateRect() - 例如,当您完成加载新图像时,您会调用 InvalidateRect 让窗口向您发送 `WM_PAINT 并且新图像会那就画吧。

【讨论】:

    猜你喜欢
    • 2015-01-04
    • 2016-03-06
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 2018-08-04
    相关资源
    最近更新 更多