如何在Delphi上获取鼠标光标尺寸?

时间:2013-07-16 14:54:17

标签: delphi mouse hint

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

如何获取鼠标光标尺寸?

3 个答案:

答案 0 :(得分:1)

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

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

这似乎是Win32 API的一个限制,除了旧批准的设置中的一些相对较小的标准值之外,不能更改该值。

答案 1 :(得分: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;

答案 2 :(得分:0)

这是Windows 7问题,没有适当的解决方案。 GetSystemMetrics(SM_CYCURSOR)返回带有背景的光标图像的大小。并且看起来这个值在系统规模> 100%时更不正确。 Delphi XE2也显示了错误位置的提示。但有趣的是,资源管理器会显示正确位置的提示。