And*_*zej 1 delphi delphi-10.3-rio
我想创建一个简单的鼠标指针荧光笔。以鼠标指针为中心的圆圈。它必须是半透明的并且在任何地方都可见(在我的应用程序内外)。
任何想法表示赞赏。
例子:
虽然我认为这个问题对于 Stack Overflow 来说有点太宽泛了,但我还是忍不住写下这个简短的答案,因为除了 VCL 之外几乎什么都不用做这个问题的原始实现,这不仅容易,而且出乎意料地容易。
这个想法是有一个跟随鼠标光标的半透明、无边框窗体(窗口)。普通表单TTimer每秒会多次更新表单的位置。
创建一个新的 VCL 应用程序。除了主表单之外,还创建另一个表单 ,MouseDiscForm具有以下属性:
object MouseDiscForm: TMouseDiscForm
AlphaBlend = True
AlphaBlendValue = 127
BorderStyle = bsNone
ClientHeight = 64
ClientWidth = 64
Color = clWhite
TransparentColor = True
TransparentColorValue = clWhite
FormStyle = fsStayOnTop
object Shape1: TShape
Align = alClient
Brush.Color = clYellow
Pen.Style = psClear
Shape = stCircle
end
end
Run Code Online (Sandbox Code Playgroud)
重写表单的CreateParams方法:
procedure TMouseDiskForm.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := Params.ExStyle or WS_EX_LAYERED or WS_EX_TRANSPARENT;
end;
Run Code Online (Sandbox Code Playgroud)
然后在主窗体中,只需添加一个TTimerwithInterval = 50和 thisOnTimer处理程序:
procedure TForm6.Timer1Timer(Sender: TObject);
begin
var CP := Mouse.CursorPos;
SetWindowPos(
MouseDiscForm.Handle,
HWND_TOPMOST,
CP.X - MouseDiscForm.Width div 2,
CP.Y - MouseDiscForm.Height div 2,
0,
0,
SWP_SHOWWINDOW or SWP_NOSIZE or SWP_NOACTIVATE
);
end;
Run Code Online (Sandbox Code Playgroud)
我确信还有一些额外的细节需要考虑,但总的来说,我确实发现这种非常原始的方法效果很好。
| 归档时间: |
|
| 查看次数: |
339 次 |
| 最近记录: |