2012-07-02 5 views
0

MSDN describes로서 :왜 창 세트 커서가 올바르게 표시되지 않습니까?

창 위에 마우스 이동, 윈도우가 WM_SETCURSOR 메시지를 수신한다 (다른 윈도우 마우스를 포착하지 않는 한). 윈도우는 부모가

  1. 경우 취급이 부모를 WM_SETCURSOR 메시지를 전달할 :

    어플리케이션 DefWindowProc-WM_SETCURSOR를 통과하면

    상기 DefWindowProc 함수 커서 이미지 세트의 다음 알고리즘을 사용한다.
  2. 그렇지 않으면 창에 클래스 커서가있는 경우 커서를 클래스 커서로 설정하십시오.
  3. 클래스 커서가없는 경우 커서를 화살표 커서로 설정하십시오. 그것은 크기 조정 화살표가 나는 창을 통해 빠르게 내 커서를 이동하면

    #include <tchar.h> 
    #include <Windows.h> 
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 
    
    int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInsTance, LPTSTR lpCmdLine, int nCmdShow) 
    { 
        WNDCLASSEX wcex = { 0 }; 
        HWND hWnd; 
        BOOL ret; 
        MSG msg; 
    
        wcex.cbSize = sizeof(wcex); 
        wcex.lpfnWndProc = WndProc; 
        wcex.hInstance = hInstance; 
        wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
        // wcex.hCursor = LoadCursor(NULL, IDC_ARROW); 
        wcex.lpszClassName = TEXT("MainWindow"); 
        wcex.hIconSm = wcex.hIcon; 
    
        RegisterClassEx(&wcex); 
        hWnd = CreateWindow(wcex.lpszClassName, TEXT("Test"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, NULL, hInstance, NULL); 
    
        ShowWindow(hWnd, nCmdShow); 
        UpdateWindow(hWnd); 
    
        while (ret = GetMessage(&msg, NULL, 0, 0)) 
        { 
        if (ret == -1) 
        { 
         return EXIT_FAILURE; 
        } 
        else 
        { 
         TranslateMessage(&msg); 
         DispatchMessage(&msg); 
        } 
        } 
        return msg.wParam; 
    } 
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
    { 
        switch (uMsg) 
        { 
        case WM_DESTROY: 
        PostQuitMessage(EXIT_SUCCESS); 
        break; 
        default: 
        return DefWindowProc(hWnd, uMsg, wParam, lParam); 
        } 
        return 0; 
    } 
    

    가, 커서가 화살표로 변경되지 않습니다 :

그리고 여기 내 소스 코드의 wcex.hCursorLoadCursor(NULL, IDC_ARROW)으로 설정하면 모든 것이 올바르게 수행됩니다. 내 질문은 : MSDN에서 말하는 것처럼 내 코드가 작동하지 않는 이유는 무엇입니까? 의 DefWindowProc는 "화살표 커서 커서를 설정"해야 내가 wcex.hCursor를 설정하지 않고, 나는 WM_SETCURSOR 메시지를 처리하지 않는 경우

는 내 말은,하지만 그렇지 않은 것 같다. 왜 그런가요? WNDCLASSEXhCursor 회원의

+2

나는 repro 수. 이 기사는 WM_SETCURSOR의 문서에서 알 수있는대로 잘못되었습니다. –

답변

3

설명을 참조 :

클래스 커서에 대한 핸들. 이 멤버는 커서 리소스에 대한 핸들이어야합니다. 이 멤버가 NULL 인 경우, 마우스가 응용 프로그램의 창으로 이동할 때마다 응용 프로그램이 명시 적으로 커서 모양을 으로 설정해야합니다.

WNDCLASSEX structure

+1

@EFanZh 즉, 이벤트 루프에서 WM_CURSOR를 처리해야합니다. – RedX

+0

그런 다음 MSDN에서 DefWindowProc가 "클래스 커서가없는 경우 화살표 커서에 커서를 놓습니다."라고 말하는 이유는 무엇입니까? – EFanZh

+0

@EFanZh 잘 모르겠습니다. 이것은 공식적인 API 문서가 아닌이 튜토리얼의 실수 인 것 같습니다. –

관련 문제