为什么窗口没有正确设置光标?

时间:2012-07-02 08:05:44

标签: c winapi cursor

作为MSDN describes

  

当鼠标在窗口上移动时,窗口会收到WM_SETCURSOR消息(除非另一个窗口捕获了鼠标)。

     

如果应用程序将WM_SETCURSOR传递给DefWindowProc,则DefWindowProc函数使用以下算法设置光标图像:

     
      
  1. 如果窗口中有父级,请将WM_SETCURSOR消息转发给要处理的父级。
  2.   
  3. 否则,如果窗口有一个类光标,则将光标设置为类光标。
  4.   
  5. 如果没有类光标,请将光标设置为箭头光标。
  6.   

这是我的源代码:

#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应该“将光标设置为箭头光标”,但是它似乎没有。那是为什么?

1 个答案:

答案 0 :(得分:3)

请参阅hCursor的{​​{1}}成员说明:

  

类游标的句柄。该成员必须是游标的句柄   资源。如果此成员为NULL,则必须显式设置应用程序   鼠标移动到应用程序时的光标形状   窗口。

WNDCLASSEX structure