gpt4 book ai didi

delphi - BitBlt Printer.Canvas 到 TBitMap 显示为纯白色

转载 作者:行者123 更新时间:2023-12-02 02:13:52 28 4
gpt4 key购买 nike

我正在尝试使用 BitBlt 将 Printer.Canvas 捕获为位图。然后我想获取该位图并将其显示在油漆盒上。然而,当我尝试这样做时,我只得到一个与我为 Bitmap.SetSize 输入的值成比例的白色矩形。我的打印输出看起来正确,所以我几乎肯定打印机的 Canvas ​​已正确绘制。我尝试使用变量位图作为目标和绘画框作为源来编写以下代码(本质上,我正在将一个简单的矩形和文本行绘制到绘画框,将其位 block 转换为位图,清除它,然后将其发布回到颜料盒),但现在 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;

我希望 Canvas 也能被写入, Canvas 将被复制到位图,然后可以在油漆盒上绘制。然而我看到的只是一个白色的矩形。我将位图的尺寸设置为整个颜料盒而不是打印机的整个 Canvas 。我这样做是因为如果我理解正确的话,我应该只在打印机 Canvas 的 TopLeft 0,0 和 BottomRight 300,300 之间进行绘制,就像在我的油漆盒上一样。我希望看到与直接在 Paintbox 中执行此操作相同的结果。

任何帮助将不胜感激。提前致谢。

鉴于我收到的评论,我想做的事情似乎是不可能的。我想做的是写入打印机 Canvas ,然后获取该 Canvas 的图像数据并将其存储在位图中。既然 BitBlt 不能使用,有没有办法做我想做的事?我认为不是,因为我被告知 Printer.Canvas 无法读取。此时我已经找到了解决方法,但我只是好奇。

最佳答案

切换你的逻辑...绘制到 PaintBox...并打印 PaintBox

procedure TForm55.Button1Click(Sender: TObject);
var
a_BM: TBitMap;
begin
a_BM := TBitmap.Create;
try

PaintBox1.Canvas.Font.Size := 10; //Not Sure if this is necessary
PaintBox1.Canvas.Font.Name := 'Arial'; //Not Sure if this is necessary
PaintBox1.Canvas.Font.Color := clBlack; //Not Sure if this is necessary
PaintBox1.Canvas.Rectangle(0,0,300,300); //Should print very tiny to paper
//But will look bigger when posted to
//The Paintbox
PaintBox1.Canvas.TextOut(120,120,'XRay-Cat');
PaintBox1.Width := 300;
PaintBox1.Height := 300;
a_BM.SetSize(PaintBox1.Width, PaintBox1.Height);
BitBlt(a_BM.Canvas.Handle, 0, 0, a_BM.Width, a_BM.Height, PaintBox1.Canvas.Handle, 0, 0, SRCCOPY);
Application.ProcessMessages;
Printer.BeginDoc;
Printer.Canvas.Draw(a_BM.Canvas.ClipRect.Left, a_BM.Canvas.ClipRect.Top, a_BM);
Printer.EndDoc;
Application.ProcessMessages;
finally
a_BM.Free;
end;
end;

关于delphi - BitBlt Printer.Canvas 到 TBitMap 显示为纯白色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17816270/

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