Delphi 7,如何将Paintbox内容复制到Tbitmap?

时间:2012-01-19 10:13:30

标签: delphi delphi-7 draw

我正在研究 delphi 7 ,我想知道如何将TpaintBox的内容复制/分配给Tbitmap?

像这样

 public
  { Public declarations }
   BitMap     : TBitmap;
 end;

我有一个声明为公共的Tbitmap,我就像这样创建onFormCreate

      procedure TForm1.FormCreate(Sender: TObject);
      begin
      BitMap     := TBitMap.Create;
      end;

然后我在这个位图上画这样的东西

      procedure TForm1.DrawOnPainBox;
        begin
         If BitMap.Width  <> PaintBox1.Width  then BitMap.Width  := PaintBox1.Width;
         If BitMap.Height <> PaintBox1.Height then BitMap.Height := PaintBox1.Height;
         BitMap.Canvas.Rectangle(0,0,random(PaintBox1.Width ),random(PaintBox1.Height));
         PaintBox1.Canvas.Draw(0,0,BitMap);
        end;

使用PaintBox1.Canvas.Draw(0,0,BitMap);我们可以在Bitmap中显示绘图框中的内容但是相反的方式是什么?

如何将paintbox的内容分配/复制到位图?

 `BitMap:=PaintBox1.Canvas.Brush.Bitmap;` 

这会编译,但是如果我这样做并再次调用procedure TForm1.DrawOnPainBox;我得到access Violation并且调试器会显示bitmapPaintBox1.Canvas.Brush.Bitmap,即使某些行被绘制在颜料盒

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:10)

要将TPaintBox(我们称之为PaintBox1)的内容分配给TBitmap(例如Bitmap),您可以

Bitmap.Width := PaintBox1.Width;
Bitmap.Height := PaintBox1.Height;
BitBlt(Bitmap.Canvas.Handle,
  0,
  0,
  Bitmap.Width,
  Bitmap.Height,
  PaintBox1.Canvas.Handle,
  0,
  0,
  SRCCOPY);

注意:在较新版本的Delphi中,您可以使用Bitmap.SetSize代替Bitmap.WidthBitmap.Height

答案 1 :(得分:1)

TBitmap.setsize已在Delphi 2006中引入,您可能正在使用旧版本。只需更换 Bitmap.SetSize (X, Y)

通过

Bitmap.Width := X
Bitmap.Height := Y

它的速度较慢(但只有在循环中使用它才有意义),但是你将编译代码

如果这种情况经常发生,请声明一个新单位BitmapSize.pas:

unit BitmapSize;

interface

uses
    graphics;

Type
    TBitmapSize = class (TBitmap)
    public
        procedure Setsize (X, Y : integer);
    end;



implementation

procedure TBitmapsize.Setsize(X, Y: integer);
begin
    Width := X;    // may need some more tests here (X > 0, Y > 0, ...)
    Height := Y;
end;

end.

然后用TBitmapSize替换声明和创建位图TBitmap。

..
Var
  B : TBitmapSize;
..
  B := TBitmapSize.Create;