Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用自定义光标强制WM_NCHITTEST返回HTCAPTION。。?_C++_Winapi_User Interface_Cursor_Message - Fatal编程技术网

C++ 使用自定义光标强制WM_NCHITTEST返回HTCAPTION。。?

C++ 使用自定义光标强制WM_NCHITTEST返回HTCAPTION。。?,c++,winapi,user-interface,cursor,message,C++,Winapi,User Interface,Cursor,Message,我创建了一个无边界窗口,它使用一个wndProc()函数强制WM\u nchitest case返回HTCAPTION,允许用户拖动窗口,无论光标位于何处。 问题是我已经设置了一个自定义光标,但是使用上述方法,光标总是被设置回IDC\u ARROW 如何修复此问题? 编辑:我还尝试在WM\u-nchitest案例中使用SetCursor(),但是它不起作用。除了在WM\u-NCHITTEST中设置光标之外,还尝试在WM\u-SetCursor中设置光标。通常设置光标的正确方法是响应WM\u-Se

我创建了一个无边界窗口,它使用一个
wndProc()
函数强制
WM\u nchitest case
返回
HTCAPTION,允许用户拖动窗口,无论光标位于何处。
问题是我已经设置了一个自定义光标,但是使用上述方法,光标总是被设置回
IDC\u ARROW

如何修复此问题?


编辑:我还尝试在
WM\u-nchitest案例中使用
SetCursor()
,但是它不起作用。

除了在
WM\u-NCHITTEST
中设置光标之外,还尝试在
WM\u-SetCursor
中设置光标。

通常设置光标的正确方法是响应
WM\u-SetCursor
消息。(另见)


但是,如果您在捕获鼠标的位置处理鼠标拖动,您的窗口将不会收到
WM\u SETCURSOR
消息,我认为唯一的替代方法是在
WM\u MOUSEMOVE
处理程序中设置光标。lParam的LOWORD表示命中测试代码,即使用WM_NCHITTEST处理程序修改的代码。这很有效:

static HCURSOR CustomCursor;

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_NCHITTEST: {
        LRESULT result = DefWindowProc(hWnd, message, wParam, lParam);
        if (result == HTCLIENT) result = HTCAPTION;             
        return result;
    }
    case WM_SETCURSOR: 
        if (LOWORD(lParam) == HTCAPTION) {
            SetCursor(CustomCursor);
            return TRUE;
        }
        return DefWindowProc(hWnd, message, wParam, lParam);
    // etc...
}
在窗口初始化中初始化CustomCursor。说:

CustomCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_SIZEALL));

我想也许你需要提供更多关于你一直在尝试的细节,就像我告诉你的那样。在我的wndProc()中,我有一个案例:WM_NCHITTEST总是返回HTCAPTION。我尝试在其中、WM_SetCursor和WM_MOUSEMOVE中添加SetCursor()调用。描述不能替代代码。您是否在消息处理程序中返回正确的值?如果您正在使用ATL,是否正在设置
bHandled
标志?鼠标按钮按下了吗?您是否正在使用
SetCapture
?等等,嗯。。我不确定这里发生了什么,但我的
WndProc
看起来完全不同。。它更像这样:
LRESULT回调WndProc(HWND HWND,UINT msg,WPARAM WPARAM,LPARAM LPARAM){switch(msg){case WM\n chittest:return HTCAPTION;break;//more cases}返回DefWindowProc(HWND,msg,WPARAM,LPARAM);}
Eh。。正确的。。注释中没有换行符。。好吧,你应该从中得到灵感。效果很好。非常感谢。我必须
返回1
WM_SETCURSOR
中,这就是你的答案不起作用的原因。