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
中,这就是你的答案不起作用的原因。