我从事SDK开发,正在做一个棋类游戏,用位图做棋盘,另外加上键盘控制功能,所以需要一个光标。
开始我使用一个ICON做光标 使用DrawIcon很容易就实现了用键盘控制光标在位图棋盘上移动:
1.我将棋盘显示和光标显示都放在WM_PAINT中 就是类似onpaint()
  BitBlt(); DrawIcon
2.在WM_KEYDOWN 中(键盘按键消息),根据按键方向,
  计算光标移动的所需要刷新的区域大小,以left为例:
  width =移动间隔+2*光标宽度
  height=光标高度
  InvalidateRect选取区域 再UpdateWindow(发送刷新消息,执行1步)这样做的程序可想而知,光标不可避免发生闪烁,但是只是在刷新区域内闪烁,我仔细看了“双缓冲解决图象闪烁...”一文,发现只是用了极简单的原理,和我程序不同的地方是加了在SelectObject前用颜色填充内存DC再显示。于是我同样加上了
填充色。问题还是没解决。我回想了一下,是不是那篇文章只是针对一次刷新显示一张图象,而不能针对一次刷新连续显示两张图片。过了一阵,我想到了一个办法,就是将棋盘先给内存DC(即用CreateCompatibleDC建立的),然后将光标也给同一个的DC,再将内容显示在屏幕DC中,发现光标根本显示不出来,只有更新区域会闪烁。:)在尝试中我还发现,在WM_PAINT中 使用
hMemDC=CreateCompatibleDC(...);
SelectObject(hMemDC,..HICON...)//将ICON给HMemDC
Bitblt....
DelectObject()
DeleteDC()Select一句中,HICON在hMemDC中的位置因为多次调用,每次都不一样
导致在BitBlt中无法按预期设想显示。
以上是我在编程中出现的问题,希望能有高手给予解惑和探讨。

解决方案 »

  1.   

    代码
    2.在WM_KEYDOWN 中(键盘按键消息),根据按键方向,
      计算光标移动的所需要刷新的区域大小,以left为例:
      width =移动间隔+2*光标宽度
      height=光标高度
      InvalidateRect选取区域 再UpdateWindow(发送刷新消息,执行1步)这样做的程序可想而知,光标不可避免发生闪烁,但是只是在刷新区域内闪烁
    这种效果不是蛮好吗?
    你是想一点闪烁都没有?DOS下我做过棋类游戏,我的光标是自己画的,每次都画棋盘背景色在原光标上面,在新地方画上光标,这样一点也不闪。
      

  2.   

    棋盘背景色是指纯色吗,我的棋盘五颜六色,怎么办?
    DOS下应该是直接写屏吧,如果你在windows下用同样方式而不用DirectX
    应该也会闪烁的。
      

  3.   

    响应WM_ERASEBKGND,什么也不要做,直接返回TRUE。希望对你有所帮助。
      

  4.   

    谢谢 demetry(大松)  确实不闪烁了,准确地说是看不到白色背景了,
    看来"双缓冲"的办法还不如这种好,不知各位对图象闪烁和图象无闪烁平滑移动
    还有什么高见?
      

  5.   

    呵呵,在WM_ERASEBKGND中直接返回TRUE是"双缓冲"的第一步。