小弟有三个问题:问题一:就是如何不用双缓冲绘图,贴图BMP的时候一般不都是先CDC dcmem这种双缓冲方式。但是我现在只要求速度,能接受闪一下,突然发现,非爽缓冲的贴图方式不会了求解答。问题二:通过GetDC(NULL)可以获得全屏DC,然后可以全屏贴图,但是当我想更换另外一张图时,是覆盖在原图上面的,并且只要你不覆盖贴图的地方,那张图会一直显示在那里。请问如何在全屏贴图前先去掉原来的图???问题三:一些突然弹出窗后覆盖在你的全屏图片上后,会产生一个缺口,请问如何检测这个消息并进行重绘呢?

解决方案 »

  1.   

    2、3问题可以在绘完图后调用Invalidate 函数
      

  2.   

    1.似乎位图必须选入兼容DC后,再贴回显示DC才能显示
    2.可以先取得全屏大小,先在兼容DC上绘制一个底色来覆盖原有内容
    3......
      

  3.   

    2. 贴新图之前先将以前的图擦除,获得之前图片的Rect,时候使用画刷,完后才绘制你要贴的图
    3. 出现空洞,说明你的OnPaint函数内部没有调用绘制图片相关的函数。避免办法,所有的绘制在你的OnPaint函数内部绘制。
      

  4.   

    SetDIBitsToDevice() & StretchDIBits()不需要memdc..
      

  5.   

    1. 追求速度的时候不要用内存兼容DC这样的方式,直接将位图数据映射到设备场境,比方
    ::SetDIBitsToDevice()倒数第三个参数直接指向数据,可以是文件读来或者任意创建的内存块,倒数第二个参数指向一个BITMAPINFOHEADER。2. 显示前刷新背景3. 在OnDraw里面绘图,有屏幕刷新时自动重绘。
      

  6.   

    2 & 3貌似想在桌面上操作,那会非常的复杂哦.
      

  7.   

    happyparrot兄:
    第二个问题和我想的类似,我想的是用截图的方式截取贴图前的背景,然后在贴图前先绘制一遍背景,然后贴其他的图。
    问题三,我是在CreateWindow上贴图的,但是因为这个window是HTMLwindow。总是贴不上去,没办法只好全屏贴图,贴上后就会出现被覆盖的情况。可是我的这个窗口是在主程序窗口上的,并不响应主程序的OnPaint消息隐藏无法重绘...问题比较麻烦...
      

  8.   

    可以的话,new个window贴图,换图就把它del掉,然后在new来帖然后show..btw:万不得已也不要抓图~~~
      

  9.   

    将你的全屏窗口设置为TopMost不过还是建议用双缓冲
    用CreateCompatibleDC创建与绘图窗口兼容的内存DC,在内存DC中绘图, 可以在全屏窗口内用内存DC先绘好背景,再叠加其他图,这样窗口内容能保持,不被其他窗口抹掉。 
    然后在OnPaint里再用BitBlt拷到窗口DC 
      

  10.   

    谢谢,目前发现用createwindow再给上面贴图似乎更加方便
      

  11.   

    1. 那种方式不算双缓冲。
    2. 没看明白,应该刷新一下即可。
    3. 在OnPaint内处理应该不会有这种情况发生吧?
      

  12.   

    问题1,网上有很多例子
    问题2,用BitBlt把先前的图复制一下
    问题3,把绘制放在OnPaint里,如果某个区域无效,会自动调用绘制的。
      

  13.   

    我没把环境说清楚,主程序是一个对话框,然后在对话框上面有一个显示HTML的窗口,在HTML窗口上再全屏贴图,也就是说主对话框的OnPaint无法响应HTML窗口或者全屏贴图的消息,也就是说无法得知什么时候全屏贴图被覆盖了需要重绘。这个问题困扰了很久。现在采用了另一种方法,在主对话框上用createwindow再创建一个窗口,并用HWND_TOP将其放在HTML窗口上面,这样重绘就很好获取了,唯一遗憾的是有一些move的动态效果,移动位图很快,但移动窗口就要慢一些了。