フォームの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
にした場合は、線で囲まれた部分を塗りつぶしますが
印刷では塗りつぶしが出来ません
どこが悪いのでしょうか?
TCanvasのFloodFill関数は、内部でWin32APIのExtFloodFill関数を呼んでいます。
この関数は、メモリデバイスコンテキストと、ラスタオペレーションをサポートするデバイスだけに使えるらしいです。
Win32APIのGetDeviceCaps関数で、RASTERCAPSを指定したときの戻り値にRC_FLOODFILLが含まれていれば使えると思います。
一度TCanvasオブジェクトに書いて、それをPrinterオブジェクトのCanvasにコピーすれば回避できると思います。
このときも、StretchBltを使用する場合は、やはりGetDeviceCapsのRASTERCAPSにRC_STRETCHBLTが含まれていないとコピーできません。
有り難うございました
単純に、printer.Canvas.Polygon()で印刷できました
ツイート | ![]() |