GDI快速滚动

4
我使用GDI创建一些自定义文本小部件。我直接在屏幕上绘制,没有缓冲。
现在我想实现一些快速滚动,它只是像素移动帧缓冲的相应部分(并且只重新绘制新可见的行)。
我注意到例如富文本控件就是这样做的。如果我使用一些GDI绘图函数直接绘制到帧缓冲中,在富文本控件上方,然后滚动富文本,它也会将我的绘图与文本一起滚动。所以我认为富文本只是像素移动它在帧缓冲中的部分。
我想做同样的事情,但不知道如何实现。
有人可以帮忙吗?(独立于编程语言)
谢谢!
2个回答

8

嘿!太感谢了!但是,是否有一种可以直接操作帧缓冲区的功能?问题是我正在一个具有抽象层的框架上工作,不允许我访问窗口句柄 - 但是,我确切地知道在屏幕上的位置和大小,并且我可以进行Windows API调用。 - genesys
嗯,那样做行不通。无论你更新什么内容都会被窗口重绘而清除。 - Hans Passant
你可以总是指定桌面窗口句柄并将滚动矩形仅限于窗口的客户区域,但我不确定它是否能够正常工作。 - Matteo Italia
ScrollDC()让您在没有窗口句柄的情况下实现大致相同的功能。 - Adrian McCarthy

2
请参考BitBlt函数:
该函数实现了将源设备环境(device context)中指定矩形区域的颜色数据传输到目标设备环境中的操作。
请参考文档结尾的示例:捕获图像
您可以使用位图来捕获图像,并将其存储在内存中,在应用程序窗口的不同位置显示它。在某些情况下,您可能希望应用程序仅暂时地捕获图像并将其存储。要暂时存储图像,请调用CreateCompatibleDC函数创建与当前窗口DC兼容的DC。创建兼容的DC后,通过调用CreateCompatibleBitmap函数创建具有适当尺寸的位图,然后通过调用SelectObject函数将其选择到此设备上下文中。
在创建兼容设备环境和选择适当位图后,您可以捕获图像。BitBlt函数用于捕获图像,该函数执行比特块传输,即从源位图复制数据到目标位图。要重新显示图像,请再次调用BitBlt函数,将兼容的DC指定为源DC,将窗口DC指定为目标DC。

BitBlt 需要两个位块传输操作符。一个将像素移动到临时缓冲区,另一个将它们移回到原始位置的新位置上。使用 ScrollDC,你可以在单次操作中移动 DC 中的像素。 - Adrian McCarthy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接