windows gdi 位图问题

bajjiocc 2010-01-15 11:58:33
我在做一个小游戏,遇到个问题,就是我在按下有方向键的的时候,背景至移动了一次,按道理。只要我按方向键,他都会移动的,可现在只有第一次会产生位移,第二次就没反映了,长按也不行,下面是我的代码请高手指点

触发按键消息
case WM_KEYDOWN:
switch(wParam)
{
case VK_RIGHT:
keydown_right(hWnd, hBmp_BackGround);
break;
}


显示移动时的背景
void keydown_right(HWND hWnd, HBITMAP hBmp)
{
HDC hdcDest, hdcSrc;
HBITMAP hOldBmp;
int i;

hdcDest= GetDC(hWnd);
hdcSrc = CreateCompatibleDC( hdcDest );
hOldBmp = (HBITMAP)SelectObject( hdcSrc, hBmp );

x_left_prev = x_left_prev + DraMoveGap;
x_left_curr = x_left_prev;

x_right_prev = x_right_prev + DraMoveGap;
x_right_curr = x_right_prev;

StretchBlt(hdcDest, 0, 0, WndWidth, WndHeight, hdcSrc, x_left_curr, 0, x_left_curr +WndWidth , 600, SRCCOPY);

DeleteDC( hdcDest );
ReleaseDC (hWnd, hdcDest) ;

}

还望各位不吝赐教
...全文
82 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cattycat 2010-01-23
  • 打赏
  • 举报
回复
x_left_prev如果增加了相应的值,那就是你画的有问题了,不是keydown的问题,这个相当于滚动条向下滚动时画面改变的问题。
StretchBlt的源图像区域的左右和高宽范围得变才行,你先把那个bmp图像画在内存区域,创建一个MemDC,然后画到这个MemDC上,然后可以根据这个高度向下移动了,把MemDC的部分画到DestDC上。
tan870426 2010-01-15
  • 打赏
  • 举报
回复
友情UP
bajjiocc 2010-01-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhao4zhong1 的回复:]
将处理_down改成处理_up
因为长按一个键只有一次Down,但有多次Up
[/Quote]
我试了,一样的效果
我的意思是,长按和短按都一样,而且我也加了打印,x_left_prev每按一次都会增加相应的值,但就是背景至移动一次。
修改了StretchBlt函数,修改如下,主要是将源的宽度改成不变的
StretchBlt(hdcDest, 0, 0, WndWidth, WndHeight, hdcSrc, x_left_curr, 0, WndWidth , 600, SRCCOPY);
我现在怀疑很有可能是关于设备上下文的调用问题,SelectObject的第二个参数指明位图:CreateBitmap, CreateBitmapIndirect, CreateCompatible Bitmap, CreateDIBitmap, CreateDIBsection这些函数生成
可是我的第二个参数是加载的
hBmp_BackGround = (HBITMAP)LoadImage( NULL, szFileName_BackGround, IMAGE_BITMAP, 0, 0,LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE );
赵4老师 2010-01-15
  • 打赏
  • 举报
回复
将处理_down改成处理_up
因为长按一个键只有一次Down,但有多次Up

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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