gpt4 book ai didi

delphi - 在应用程序顶部绘制/覆盖一个矩形框并捕获鼠标 XY

转载 作者:行者123 更新时间:2023-12-03 19:42:01 25 4
gpt4 key购买 nike

我有一个 CAD 应用程序,我正在尝试为其构建插件,并且我需要能够选择直线和圆弧。我不能直接从应用程序中执行此操作。在我的代码中,我想开始用鼠标徒手绘制一个窗口矩形。通过 API,我可以确定刚刚绘制的矩形中包含哪些线/弧。

问题是,我怎样才能在另一个应用程序上用鼠标绘制一个矩形?左键单击开始左上角,拖动调整大小,然后松开左键结束矩形?也没有真正涉及表单,所以我不知道我是否可以使用图片框/TCanvas 或什么。对我来说,这就像一个窗口屏幕截图,您在要保存的屏幕部分上绘制一个矩形。

最佳答案

我曾经按照 fduenas 的建议异或绘制一个矩形,它工作得很好,但这在 Windows Vista 和 7 上运行不顺畅。此外,如果你在变化的区域上绘制,矩形可能会被部分删除(并且矩形的部分将保留如果你之后删除它)。

相反,我现在使用一个带有矩形孔的矩形窗口。您所要做的就是重新定位窗口。您可以在 中创建并显示它鼠标按下 ,将其重新定位到 鼠标移动 并在 中销毁它MouseUp .

将 TDragRectangleForm 的 BorderStyle 设置为 bsNone。

unit FrmDragRectangle;

// TDragRectangleForm is a rectangular window with a rectangular hole.
// Only its dotted border is visible.

interface

uses
Windows, Forms, Graphics, Classes;

type
TDragRectangleForm = class( TForm )
procedure FormResize( Sender : TObject );
public
procedure Show;
end;

implementation

{$R *.dfm}

procedure TDragRectangleForm.Show;
begin
// Show the window without stealing the focus from another window:
ShowWindow( Handle , SW_SHOWNOACTIVATE );
Visible := True;
end;

procedure TDragRectangleForm.FormResize( Sender : TObject );
const
nBorderWidth = 1;
var
hrgnRect1 , hrgnRect2 : HRGN;
begin
// Make a rectangular hole in the window:
hrgnRect1 := CreateRectRgn( 0 , 0 , Width , Height );
hrgnRect2 := CreateRectRgn( nBorderWidth , nBorderWidth , Width - nBorderWidth , Height - nBorderWidth );

CombineRgn( hrgnRect1 , hrgnRect1 , hrgnRect2 , RGN_DIFF );
SetWindowRgn( Handle , hrgnRect1 , True );
DeleteObject( hrgnRect2 );

Canvas.Pen.Style := psDot;
Canvas.Pen.Color := clWhite;
Canvas.Brush.Color := clBlack;
Canvas.Rectangle( 0 , 0 , Width , Height );
end;

end.

关于delphi - 在应用程序顶部绘制/覆盖一个矩形框并捕获鼠标 XY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17582630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com