结合blits和gdi绘图(不起作用,blins)
combining blits and gdi drawings (do not work, blinks)
我正在尝试将纹理blit与gdi绘图结合起来(
void draw()
{
StretchDIBits(hdc, 0, 0, CLIENT_X, CLIENT_Y, 0, 0, BUF_X, BUF_Y, buffer, &bmi, DIB_RGB_COLORS, SRCCOPY);
TextOut(hdc, 10, 10, "Hello World", 11);
}
hdc在设置时被GetDC调用过一次,但可能还可以;上面我在空闲循环中每秒运行100次,也在OnPain消息中运行;这并不好用,因为TextOut的结果只是闪烁,其余的都没问题——有人能告诉我一些建议吗?如何消除这种闪烁并获得稳定的TextOut结果?许多tnx
您需要"双缓冲区"来避免闪烁。
创建内存DCCreateCompatibleDC
在其中选择用CreateCompatibleBitmap
创建的具有适当大小的位图,并在此内存DC中绘制。
当您的图片准备就绪时-BitBlt
将其放在您的窗口DC上。
这是很自然的。你在DC上画一个DIB。并且您立即绘制一个文本,该文本(大概)被放置为使其边界矩形与StretchDIBits
中使用的边界矩形重叠。
简单地说:你画了一些东西,然后在同一个地方画了其他东西。这会闪烁。你还期待什么?
为了避免闪烁,您应该使用所谓的双缓冲。这意味着:
- 创建一个足够大小的位图
- 创建DC(所谓的内存DC)
- 将此位图选择到其中
- 在这个DC上绘制你的DIB(不是你最初获得的)
- 绘制文本
- 最后使用
BitBlt
将图像从位图传输到初始DC - 不要忘记清理东西:DIB的
DeleteObject
,内存DC的DeleteDC
您可以保留位图,而不是每次需要绘制时都创建位图。从性能的角度来看,它更好:做StretchXXXX
很重,而且从位图在屏幕上绘制比绘制DIB快得多(假设视频卡支持2D加速)。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- C++Matching Brackets 2解决方案不起作用
- 为什么这段代码不起作用,我该如何解决?
- 结合blits和gdi绘图(不起作用,blins)