2012-07-02 4 views
0

В MSDN describes:Почему окно не правильно установлено?

Когда курсор мыши над окном, окно получает сообщение WM_SETCURSOR (если другое окно не захватила мышь).

Если приложение переходит к WM_SETCURSORDefWindowProc, функция DefWindowProc использует следующий алгоритм, чтобы установить изображение курсора:

  1. Если окно имеет родитель, переслать сообщение WM_SETCURSOR родителя для обработки.
  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.hCursor в LoadCursor(NULL, IDC_ARROW), все будет в порядке. Мой вопрос: почему мой код не работает, как говорит MSDN?

Я имею в виду, если я не установлю wcex.hCursor, и я не обрабатывать WM_SETCURSOR сообщения, DefWindowProc должен «установить курсор на стрелку курсора», но мне кажется, это не так. Почему это?

+2

I Репрографический. Эта статья просто неверна, переходите к тому, что вам сообщает документ для WM_SETCURSOR. –

ответ

3

См описание hCursor члена WNDCLASSEX:

Дескриптор класса курсора. Этот член должен быть дескриптором курсора ресурса. Если этот член равен NULL, приложение должно явно установить форму курсора всякий раз, когда мышь перемещается в окно приложения .

WNDCLASSEX structure

+1

@EFanZh другими словами, вы должны обрабатывать WM_CURSOR в вашем цикле событий. – RedX

+0

Тогда почему MSDN говорит, что 'DefWindowProc' будет действовать как« Если курсор не существует, установите курсор на стрелку стрелки »? – EFanZh

+0

@EFanZh Я не знаю. Это, по-видимому, ошибка в учебнике, который не является официальной документацией API. –