求助,关于非双缓冲贴图和全屏重绘

chxy85 2009-08-04 09:24:36
小弟有三个问题:

问题一:就是如何不用双缓冲绘图,贴图BMP的时候一般不都是先CDC dcmem这种双缓冲方式。但是我现在只要求速度,能接受闪一下,突然发现,非爽缓冲的贴图方式不会了。。。求解答。

问题二:通过GetDC(NULL)可以获得全屏DC,然后可以全屏贴图,但是当我想更换另外一张图时,是覆盖在原图上面的,并且只要你不覆盖贴图的地方,那张图会一直显示在那里。请问如何在全屏贴图前先去掉原来的图???

问题三:一些突然弹出窗后覆盖在你的全屏图片上后,会产生一个缺口,请问如何检测这个消息并进行重绘呢?
...全文
170 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
oldmanzhao 2009-08-06
  • 打赏
  • 举报
回复
问题1,网上有很多例子
问题2,用BitBlt把先前的图复制一下
问题3,把绘制放在OnPaint里,如果某个区域无效,会自动调用绘制的。
Fireway2008 2009-08-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 chxy85 的回复:]
小弟有三个问题:

问题一:就是如何不用双缓冲绘图,贴图BMP的时候一般不都是先CDC dcmem这种双缓冲方式。但是我现在只要求速度,能接受闪一下,突然发现,非爽缓冲的贴图方式不会了。。。求解答。

问题二:通过GetDC(NULL)可以获得全屏DC,然后可以全屏贴图,但是当我想更换另外一张图时,是覆盖在原图上面的,并且只要你不覆盖贴图的地方,那张图会一直显示在那里。请问如何在全屏贴图前先去掉原来的图???

问题三:一些突然弹出窗后覆盖在你的全屏图片上后,会产生一个缺口,请问如何检测这个消息并进行重绘呢?
[/Quote]
1. 那种方式不算双缓冲。
2. 没看明白,应该刷新一下即可。
3. 在OnPaint内处理应该不会有这种情况发生吧?
chxy85 2009-08-06
  • 打赏
  • 举报
回复
我没把环境说清楚,主程序是一个对话框,然后在对话框上面有一个显示HTML的窗口,在HTML窗口上再全屏贴图,也就是说主对话框的OnPaint无法响应HTML窗口或者全屏贴图的消息,也就是说无法得知什么时候全屏贴图被覆盖了需要重绘。这个问题困扰了很久。现在采用了另一种方法,在主对话框上用createwindow再创建一个窗口,并用HWND_TOP将其放在HTML窗口上面,这样重绘就很好获取了,唯一遗憾的是有一些move的动态效果,移动位图很快,但移动窗口就要慢一些了。
szy41 2009-08-06
  • 打赏
  • 举报
回复
mark
chxy85 2009-08-05
  • 打赏
  • 举报
回复
谢谢,目前发现用createwindow再给上面贴图似乎更加方便
WooSir 2009-08-05
  • 打赏
  • 举报
回复
将你的全屏窗口设置为TopMost

不过还是建议用双缓冲
用CreateCompatibleDC创建与绘图窗口兼容的内存DC,在内存DC中绘图, 可以在全屏窗口内用内存DC先绘好背景,再叠加其他图,这样窗口内容能保持,不被其他窗口抹掉。
然后在OnPaint里再用BitBlt拷到窗口DC
  • 打赏
  • 举报
回复
up
chxy85 2009-08-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lambochan 的回复:]
可以的话,new个window贴图,换图就把它del掉,然后在new来帖然后show..

btw:万不得已也不要抓图~~~
[/Quote]

求详解~~~
lambochan 2009-08-04
  • 打赏
  • 举报
回复
可以的话,new个window贴图,换图就把它del掉,然后在new来帖然后show..

btw:万不得已也不要抓图~~~
chxy85 2009-08-04
  • 打赏
  • 举报
回复
谢谢,谢谢各位.0.
chxy85 2009-08-04
  • 打赏
  • 举报
回复
happyparrot兄:
第二个问题和我想的类似,我想的是用截图的方式截取贴图前的背景,然后在贴图前先绘制一遍背景,然后贴其他的图。
问题三,我是在CreateWindow上贴图的,但是因为这个window是HTMLwindow。总是贴不上去,没办法只好全屏贴图,贴上后就会出现被覆盖的情况。可是我的这个窗口是在主程序窗口上的,并不响应主程序的OnPaint消息隐藏无法重绘...问题比较麻烦...
lambochan 2009-08-04
  • 打赏
  • 举报
回复
2 & 3貌似想在桌面上操作,那会非常的复杂哦.
副组长 2009-08-04
  • 打赏
  • 举报
回复
1. 追求速度的时候不要用内存兼容DC这样的方式,直接将位图数据映射到设备场境,比方
::SetDIBitsToDevice()倒数第三个参数直接指向数据,可以是文件读来或者任意创建的内存块,倒数第二个参数指向一个BITMAPINFOHEADER。

2. 显示前刷新背景

3. 在OnDraw里面绘图,有屏幕刷新时自动重绘。
lambochan 2009-08-04
  • 打赏
  • 举报
回复
SetDIBitsToDevice() & StretchDIBits()不需要memdc..
雪影 2009-08-04
  • 打赏
  • 举报
回复
2. 贴新图之前先将以前的图擦除,获得之前图片的Rect,时候使用画刷,完后才绘制你要贴的图
3. 出现空洞,说明你的OnPaint函数内部没有调用绘制图片相关的函数。避免办法,所有的绘制在你的OnPaint函数内部绘制。
hhwei1985 2009-08-04
  • 打赏
  • 举报
回复
UP
快乐鹦鹉 2009-08-04
  • 打赏
  • 举报
回复
1.似乎位图必须选入兼容DC后,再贴回显示DC才能显示
2.可以先取得全屏大小,先在兼容DC上绘制一个底色来覆盖原有内容
3......
Ghost90 2009-08-04
  • 打赏
  • 举报
回复
2、3问题可以在绘完图后调用Invalidate 函数
caitian6 2009-08-04
  • 打赏
  • 举报
回复
up
chxy85 2009-08-04
  • 打赏
  • 举报
回复
加载更多回复(1)

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧