hur.cn - 华软网

 热门搜索

我想通过按下键盘来移动图片,下面我写的代码为什么按下键盘后没有出现我想要的效果呢?

  作者:未知    来源:网络    更新时间:2011/6/24
#undef WINVER
#define WINVER 0x5000
#include <afxwin.h>
#include <Windows.h>
#include <Windowsx.h>
//全局变量定义区//
MSG msg;
HINSTANCE hInst;
HWND hWnd;
HDC hdc;
HDC mdc;
HBITMAP hbmp;
HBITMAP hbmp1;
RECT ClinetRect;
int x=0,y=0;
CString cs;
DWORD tNow;
//****自定义绘画函数*********************//
void MyPaint(HDC hdc)//一般装载图片
{
BitBlt(hdc,0,0,600,450,mdc,x,y,SRCCOPY);//贴图
}
void MyPaint1(HDC hdc)//透明效果
{

BitBlt(hdc,x,y,600,450,mdc,100,0,SRCAND);//贴图
BitBlt(hdc,x,y,600,450,mdc,0,0,SRCPAINT);//贴图
}

//****装载图片***************************//
void LoadMyImage(CString Image_name,int width,int height)
{
DeleteObject(hbmp);
hbmp=(HBITMAP)LoadImage(NULL,Image_name,IMAGE_BITMAP,width,height,LR_LOADFROMFILE);
if(hbmp==NULL)
{
AfxMessageBox("无法正确加载图片");
}
}
//****消息处理函数***********************//
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
switch(message)
{
case WM_KEYDOWN:
switch(wParam)
{
case VK_UP:
     y=y-10;
              return 0;
case VK_DOWN:
                        y=y+10;
      MyPaint1(hdc);
      break;
case VK_LEFT:
                        return 0;
case VK_RIGHT:
      return 0;
};
return 0;

case WM_CREATE:
hdc=GetDC(hWnd);
mdc=CreateCompatibleDC(hdc);
hbmp1=CreateCompatibleBitmap(hdc,600,450);
SelectObject(mdc,hbmp1);
return 0;

case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
LoadMyImage("画面.bmp",600,450);
SelectObject(mdc,hbmp);
MyPaint(hdc);
LoadMyImage("恐龙.bmp",100,100);
SelectObject(mdc,hbmp);
MyPaint1(hdc);
EndPaint(hWnd,&ps);
return 0;
case WM_DESTROY:
ReleaseDC(hWnd,hdc);
DeleteDC(mdc);
DeleteObject(hbmp);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;

}
//****定义及注册窗口类别函数*************//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.style=CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc=(WNDPROC)WndProc;//消息处理函数
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hInstance=hInstance;
wcex.hIcon=NULL;
wcex.hCursor=NULL;
wcex.hCursor=LoadCursor(NULL,IDC_ARROW);
wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszClassName=(LPCTSTR)"canvas";//类别名称
wcex.lpszMenuName=NULL;
wcex.hIconSm=NULL;
return RegisterClassEx(&wcex);
}

//****初始化函数*************************//
BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)
{

hInst=hInstance;
hWnd=CreateWindow((LPCTSTR)"canvas",(LPCTSTR)"绘图窗口",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,600,450,NULL,NULL,hInstance,NULL);
if(!hWnd)
{
return FALSE;
}
MoveWindow(hWnd,200,200,600,450,true);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);


return true;
}

//****主程序*****************************//
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{

MyRegisterClass(hInstance);
//运行初始化函数//
if(!InitInstance(hInstance,nCmdShow))
{return FALSE;}
//消息循环//
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return msg.wParam;
}
---华软 网友回答---
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
switch(message)
{
case WM_KEYDOWN:
switch(wParam)
{
case VK_UP:
y=y-10;
return 0;
case VK_DOWN:
  y=y+10;
MyPaint1(hdc);
break;
case VK_LEFT:
  return 0;
case VK_RIGHT:
}
SendMessage(hWnd,WM_PAINT,0,0);return 0;
};

---华软网友回复---
我按照你说的加了SendMessage(hWnd,WM_PAINT,0,0);但是图片还是不会移动呀,这怎么办呢?
---华软网友回复---
调Invalidate,不是MyPaint1(hdc);

---华软网友回复---
C++">case WM_KEYDOWN:
switch(wParam)
{
case VK_UP:
y=y-10;
return 0;
case VK_DOWN:
  y=y+10;
break;
case VK_LEFT:
  return 0;
case VK_RIGHT:
return 0;
};
InvalidateRect(hWnd....);

---华软网友回复---
用InvalidateRect()问题解决了,但是如果不用这个函数,单纯就直接SendMessage(hWnd,WM_PAINT,0,0);为什么图像就没有显示出来呢?还有,就是如果把InvalidateRect()写在switch(wParam)
{
case VK_UP:
y=y-10;
return 0;
case VK_DOWN:
  y=y+10;
break;
case VK_LEFT:
  return 0;
case VK_RIGHT:
return 0;
};
后面,图片的移动为什么会迟缓,我按了键盘,图片不能马上显示出来,如果在每一个case里面写,图片就可以马上显示出来,这又是为什么呢?
---华软网友回复---
invalidate就是告诉系统哪些区域是要在下一次paint时要重新绘制的。为了不闪烁,系统不会对没有变化的区域进行绘制。
---华软网友回复---
如果把InvalidateRect()写在switch(wParam)
{
case VK_UP:
y=y-10;
return 0;
case VK_DOWN:
  y=y+10;
break;
case VK_LEFT:
  return 0;
case VK_RIGHT:
return 0;
};
后面,图片的移动为什么会迟缓,我按了键盘,图片不能马上显示出来,如果在每一个case里面写,图片就可以马上显示出来,这又是为什么呢?
---华软网友回复---
因为:
1。SendMessage(hWnd,WM_PAINT,0,0);只有窗口有无效区,才发WM_PAINT
2。return 0;把控制权还回系统了,用break。

---华软网友回复---
问题解决了,谢谢你!!!!      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。