BitBlt を使用して、Printer.Canvas をビットマップとしてキャプチャしようとしています。次に、そのビットマップを取得して、ペイントボックスに表示したいと思います。ただし、これを試みると、Bitmap.SetSize に入力した値に比例した白い四角形のみが表示されます。私の印刷物は正しいように見えるので、プリンターのキャンバスが適切に描画されていることはほぼ間違いありません。変数ビットマップを宛先として使用し、ペイントボックスをソースとして使用して、次のコードを試みました(本質的に、単純な長方形とテキストの行をペイントボックスに描画し、ビットマップにビットブリングし、クリアしてから投稿しましたペイントボックスに戻ります)、しかし今は 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 を読み取れないと言われたので、そうではないと思います。この時点で、私はそれを回避する方法を見つけましたが、ただ興味があります。