- ベストアンサー
ExtFloodFill を使った塗り潰し印刷について
VBでPrinterオブジェクトを使用して描画をしています。 Form上では多角形を描画して、その内側を塗り潰すことはExtFloodFill関数を使用して実現できたのですが、同じように多角形の塗り潰しを印刷しようとしましたが、実現できませんでした。 どんな方法でも構いませんので、VBでPrinterオブジェクトを使用して多角形の塗り潰しを行う方法を教えていただければ助かります。 ちなみに四角形であれば、LineのBFを使用して塗り潰しは実現できました。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Picture1.AutoRedraw = True Picture1.ScaleMode = vbTwips Call GF_PaintRegion(Picture1, RGB(0, 0, 0), 10, 10, 50, 50, 50, 10) Printer.ScaleMode = vbTwips Printer.PaintPicture Picture1.Image, 0, 0 Printer.EndDoc こんな感じで出力できます。
その他の回答 (2)
- Azzuri
- ベストアンサー率68% (34/50)
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long このAPIも宣言してください。
- Azzuri
- ベストアンサー率68% (34/50)
CreatePolygonRgnとPaintRgnを使用してできます。 例) '多角形を描画 Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As Long, _ ByVal nCount As Long, _ ByVal nPolyFillMode As Long) As Long Private Const ALTERNATE = 1 '交差したリージョンは塗らない Private Const WINDING = 2 '交差したリージョンも塗る '塗りつぶし Private Declare Function PaintRgn Lib "gdi32" (ByVal hdc As Long, _ ByVal hRgn As Long) As Long '* パラメータ oPic I 描画オブジェクト '* lColor I 配色 '* P() I 動的な数の引数(座標X,Yのセット) '* 戻り値 成功:-1 '* 失敗:0 Private Function GF_PaintRegion(ByVal oPic As Object, _ ByVal lColor As Long, _ ParamArray P()) As Integer Dim lPoint() As Long '座標 Dim lhnd As Long 'ハンドル Dim iPoint As Integer '座標組み合わせ数 Dim i As Integer GF_PaintRegion = 0 ReDim lPoint(0 To UBound(P)) iPoint = (UBound(P) + 1) / 2 With oPic For i = 0 To iPoint - 1 lPoint(i * 2) = CLng(P(i * 2)) lPoint(i * 2 + 1) = CLng(P(i * 2 + 1)) Next i .FillColor = lColor .FillStyle = vbFSSolid '塗りつぶし End With lhnd = CreatePolygonRgn(lPoint(0), iPoint, WINDING) Call PaintRgn(oPic.hdc, lhnd) Call DeleteObject(lhnd) GF_PaintRegion = -1 End Function 使用方法 Call GF_PaintRegion(oPic, lPlaneCol, x1, y1, x2, y2, x3, y3)
補足
ありがとうございます。 Azzuriさんのサンプルコードを実行してみました。 FormやPictureBoxに対しては綺麗に描画できましたが、Printerオブジェクトに対しては何も出力されませんでした。 EndDocメソッドも実行しましたがダメでした。 どこが問題なのでしょうか。Azzuriさんの環境では印刷も問題ないですか?
お礼
やはりPictureBoxを経由しないとできないんですね。 問題がほぼ解決いたしました。 あとは実際に組み込んで結果を確かめてみます。 大変助かりました。