Windows 7中I型光标的热点不正确?

问题描述 投票:5回答:1

问题

在Windows上,对于I型光标,似乎为“鼠标按下按钮”事件返回的坐标略有错误。基本上,x坐标总是比它应该保留的位置还剩两个像素。

我编写了一个非常简单的win32程序来演示该问题。它所做的只是将光标变成一个IBeam,并在最后一次按下鼠标事件的位置绘制一条垂直的红线。我希望红线与工字梁的垂直部分完全匹配,但事实并非如此。

Here's a screenshot of what happens

正如您所看到的,红线在它应该位于的位置左边两像素(此行为对于标准箭头指针是正确的,因此看来I形光标的热点是错误的。

我让其他人运行Windows 7 64位版确认他们遇到相同的问题,但是Vista上的另一台测试仪没有此问题。


有关我的环境的一些信息

  • Windows 7 64位。完全默认的配置(即无DPI缩放比例,无怪异主题等)
  • Visual Studio Express 2010
  • 具有最新驱动程序的NVidia图形卡(v270.61)
  • 打开或关闭航空没有什么区别。在显示偏好设置中选择不同的光标没有区别

相关代码位

我的测试项目基本上是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 winapi user-interface windows-7 mouse-pointer
1个回答
0
投票

这困扰了我很多年,显然还有许多其他Windows用户?您是否曾经单击过两个字符之间,但是文本插入符号的结尾距离左侧太远了?您的光标显然在其他两个光标之间!

© www.soinside.com 2019 - 2024. All rights reserved.