0

MSDNが説明しているように:

マウスがウィンドウ上を移動すると、ウィンドウはWM_SETCURSORメッセージを受け取ります (別のウィンドウがマウスをキャプチャしていない場合)。

アプリケーションが に渡さWM_SETCURSORれた場合DefWindowProcDefWindowProc関数は次のアルゴリズムを使用してカーソル イメージを設定します。

  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.hCursorLoadCursor(NULL, IDC_ARROW)すべて問題ありません。私の質問は: MSDN が言うようにコードが機能しないのはなぜですか?

つまり、 を設定せず、メッセージをwcex.hCursor処理しない場合、 「カーソルを矢印カーソルに設定する」必要がありますが、そうではないようです。何故ですか?WM_SETCURSORDefWindowProc

4

1 に答える 1