PrinterでFloodFillを使うには

解決


Taku  2001-12-20 08:53:35  No: 381  IP: [192.*.*.*]

フォームのCanvasに描いた操作を
プリンターのCanvasに同様のコードで出力しているのですが
FloodFillだけ上手くいきません

     with printer do
     begin
       BeginDoc;
       canvas.pen.mode:=pmCopy;
       canvas.Pen.Style:=psSolid;
       canvas.Pen.Width:=10;
       canvas.Pen.Color:=clRed;
       canvas.Brush.Color:=canvas.Pen.Color;
       canvas.MoveTo(10,10);
       canvas.LineTo(1000,10);
       canvas.LineTo(1000,1000);
       canvas.LineTo(10,1000);
       canvas.LineTo(10,10);
       canvas.FloodFill(500,500,canvas.Pen.Color,fsBorder);  
       EndDoc;
    end;

with printer do  を  with Form1  do
にした場合は、線で囲まれた部分を塗りつぶしますが
印刷では塗りつぶしが出来ません
どこが悪いのでしょうか?

編集    削除
にしの  2001-12-20 09:14:19  No: 382  IP: [192.*.*.*]

TCanvasのFloodFill関数は、内部でWin32APIのExtFloodFill関数を呼んでいます。
この関数は、メモリデバイスコンテキストと、ラスタオペレーションをサポートするデバイスだけに使えるらしいです。
Win32APIのGetDeviceCaps関数で、RASTERCAPSを指定したときの戻り値にRC_FLOODFILLが含まれていれば使えると思います。

一度TCanvasオブジェクトに書いて、それをPrinterオブジェクトのCanvasにコピーすれば回避できると思います。
このときも、StretchBltを使用する場合は、やはりGetDeviceCapsのRASTERCAPSにRC_STRETCHBLTが含まれていないとコピーできません。

編集    削除
Taku  2001-12-20 18:20:57  No: 383  IP: [192.*.*.*]

有り難うございました
単純に、printer.Canvas.Polygon()で印刷できました

編集    削除