delphi - 鼠标定位信标

标签 delphi delphi-7

正在寻找有关使用鼠标定位器信标的信息,该信标会向用户发出鼠标当前位于表单上的位置信号?

Toad 选项屏幕中的搜索功能就是一个示例。如果我从列表中选择一个搜索结果项,则会显示正确的面板,将鼠标移动到控件的中间,并显示 3 个环的定位器信标。

另一个例子是 Mark Miller 开发的 CodeRush 的旧 Delphi 版本。当您在代码中放置一个标记并按 ESC 键时,编辑器会将您带回该标记,并使用定位器信标指示编辑器的光标位置。

点击here有关收集标记标题下 CodeRush 中的可视化示例。这大约是信标收缩过程的 2/3。

最佳答案

我还没有看到 Toad 做了什么,我确信您会发现下面的视觉效果不太令人满意。无论如何,它可能会给你一些想法。需要一个面板和一个计时器。

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    FRingCount: Integer;
    FRingRect: TRect;
  end;

...

procedure TForm1.FormCreate(Sender: TObject);
var
  Pt: TPoint;
begin
  Pt := Point(Panel1.Width div 2, Panel1.Height div 2);
  MapWindowPoints(Panel1.Handle, HWND_DESKTOP, Pt, 1);
  SetCursorPos(Pt.X, Pt.Y);

  Timer1.Interval := 100;
  Timer1.Enabled := True;
  FRingCount := 0;
  FRingRect := Rect(Pt.X - 20, Pt.Y - 20, Pt.X + 20, Pt.Y + 20);
  OffsetRect(FRingRect, -Left, -Top);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  DC: HDC;
begin
  DC := GetWindowDC(Handle);
  try
    Canvas.Handle := DC;
    Canvas.Brush.Style := bsClear;
    Canvas.Pen.Mode := pmNotXor;
    Canvas.Pen.Width := 2;

    if FRingCount > 0 then begin
      Canvas.Ellipse(FRingRect);     // remove previous ellipse
      InflateRect(FRingRect, -3, -3);
    end;

    if FRingCount > 5 then
      Timer1.Enabled := False
    else
      Canvas.Ellipse(FRingRect);

    Canvas.Handle := 0;
  finally
    ReleaseDC(Handle, DC);
  end;
  Inc(FRingCount);
end;

关于delphi - 鼠标定位信标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21766490/

相关文章:

Delphi - 如何将通用参数传递给接受 const 参数数组的函数

delphi - 如何列出所有实例化的对象?

delphi - 如何在 Delphi 中使用大文件?

delphi - 将公式从围绕圆的计算修改为围绕椭圆的计算?

德尔福 7 : how to check if Windows themes is enabled?

delphi - 如何在运行时分配 MDIChild 的 OnClose 事件?

delphi - 将项目加载到 Delphi XE6 时出现随机错误

Delphi网络摄像头简单程序

Delphi XE需要20秒才能启动

delphi - 如何在运行时将图像分配给 TImage 控件