我使用 Toolbar2000
组件。当系统缩放比例 > 100% 时,它会在正确的位置下方显示按钮提示。因此,我需要手动设置 HintPos。我有Mouse.CursorPos
。但提示应该显示在鼠标光标图像下方。
如何获取鼠标光标的尺寸?
我使用 Toolbar2000
组件。当系统缩放比例 > 100% 时,它会在正确的位置下方显示按钮提示。因此,我需要手动设置 HintPos。我有Mouse.CursorPos
。但提示应该显示在鼠标光标图像下方。
如何获取鼠标光标的尺寸?
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;
ico.Height
返回与 GetSystemMetrics(SM_CYCURSOR)
相同的错误值。我认为这是光标背景的大小,而不是光标本身的大小。 - Dmitry您应该向Windows询问系统度量
- 参见http://msdn.microsoft.com/en-us/library/windows/desktop/ms724385.aspx。
然而,如果用户安装了诸如Stardock CursorFX之类的内容,这些值将不匹配用户实际看到的内容和他对程序的期望行为。
这似乎是Win32 API的限制之一,即该值不能被更改,除了来自旧批准集合中的一些相对较小的标准值。
SM_CXCURSOR
和SM_CYCURSOR
常量,而不仅仅是询问一个可能在今年失效的外部链接后面的内容。我不会投反对票,但你的回答有时确实值得这样做。我没有更多要说的了... - TLamaGetSystemMetrics(SM_CYCURSOR)
的值也比正确大小大5-10倍。 - Dmitry这是Windows 7的问题,目前没有合适的解决方案。GetSystemMetrics(SM_CYCURSOR)
返回带有背景的光标图像大小。而且似乎在系统缩放>100%时,这个值更加不正确。Delphi XE2也显示了位置不正确的提示。但有趣的是,资源管理器显示了正确位置的提示。