我使用Toolbar2000
组件。它显示按钮的提示低于正确的位置,系统规模> 100%。所以,我需要手动设置HintPos。我有Mouse.CursorPos
。但提示应显示在鼠标光标图像下方。
如何获取鼠标光标尺寸?
答案 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也显示了错误位置的提示。但有趣的是,资源管理器会显示正确位置的提示。