我正在尝试使用 BitBlt 将 Printer.Canvas 捕获为位图。然后我想获取该位图并将其显示在油漆盒上。但是,当我尝试这样做时,我只会得到一个与我为 Bitmap.SetSize 输入的值成比例的白色矩形。我的打印输出看起来是正确的,所以我几乎可以肯定打印机的画布正在正确绘制。我尝试了以下代码,使用变量位图作为目标,油漆箱作为源(本质上,我正在向油漆箱绘制一个简单的矩形和一行文本,将其位图位图,清除它,然后发布它回到paintbox),但现在Printer.Canvas.Handle 是它不显示的源。
我知道屏幕和打印机之间的尺寸不同,所以我会清楚地指出尺寸,以防我做错了。
procedure TForm2.btnDrawClick(Sender: TObject);
begin
Printer.BeginDoc;
Printer.Canvas.Font.Size := 10; //Not Sure if this is necessary
Printer.Canvas.Font.Name := 'Arial'; //Not Sure if this is necessary
Printer.Canvas.Font.Color := clBlack; //Not Sure if this is necessary
Printer.Canvas.Rectangle(100,100,200,200); //Should print very tiny to paper
//But will look bigger when posted to
//The Paintbox
Printer.Canvas.TextOut(120,120,'XRay-Cat');
PCBitmap.SetSize(Paintbox1.Width,Paintbox1.Height); //Paint box is 300W,300H
Application.ProcessMessages;
BitBlt(PCBitmap.Canvas.Handle, //PCBitmap, is created on create, freed on destroy,
//Defined in the private section
0,
0,
PCBitmap.Width, //300
PCBitmap.Height, //300
Printer.Canvas.Handle,
0,
0,
SRCCOPY);
Application.ProcessMessages;
Printer.EndDoc;
procedure TForm2.btnPostBMClick(Sender: TObject);
begin
PaintBox1.Canvas.Draw(0,0,PCBitmap);
end;
我希望画布也会被写入,画布将被复制到位图,然后可以在画框上绘制。然而,我看到的只是一个白色矩形。我将位图的尺寸设置为整个画框,而不是打印机的整个画布。我这样做是因为如果我理解正确,我应该只在打印机画布的 TopLeft 0,0 和 BottomRight 300,300 之间绘制,就像在我的油漆盒上一样。如果我直接对 Paintbox 执行此操作,我希望看到相同的结果。
任何帮助将不胜感激。提前致谢。
鉴于我收到的评论,我试图做的似乎是不可能的。我想做的是写入打印机画布,然后获取该画布的图像数据并将其存储在位图中。由于无法使用 BitBlt 有没有办法做我想做的事?我认为不是,因为有人告诉我 Printer.Canvas 无法读取。在这一点上,我已经找到了解决方法,但我只是好奇。