问题
在Windows上,对于I型光标,似乎为“鼠标按下按钮”事件返回的坐标略有错误。基本上,x坐标总是比它应该保留的位置还剩两个像素。
我编写了一个非常简单的win32程序来演示该问题。它所做的只是将光标变成一个IBeam,并在最后一次按下鼠标事件的位置绘制一条垂直的红线。我希望红线与工字梁的垂直部分完全匹配,但事实并非如此。
Here's a screenshot of what happens。
正如您所看到的,红线在它应该位于的位置左边两像素(此行为对于标准箭头指针是正确的,因此看来I形光标的热点是错误的。
我让其他人运行Windows 7 64位版确认他们遇到相同的问题,但是Vista上的另一台测试仪没有此问题。
有关我的环境的一些信息
相关代码位
我的测试项目基本上是Visual C ++ 2010中的“ Win32项目”模板,下面列出了所做的更改。
这是我在其中注册窗口类并将光标设置为I Beam的代码
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_CURSOR_TEST));
wcex.hCursor = LoadCursor(NULL, IDC_IBEAM); // this is the only line I changed in this function
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_CURSOR_TEST);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassEx(&wcex);
}
这里是我的主消息循环中的相关部分:
case WM_LBUTTONDOWN:
// record position of mouse down.
// xPos and yPos are just declared as
// global ints for the purpose of this test
xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);
// cause redraw
InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);
break;
case WM_PAINT:
// paint vertical red line at position of last click
hdc = BeginPaint(hWnd, &ps);
RECT rcClient;
GetClientRect(hWnd, &rcClient);
hPen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
SelectObject(hdc, hPen);
MoveToEx(hdc, xPos, 0, NULL);
LineTo(hdc, xPos, rcClient.bottom);
DeleteObject(hPen);
EndPaint(hWnd, &ps);
break;
摘要
我已经完成了很多搜寻,但找不到任何相关的答案。我处理传入光标坐标的方式有问题吗?
谢谢!
编辑:评论中有见地的问题后的更多信息
按照@Mark Ransom在评论中的指导,我已经使用GetIconInfo
函数来获取有关I型光束光标的更多信息。光标的ICONINFO
结构指示光标热点的x坐标为x = 8。但是,当我转储光标的位图(hbmMask
结构的ICONINFO
成员,因为它是单色光标)时,垂直条距图像左侧10个像素,而不是8个像素。正如Mark所指出的,这可能是视觉差异的原因,但是为什么会发生这种差异,我该如何解决呢?
((我还注意到this other question的答案中有一些有趣的信息,涉及处理I-Beam游标的不同方式。我想知道这是否相关)
这困扰了我很多年,显然还有许多其他Windows用户?您是否曾经单击过两个字符之间,但是文本插入符号的结尾距离左侧太远了?您的光标显然在其他两个光标之间!