HTCLIENT во всплывающем окне вызывает ошибку курсора - PullRequest
0 голосов
/ 01 мая 2020

Ниже находится окно WS_POPUP, его процедура всегда возвращает HTCLIENT при WM_NCHITTEST. Курсор превращается в ожидающий (синий диск) всякий раз, когда он входит в окно. Этого не происходит, когда я возвращаю HTNOWHERE для примера.

#define UNICODE
#include <windows.h>

LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT uMsg, WPARAM wp, LPARAM lp){
    switch(uMsg){
        case WM_NCHITTEST: return HTCLIENT;
        default: return DefWindowProc(hWnd, uMsg, wp, lp);
    }
}

int main(void){
    WNDCLASSEX wcx = {};
    wcx.cbSize = sizeof(WNDCLASSEX);
    wcx.lpfnWndProc = WindowProcedure;
    wcx.hbrBackground = CreateSolidBrush(RGB(0, 0, 0));
    wcx.lpszClassName = L"Win32Class";
    RegisterClassEx(&wcx);

    HWND hWnd = CreateWindowEx(WS_EX_APPWINDOW, wcx.lpszClassName, L"Title",
    WS_POPUP, 150, 150, 512, 256, NULL, NULL, NULL, NULL);
    ShowWindow(hWnd, 1);

    MSG msg; while(GetMessage(&msg, NULL, 0, 0)){
        DispatchMessage(&msg);
    }
}

1 Ответ

0 голосов
/ 01 мая 2020

Вы не устанавливаете курсор класса, когда регистрируете свой класс окна, и вы также не обрабатываете WM_SETCURSOR. Документы объясняют, почему это проблема:

WNDCLASSEX.hCursor :

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

WM_SETCURSOR :

Функция DefWindowPro c также использует это сообщение, чтобы установить курсор на стрелку, если он не находится в клиентской области, или на зарегистрированный курсор , если он находится в клиентской области .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...