2

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 を読み取れないと言われたので、そうではないと思います。この時点で、私はそれを回避する方法を見つけましたが、ただ興味があります。

4

1 に答える 1

0

ロジックを切り替えて...ペイントボックスに描画して...ペイントボックスを印刷します

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;
于 2013-07-23T22:36:43.933 に答える