我从事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中无法按预期设想显示。
以上是我在编程中出现的问题,希望能有高手给予解惑和探讨。
开始我使用一个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中无法按预期设想显示。
以上是我在编程中出现的问题,希望能有高手给予解惑和探讨。
解决方案 »
- 小堆栈情况下多次操作读取txt文件出现误差,求帮忙改进
- 图片只显示部分
- ON_UPDATE_COMMAND_UI 和ON_COMMAND的区别?
- 牛人帮帮我……
- WinXP下,设定启动某个进程时,可以设定它的优先级吗?谢谢!
- 网络变成大人帮忙,如何实现http断点续传?
- 读注册表错
- 用CBitmapButton怎么实现当鼠标经过时显示不同的图片?
- 关于CBITMAP的复制 删除等操作~~~~~~~~~~~~~跪求高手解答 在线等啊~~~ 帖子都不能顶了 跪求 解答
- 用GetContextMenuManager(),怎么让自定义菜单有的菜单项无效?
- 紧急(十万火急)!!!!!!!!!!!!!!!!!!!!(关于进制转换问题)
- 天啊,怎么办,CSOCKET中send(setbuf,20000)返加正确值,receive(receivebuf,20000),竟然要分成几段接收,怎么办啊大哥
2.在WM_KEYDOWN 中(键盘按键消息),根据按键方向,
计算光标移动的所需要刷新的区域大小,以left为例:
width =移动间隔+2*光标宽度
height=光标高度
InvalidateRect选取区域 再UpdateWindow(发送刷新消息,执行1步)这样做的程序可想而知,光标不可避免发生闪烁,但是只是在刷新区域内闪烁
这种效果不是蛮好吗?
你是想一点闪烁都没有?DOS下我做过棋类游戏,我的光标是自己画的,每次都画棋盘背景色在原光标上面,在新地方画上光标,这样一点也不闪。
DOS下应该是直接写屏吧,如果你在windows下用同样方式而不用DirectX
应该也会闪烁的。
看来"双缓冲"的办法还不如这种好,不知各位对图象闪烁和图象无闪烁平滑移动
还有什么高见?