3

我使用Toolbar2000组件。它在正确位置下方显示按钮的提示,系统比例 > 100%。所以,我需要手动设置 HintPos。我有Mouse.CursorPos。但提示应显示在鼠标光标图像下方。

如何获取鼠标光标尺寸?

4

3 回答 3

1

您应该向 Windows 询问System Metrics- 请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/ms724385.aspx

但是,如果用户安装了 Stardock CursorFX 之类的东西,这些值将与用户真正看到的内容以及他对程序的期望行为不匹配。

这似乎是 Win32 API 限制之一,除了旧批准集的几个相对较小的标准值之外,该值无法更改。

于 2013-07-16T15:40:51.787 回答
1

您可以创建一个图标,用于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;
于 2013-07-16T15:59:13.703 回答
0

这是 Windows 7 的问题,没有适当的解决方案。GetSystemMetrics(SM_CYCURSOR)返回带有背景的光标图像的大小。在系统规模 >100% 的情况下,这个值似乎更不正确。Delphi XE2 也显示了错误位置的提示。但有趣的是,Explorer 会显示正确位置的提示。

于 2013-07-16T16:51:24.710 回答