【问题标题】:c++ repaint part of windowc ++重绘窗口的一部分
【发布时间】:2010-08-26 04:39:33
【问题描述】:

我想重绘窗口的一部分,而不是全部。我不知道该怎么做。我使用的是 win32,请不要使用 mfc........
提前致谢


// create rect structure
RECT rect2;
rect2.left=0;
rect2.top=0;
rect2.right=225;
rect2.bottom=300;
// calling invalidateRect when left mouse button is donw
case WM_LBUTTONDOWN:
    InvalidateRect(hWnd, &rect2, false);
    break;

【问题讨论】:

  • 简单回答:不要将 GDI 用于游戏。无论您多么小心地尽量减少重绘工作,OpenGL 或 DirectX 几乎肯定会做得更好。
  • @Jerry Coffin:实际上在某些游戏中使用 GDI 还是有充分理由的。如果性能不如对非常旧的系统或具有过时显卡驱动程序的系统的可移植性重要,或者如果您无论如何都在软件中使用 2D,GDI 仍然是一个可行的选择。例如,我创建了一个完全基于 GDI 的休闲游戏游戏引擎,但也针对休闲游戏中常见的许多场景进行了优化。
  • @Adrian:如果您对此感到满意,那就太好了。虽然与旧硬件/软件的兼容性存在一些限制,但我在 NT 3.5 下非常成功地在硬件上使用了 OpenGL,这些硬件太旧了,您在博物馆外几乎找不到它了。
  • @Jerry Coffin:是的,但是如果您的软件传播非常广泛,那么总会有用户使用错误和/或过时的显卡驱动程序。使用 GDI 而不是 OpenGL 可以让您轻松解决这个问题。出于同样的原因,Popcap 的游戏引擎也使用 GDI 后备模式。
  • c++ repaint part of window 的可能重复项

标签: c++ visual-c++ winapi window


【解决方案1】:

在 InvalidateRect() 方法中传递要重新绘制的窗口部分的矩形。阅读here了解详情。

【讨论】:

  • 我已经想到了,但它不起作用你可以看到我的代码在几分钟内发布它
  • 定义“无效”。此外,如果您有自己的 WM_PAINT 处理程序,那么您需要尊重它为您提供的剪辑矩形。不过,一般来说,如果这是用于游戏,如前所述,如果您打算做的不仅仅是简单的位图和形状,那么使用 DirectX 很可能会更好。
  • 所有我使用gdi的都是画一个简单的矩形并加载一些图像
【解决方案2】:

这是用于游戏引擎的吗?之所以如此,是因为您担心完全重绘时的 cpu 使用率。

如果是这样,那么我建议您使用 blitting 到后台缓冲区图像,跟踪后台缓冲区的哪些部分已更改,并在完成渲染后仅将该部分复制到屏幕上。这称为双缓冲,还可以解决您可能会看到的闪烁问题。

【讨论】:

  • 是的,我正在创建一个游戏,我也在我的游戏中使用双缓冲
【解决方案3】:

RedrawWindow 有什么问题?

【讨论】:

  • 如果我重绘整个窗口,它会占用我的 CPU 太多
  • RedrawWindow 重绘窗口的部分。检查lprcUpdate参数。
【解决方案4】:

正如其他答案所指出的那样;处理 WM_PAINT 时,您需要获取更新矩形/区域并相应地绘制/blit。

见:
+ The WM_PAINT Message
+ Retrieving the Update Region
+ Invalidating and Validating the Update Region
+Synchronous and Asynchronous Drawing

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多