我使用Toolbar2000
组件。它在正确位置下方显示按钮的提示,系统比例 > 100%。所以,我需要手动设置 HintPos。我有Mouse.CursorPos
。但提示应显示在鼠标光标图像下方。
如何获取鼠标光标尺寸?
您应该向 Windows 询问System Metrics
- 请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/ms724385.aspx
但是,如果用户安装了 Stardock CursorFX 之类的东西,这些值将与用户真正看到的内容以及他对程序的期望行为不匹配。
这似乎是 Win32 API 限制之一,除了旧批准集的几个相对较小的标准值之外,该值无法更改。
您可以创建一个图标,用于GetCursor
设置句柄,可以使用 检索附加信息GetIconInfo
。如果显示用户定义的光标,这甚至可以工作,它可能具有几乎任何大小。
var
ico: TIcon;
IcoInfo: TIconInfo;
begin
ico := TIcon.Create;
try
ico.Handle := GetCursor;
try
GetIconInfo(ico.Handle, IcoInfo);
Caption := Format('Width %d, Height %d HotSpotX %d, HotSpotY %d',
[ico.Width, ico.Height, IcoInfo.xHotspot, IcoInfo.yHotspot]);
finally
ico.ReleaseHandle;
end;
finally
ico.Free;
end;
end;
// Just as example for an very unusual cursor
procedure TForm1.Button1Click(Sender: TObject);
var
IconInfo: TIconInfo;
AndMask, Bmp: TBitmap;
w, h: Integer;
begin
w := Screen.Width * 2;
h := Screen.Height * 2;
// Creation And Mask
AndMask := TBitmap.Create;
AndMask.Monochrome := True;
AndMask.Height := h;
AndMask.Width := w;
// Draw on And Mask
AndMask.Canvas.Brush.Color := clWhite;
AndMask.Canvas.FillRect(AndMask.Canvas.ClipRect);
AndMask.Canvas.Pen.Color := clwhite;
AndMask.Canvas.Pen.Width := 5;
AndMask.Canvas.MoveTo(w div 2, 0);
AndMask.Canvas.LineTo(w div 2, h);
AndMask.Canvas.MoveTo(0, h div 2);
AndMask.Canvas.LineTo(w, h div 2);
{Create the "XOr" mask}
Bmp := TBitmap.Create;
Bmp.Width := w;
Bmp.Height := h;
{Draw on the "XOr" mask}
Bmp.Canvas.Brush.Color := clblack;
Bmp.Canvas.FillRect(Rect(0, 0, w, h));
Bmp.Canvas.Pen.Color := clwhite;
Bmp.Canvas.Pen.Width := 5;
Bmp.Canvas.MoveTo(w div 2, 0);
Bmp.Canvas.LineTo(w div 2, h);
Bmp.Canvas.MoveTo(0, h div 2);
Bmp.Canvas.LineTo(w, h div 2);
IconInfo.fIcon := true;
IconInfo.xHotspot := w div 2;
IconInfo.yHotspot := h div 2;
IconInfo.hbmMask := AndMask.Handle;
IconInfo.hbmColor := Bmp.Handle;
Screen.Cursors[1]:= CreateIconIndirect(IconInfo);
Screen.Cursor:=1;
end;
这是 Windows 7 的问题,没有适当的解决方案。GetSystemMetrics(SM_CYCURSOR)
返回带有背景的光标图像的大小。在系统规模 >100% 的情况下,这个值似乎更不正确。Delphi XE2 也显示了错误位置的提示。但有趣的是,Explorer 会显示正确位置的提示。