+ -
当前位置:首页 → 问答吧 → 请问我错在哪儿,用按键就报错?

请问我错在哪儿,用按键就报错?

时间: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

HCURSOR WINAPI SetCursor(
  __in_opt  HCURSOR hCursor
);


楼主可据此检查修改。

作者: fight_in_dl   发布时间: 2011-12-18

应该是:
SetCursorPos

作者: schlafenhamster   发布时间: 2011-12-18

同意楼上的意见

作者: bluesky_ql   发布时间: 2011-12-18