控件间隙处光标显示默认箭头,如何设置为自定义cursn?
解决控件间隙显示默认光标问题
这个问题我之前也碰到过——控件之间的空白区域属于主窗口的客户区,你只给控件单独设置了自定义光标,但主窗口本身的光标还是默认的IDC_ARROW,所以才会出现这个情况。下面给你两个可行的解决方案:
方法一:直接修改主窗口类的光标
在注册主窗口类的时候,把窗口类的hCursor直接设置为你的cursn光标,这样整个窗口(包括空白区域)都会统一使用这个光标:
WNDCLASSEX wc = {0}; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WindowProc; // 你的窗口过程 wc.hInstance = hInstance; wc.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(151)); // 直接指定cursn资源 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszClassName = L"MyWindowClass"; RegisterClassEx(&wc);
这种方法操作简单,适合整个窗口只需要一种自定义光标的场景。
方法二:通过WM_SETCURSOR消息自定义光标逻辑
如果需要更灵活的控制(比如主窗口不同区域用不同光标),可以在主窗口的消息过程里处理WM_SETCURSOR消息,手动判断光标位置并设置:
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_SETCURSOR: // 判断当前光标是否在主窗口的客户区 if (LOWORD(lParam) == HTCLIENT) { // 检查光标是否不在任何子控件上(即处于空白区域) POINT pt; GetCursorPos(&pt); ScreenToClient(hwnd, &pt); HWND hChild = ChildWindowFromPoint(hwnd, pt); if (hChild == NULL || hChild == hwnd) { // 设置为cursn光标 SetCursor(cursn); return TRUE; // 告诉系统我们已处理光标设置,无需默认处理 } } // 其他情况交给系统默认处理 return DefWindowProc(hwnd, uMsg, wParam, lParam); // 其他消息处理... case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } }
这段代码会先判断光标是否在客户区,再检查是否落在子控件上——如果不在任何控件上,就设置为cursn光标,完美解决间隙区域的光标问题。
如果你的主窗口是对话框,只需要把这个逻辑放到对话框的消息过程(比如DlgProc)里就行。
内容的提问来源于stack exchange,提问作者user13947011
相关产品推荐
相关产品推荐

