请问我错在哪儿,用按键就报错?
时间:2011-12-18
来源:互联网
这是windows程序设计那本书上的例题,用鼠标点击矩形还可以,可是用键盘立马报错,问题肯定出在WM_KEYDOWN那里了,请问错哪儿了?C/C++ code
#include <windows.h> #include <windows.h> #define DIVSIONS 5 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ){ static TCHAR WndName[]=TEXT("NCHITTEST"); WNDCLASS wndclass; HWND hwnd; MSG msg; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); wndclass.hIcon = LoadCursor(NULL,IDI_APPLICATION); wndclass.hInstance = hInstance; wndclass.lpfnWndProc = WndProc; wndclass.lpszClassName = WndName; wndclass.lpszMenuName = NULL; wndclass.style = CS_HREDRAW|CS_VREDRAW; if (!RegisterClass(&wndclass)) { MessageBox(NULL,TEXT("systemerror!"),WndName,MB_ICONERROR); return 0; } hwnd = CreateWindow(WndName,TEXT("HITTEST"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL,NULL,hInstance,NULL); ShowWindow(hwnd,nShowCmd); UpdateWindow(hwnd); while(GetMessage(&msg,NULL,0,0)){ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){ static BOOL fState[DIVSIONS][DIVSIONS]; static int cxblock,cyblock; HDC hdc; int x,y; PAINTSTRUCT ps; RECT rect; POINT point; switch(message){ case WM_SIZE: cxblock=LOWORD(lParam)/DIVSIONS; cyblock=HIWORD(lParam)/DIVSIONS; return 0; case WM_SETFOCUS: ShowCursor(TRUE); return 0; case WM_KILLFOCUS: ShowCursor(FALSE); return 0; case WM_KEYDOWN: GetCursorPos(&point); ScreenToClient(hwnd,&point); x=max(0,min(DIVSIONS-1,point.x/cxblock)); y=max(0,min(DIVSIONS-1,point.y/cyblock)); switch(wParam){ case VK_UP: --y; break; case VK_DOWN: ++y; break; case VK_LEFT: --x; break; case VK_RIGHT: ++x; break; case VK_HOME: x=y=0; break; case VK_END: x=y=DIVSIONS-1; break; case VK_RETURN: case VK_SPACE: SendMessage(hwnd,WM_LBUTTONDOWN,MK_LBUTTON,MAKELONG(x*cxblock,y*cyblock)); break; } x=(x+DIVSIONS)%DIVSIONS; y=(y+DIVSIONS)%DIVSIONS; point.x=x*cxblock+cxblock/2; point.y=y*cyblock+cyblock/2; ClientToScreen(hwnd,&point); SetCursor(point.x,point.y); return 0; case WM_LBUTTONDOWN: x=LOWORD(lParam)/cxblock; y=HIWORD(lParam)/cyblock; if(x<DIVSIONS&&y<DIVSIONS){ fState[x][y]^=1; rect.left=x*cxblock; rect.top=y*cyblock; rect.right=(x+1)*cxblock; rect.bottom=(y+1)*cyblock; InvalidateRect(hwnd,&rect,FALSE); } else MessageBeep(0); return 0; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); for(x=0;x<DIVSIONS;++x) for(y=0;y<DIVSIONS;++y){ Rectangle(hdc,x*cxblock,y*cyblock,(x+1)*cxblock,(y+1)*cyblock); if(fState[x][y]){ MoveToEx(hdc,x*cxblock,y*cyblock,NULL); LineTo(hdc,(x+1)*cxblock,(y+1)*cyblock); MoveToEx(hdc,(x+1)*cxblock,y*cyblock,NULL); LineTo(hdc,x*cxblock,(y+1)*cyblock); } } EndPaint(hwnd,&ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,message,wParam,lParam); }
作者: Angle_sean3 发布时间: 2011-12-18
帮楼主上机调试,发现SetCursor(point.x,point.y);有错,提示为:
error C2660: 'SetCursor' : function does not take 2 parameters
SetCursor函数原型应为:
C/C++ code
楼主可据此检查修改。
error C2660: 'SetCursor' : function does not take 2 parameters
SetCursor函数原型应为:
C/C++ code
HCURSOR WINAPI SetCursor(
__in_opt HCURSOR hCursor
);
楼主可据此检查修改。
作者: fight_in_dl 发布时间: 2011-12-18
应该是:
SetCursorPos
SetCursorPos
作者: schlafenhamster 发布时间: 2011-12-18
同意楼上的意见
作者: bluesky_ql 发布时间: 2011-12-18
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28