2012-07-02 53 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

我的攝製。那篇文章是錯誤的,按照WM_SETCURSOR的文檔告訴你。 –

回答

3

WNDCLASSEXhCursor構件的描述見:

的句柄類光標。該成員必須是光標 資源的句柄。如果此成員爲NULL,則每當鼠標移動到應用程序的 窗口中時,應用程序都必須明確地設置光標形狀 。

WNDCLASSEX structure

+1

@EFanZh換句話說,你必須在你的事件循環中處理WM_CURSOR。 – RedX

+0

那麼爲什麼MSDN會說'DefWindowProc'將作爲「如果沒有類遊標,請將光標設置爲箭頭光標。」? – EFanZh

+0

@FanZh我不知道。本教程顯然是一個錯誤,它不是官方的API文檔。 –