Delphi 10 TPaintbox代码在表单上放置位图而不是paintbox

时间:2017-11-02 21:51:21

标签: delphi firemonkey

您好我有以下代码从Timage添加图像,现在从Blob填充。我的问题是这段代码不会将图像添加到绘图框而是添加到表单中。

var
  RectangleCanvas, RectanglePicture: TRectF;
  BlobStream: TStream;
begin
      BlobStream := qrypunchsheetitemphoto.CreateBlobStream(qrypunchsheetitemphoto.FieldByName('Photo'),TBlobStreamMode.bmRead);
      imgviewimage.Bitmap.LoadFromStream(BlobStream);
      fdrawbox:= TMyPaintBox.Create(panel1);
      fdrawbox.Canvas.BeginScene;
      fdrawbox.BitmapStamp := imgviewimage.Bitmap;
      fdrawbox.Height := imgviewimage.Bitmap.Height;
      fdrawbox.Width := imgviewimage.Bitmap.Width;
      RectangleCanvas := RectF(10, 10, imgviewimage.Bitmap.Width, imgviewimage.Bitmap.Height);
      RectanglePicture := RectF(10, 10, imgviewimage.Bitmap.Width, imgviewimage.Bitmap.Height);
           fdrawbox.Canvas.DrawBitmap(imgviewimage.Bitmap, RectangleCanvas , RectanglePicture, 1);
           fdrawbox.Canvas.EndScene;
          fdrawbox.BringToFront;
           BlobStream.Free;
          TabControl1.ActiveTab := tabViewImage;
     end;
end; 

1 个答案:

答案 0 :(得分:0)

FMX Paintbox与旧的Delphi Paintbox不同。以前,您可以将Paintbox放在表单的任何位置并开始绘图。结果将在您放置它的Paintbox的范围内。

FMX Paintbox不是那样的,我不理解他们的推理。我被告知它与跨平台兼容性以及设备如何处理画布操作有关。

您可以轻松验证画布宽度。

如果您的表格宽度为640像素,并在中间放置一个50 x 50的Paintbox,您可能希望在中间进行绘图。

亲自检查;

ShowMessage(FloatToStr(Paintbox1.Width)); // Result will be 50

现在检查Paintbox1.Canvas.Width,你会得到不同的结果。

ShowMessage(IntToStr(Paintbox1.Canvas.Width)); // Result is 640

将参数传递给绘图函数时,需要考虑这一点并相应地进行偏移。我已经阅读了一些关于父母剪辑有一些影响的内容,但我没有看到它有效。

另一个可能的解决方案是使用TPanel并在它的画布上绘制。