我怎样画一条线?此代码不显示任何内容:
var my_point_1, my_point_2: tPointF;
Canvas.Stroke.Color := claBlue;
Canvas.Stroke.Kind:= tBrushKind.bkSolid;
my_point_1.X:= 100;
my_point_1.Y:= 100;
my_point_2.X:= 120;
my_point_2.Y:= 150;
Canvas.BeginScene;
Canvas.DrawLine(my_point_1, my_point_2, 1.0);
Canvas.EndScene;
Windows XP Service Pack 3(tOsVersion.ToString是“Version 5.1,Build 2600,32位版本”,已安装Delphi XE2更新1)
答案 0 :(得分:3)
你希望这很简单 - 正如我所做的那样。但事实并非如此。这些是FireMonkey的早期阶段,Embarcadero似乎对反馈意见不堪重负。
当直接在TForm上使用画布时,你必须接受结果是易失性的,即它会在第一次重绘时消失(调整大小,其他窗口重叠等)。
这适用于我的几台机器:
创建一个新的FM-HD项目,添加一个按钮和一个处理程序:
procedure TForm1.Button1Click(Sender: TObject);
var pt0,pt1 : TPointF;
begin
pt0.Create(0,0);
pt1.Create(100,50);
Canvas.BeginScene;
Canvas.DrawLine(pt0,pt1,1);
Canvas.EndScene;
end;
运行,点击按钮,然后(希望):瞧!
然而,在TImage Canvas上,它稍微复杂一点(读:buggy?)
创建一个新项目,这次是两个TButtons和一个TImage - 设置(左,上)到类似(150,150)的东西,以区分它的Canvas和TForm的Canvas。
添加此代码并分配给处理程序(双击表单和按钮):
procedure TForm1.FormCreate(Sender: TObject);
begin
// Without this, you normally get a runtime exception in the Button1 handler
Image1.Bitmap := TBitmap.Create(150,150);
end;
procedure TForm1.Button1Click(Sender: TObject);
var pt0,pt1 : TPointF;
begin
pt0.Create(0,100);
pt1.Create(50,0);
with Image1.Bitmap do begin
Canvas.BeginScene;
Canvas.DrawLine(pt0,pt1,1);
BitmapChanged; // without this, no output
Canvas.EndScene;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
// This demonstrates that if you try to access the Canvas of the TImage object (and NOT its bitmap)
// you are sometimes defaulted to the Canvas of the Form (on some configurations you get the line directly on the form).
var pt0,pt1 : TPointF;
begin
pt0.Create(0,100);
pt1.Create(50,0);
with Image1 do begin
Canvas.BeginScene;
Canvas.DrawLine(pt0,pt1,1);
Canvas.EndScene;
end;
end;
最后一句话:一旦你开始使用Bitmap的ScanLine属性,请确保你在BeginScend / EndScene部分外面进行 - 并在完成之后,制作一个“虚拟”的BeginScend / EndScene部分来制作确保您的更改不会丢失:-( 如果有必要,我有时可能会回到这里; o)
祝你好运! 卡斯滕