gpt4 book ai didi

delphi - FireMonkey PenMode 等效项 - DrawLine

转载 作者:行者123 更新时间:2023-12-01 16:56:00 26 4
gpt4 key购买 nike

我正在玩 FireMonkey 只是为了测试一些东西。其中之一是在 Canvas 上实现“非常简单”的绘图。例如直线、矩形等...

第一个问题是,是否有为 FireMonkey 的 VCL 提供的 graphex 演示的等效版本?

否则,为了练习的目的,我尝试在 FireMonkey 中复制该演示以及刚才的线条图。当我在预期的线条绘制周围移动鼠标时,我可以使线条绘制正常工作。不幸的是,我无法让它自动删除在鼠标所在的上一个点绘制的旧线。这似乎是由 TPen 属性的 TPenMode 属性处理的,据我所知,TPenMode 是 FireMonkey 中的 TStroke 属性。即在绘图(移动鼠标)时将属性设置为 pmXor,然后在完成时将其设置为 pmCopy。

我如何使用 FireMonkey 做类似的事情?

这是在 TImage 的 MouseMove 事件期间调用的例程:

  FDrawSurface.Bitmap.Canvas.BeginScene;
try
case FShapeToDraw of
doLine:
begin
FDrawSurface.Bitmap.Canvas.DrawLine(PointF(TopLeft.X, TopLeft.Y), PointF(BottomRight.X, BottomRight.Y), 100);
end;

end;
finally
FDrawSurface.Bitmap.Canvas.EndScene;
FDrawSurface.Bitmap.BitmapChanged;
end;

FDrawSurface 是一个 TImage。 TopLeft 是一个 TPoint,其中包含 TImaeg 的 OnMouseDown 事件中捕获鼠标的 X 和 Y 坐标,BottomRight 是 OnMouseMove 事件中的当前 X 和 Y 坐标。

因此,每次移动鼠标时,图像上都会出现“附加”线条。

谢谢

最佳答案

据我所知,FMX 没有这样的模式......此外,您在 Canvas 上绘制的内容并没有真正保存(如果您知道如何直接保存它,请在评论中解释我):如果您将表单移出桌面并将其带回来, Canvas 就会被清理......

因此,要实现 graphex 演示,您必须使用其他技术对其进行编码..

例如,使用 TBitmap 来存储您的真实“图像”,而仅使用 Canvas 进行“预览”...

unit main;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Objects;

type
TfrmMain = class(TForm)
recBoard: TRectangle;
btnCopy: TButton;
Image1: TImage;
procedure recBoardMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
procedure recBoardMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
procedure recBoardMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
procedure recBoardMouseInOut(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btnCopyClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
bmp: TBitmap;
pFrom, pTo: TPointF;
public
{ Public declarations }
end;

var
frmMain: TfrmMain;

implementation

{$R *.fmx}

procedure TfrmMain.btnCopyClick(Sender: TObject);
begin
Image1.Bitmap.Assign(bmp);
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
pFrom := PointF(-1, -1);
bmp := TBitmap.Create(Round(recBoard.Width), Round(recBoard.Height));
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
bmp.Free;
end;

procedure TfrmMain.recBoardMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
if Button = TMouseButton.mbLeft then
begin
pFrom := PointF(X, Y);
pTo := PointF(X, Y);
end;
end;

procedure TfrmMain.recBoardMouseInOut(Sender: TObject);
begin
pFrom := PointF(-1, -1);
end;

procedure TfrmMain.recBoardMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
begin
if ((pFrom.X <> -1) and (pFrom.X <> -1)) then
with recBoard.Canvas do
begin
BeginScene;
if ssLeft in Shift then
begin
FillRect(RectF(0, 0, bmp.Width, bmp.Height), 0, 0, [], 255);
DrawBitmap(bmp, RectF(0, 0, bmp.Width, bmp.Height), RectF(0, 0, bmp.Width, bmp.Height), 255);
Stroke.Color := claBlue;
pTo := PointF(X, Y);
DrawEllipse(RectF(pFrom.X, pFrom.Y, pTo.X, pTo.Y), 255);
end;
EndScene;
end;
Self.Caption := Format('(%0.0f;%0.0f)', [X, Y]);
end;

procedure TfrmMain.recBoardMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
with bmp.Canvas do
begin
BeginScene;
DrawEllipse(RectF(pFrom.X, pFrom.Y, pTo.X, pTo.Y), 255);
EndScene;
end;
pFrom := PointF(-1, -1);
end;


















end.

关于delphi - FireMonkey PenMode 等效项 - DrawLine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10291330/

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