【问题标题】:Why doesn't the window set cursor correctly?为什么窗口没有正确设置光标?
【发布时间】:2012-07-02 08:05:44
【问题描述】:

作为MSDN describes:

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

如果应用程序将WM_SETCURSOR 传递给DefWindowProc,则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 应该“将光标设置为箭头光标”,但它似乎没有.这是为什么呢?

【问题讨论】:

  • 我复制。那篇文章是错误的,请按照 WM_SETCURSOR 的文档告诉您的内容。

标签: c winapi cursor


【解决方案1】:

查看WNDCLASSEX成员hCursor的说明:

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

WNDCLASSEX structure

【讨论】:

  • @EFanZh 换句话说,您必须在事件循环中处理 WM_CURSOR。
  • 那为什么 MSDN 说DefWindowProc 将充当“如果没有类光标,请将光标设置为箭头光标。”?
  • @EFanZh 我不知道。这显然是教程中的错误,不是官方API文档。
猜你喜欢
  • 1970-01-01
  • 2014-08-05
  • 2015-10-30
  • 2023-03-11
  • 2020-04-19
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多