弹出窗口中的HTCLIENT导致光标发生错误

时间:2020-05-01 03:18:02

标签: c winapi

下面是一个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 :(得分:0)

注册窗口类时没有设置类光标,也没有处理WM_SETCURSOR。文档解释了为什么这是一个问题:

WNDCLASSEX.hCursor

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

WM_SETCURSOR

DefWindowProc函数还使用此消息将光标设置为箭头(如果不在客户区域中),或者将其设置为已注册的类光标(如果其不在客户区域中)