【问题标题】:Move a bitmap around a window quickly in C++在 C++ 中快速在窗口周围移动位图
【发布时间】:2010-12-09 23:26:45
【问题描述】:

我正在寻找一些 C++ 代码,让我可以在窗口周围快速移动位图,并在移动时恢复背景。目前,我在应用程序初始化期间将 Window 内容捕获到位图,并在 OnPaint() 中绘制此位图,然后绘制叠加位图。我正在双重缓冲油漆。重叠的位图位置随鼠标移动,使窗口无效。

这很好用,只是当背景窗口很大(想想 Windows 桌面)并且 PC 很慢时它太慢了。我的猜测是,在每次鼠标移动时重绘大背景位图是瓶颈。必须有更好更快的方法来做到这一点,但我的搜索没有找到我需要的答案。

【问题讨论】:

    标签: c++ visual-c++ bitmap gdi


    【解决方案1】:

    您最快的方法可能是将您的可移动图像存储在一个位图中,然后在内存中维护另一个相同大小的临时位图。要在主图像上绘制可移动位图,首先使用 BitBlt API 函数将要绘制可移动位图的区域复制到临时位图中,然后将可移动位图 BitBlt 到主图像上。然后,当您移动可移动位图时,您将 1) 将临时位图 BitBlt 到其原始位置,然后 2) 将新位置 BitBlt 到临时位图中,然后 3) 将可移动图像 BitBlt 到主位图中的新位置。

    【讨论】:

    • 是的,我是按照这些思路思考的,但是我尝试过这样的事情,结果并没有我希望的那么快。所以我想知道是否有更好的方法。我正在使用 GDI+,我认为最好退回到 GDI,因为从我的阅读来看,视频硬件加速不支持 GDI+。
    • BitBlt 应该几乎是瞬时的,所以我不确定为什么这对你不起作用。
    【解决方案2】:

    你应该看看Image Lists 实现了dragging 效果

    Win32 API 包括用于 在屏幕上拖动图像。这 拖动功能移动图像 光滑,颜色,没有任何 光标闪烁。都蒙面 并且可以拖动未屏蔽的图像。

    当然,用户实际上不必拖动图像。 通过改变图像位置来做到这一点。

    【讨论】:

    • 被移动的图像是可调整大小的(即用户可以改变它的大小),所以我不认为 ImageList 是一个好的解决方案。
    • 您可以尝试分层窗口,msdn.microsoft.com/en-us/library/ms997507.aspx(我没有尝试过,所以不确定您是否可以调整它们的大小)
    • 我尝试了分层窗口,但没有达到我需要的效果。
    • 请注意,图像列表图像最大为 256x256 像素。
    猜你喜欢
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 2014-11-28
    相关资源
    最近更新 更多