5. 作画のプロシージャ

目次のページ前のページ 例題のページ

 VBの作画に利用する基本メソッドは、第2.2節でも説明したように、Cls, Pset, Line, Circle, Print の五つしかありません。また、線の太さとか色などの属性(プロパティ)を設定することも処理単位としてはメソッド扱いになります。VB_Graphics では、これらのメソッドをプログラムコードの中で直接使うのを避けて、幾つかの中間言語から間接的に呼ぶようにしてあります。その理由は、第3.5節の簡易メタファイルの設計とも関連しています。基本的に利用するプロシージャ名は下に、またソースコードのリストを次ページに示します。

 上記の他に種々の作画関連のプロシージャがありますが、やや専門的ですので省きます。これらのソースコードは、Gronのパラメータを判定して、或キーワードを付けて、プロシージャの引き数と共にファイルに書き出すようにしてあります。これが私的に定義したメタファイルへの書き出しです。ここに示したメタファイルの仕様は2002年の暫定版です。

 メタファイルはテキスト形式で書き出しますので、その中身はテキストエディタで見る事ができます。見本は第3.5節の後半に載せてあります。メタファイルに書き出すのは、現在では既に作成済みの例題だけです。例題を表示しておいて、FILE メニューから DataSave サブメニューで書き出し、DataRead サブメニューで描画させることができます。描画のルーチンPicture1_Paint2 のリストも添付しました。このメタファイルのテキストの書式で、コンソールウインドウのテキストボックスから入力させて作図ができると、インタラクティブな作図ができます。この機能は未だ組み込んでありません(2003年版)。これはVB6の言語仕様がQuick Basicから変わって、キーボードからの入力文 Input が無くなったためです。

 もう一組、工業製図に利用するプロシージャを集めたモジュール KJplot.bas があります。こちらは、文字をベクトルフォントで描き出すルーチン(Symbol, Number, Kanji)と、製図用の点線・破線・一点鎖線を描画するルーチン(Dashl, Dashp, Dashpp)などが含まれています。これらは、最終的には、Dpmove/Dpdrawのルーチンに落として作画させています。リストはやや大きいので省きました。

Public Sub Dpmove(XP, YP)
    Dim XQ, YQ
    XQ = (XP * ZCOR - YP * ZSIR) * ZFAC
    YQ = (XP * ZSIR + YP * ZCOR) * ZFAC
    FormGraphic.Picture1.CurrentX = XQ
    FormGraphic.Picture1.CurrentY = YQ
    If Gron = 1 Then Write #2, "DPMV", XP, YP, 0
End Sub
'----------------------------------------------------------------------------
Public Sub Dpdraw(XP, YP)
    Dim XQ, YQ, X0, Y0
    XQ = (XP * ZCOR - YP * ZSIR) * ZFAC
    YQ = (XP * ZSIR + YP * ZCOR) * ZFAC
    X0 = FormGraphic.Picture1.CurrentX:
    Y0 = FormGraphic.Picture1.CurrentY
    FormGraphic.Picture1.Line (X0, Y0)-(XQ, YQ), Icolor
    If Gron = 1 Then Write #2, "DPDR", XP, YP, 0
End Sub
'----------------------------------------------------------------------------
Public Sub Dpensz(Ipsz)
    FormGraphic.Picture1.DrawWidth = Ipsz
    If Gron = 1 Then Write #2, "DPSZ", Ipsz, 0, 0
End Sub
'----------------------------------------------------------------------------
Public Sub Dperas()
    FormGraphic.Picture1.Cls
    If Gron = 1 Then Write #2, "DCLS", 0, 0, 0
End Sub
'----------------------------------------------------------------------------
Public Sub Dpcirc(xx, yy, rr)
    FormGraphic.Picture1.Circle (xx, yy), rr, RGB(0, 0, 0) 'Icolor
    If Gron = 1 Then Write #2, "DCRC", xx, yy, rr
End Sub
'----------------------------------------------------------------------------
Public Sub Dpoint(xx, yy, imark)
    If (imark = 0) And (FormGraphic.Picture1.DrawWidth = 1) Then
        FormGraphic.Picture1.PSet (xx, yy), Icolor
    Else
        Dpmove xx, yy
        Dpdraw xx, yy
    End If
    If Gron = 1 Then Write #2, "DPNT", xx, yy, imark
End Sub
'----------------------------------------------------------------------------
Public Sub Dptext(xx, yy, ByVal text As String)
    FormGraphic.Picture1.CurrentX = xx
    FormGraphic.Picture1.CurrentY = yy
    FormGraphic.Picture1.Print text
    If Gron = 1 Then Write #2, "DTXT", xx, yy, text
End Sub
'----------------------------------------------------------------------------
Public Sub Dpause(Itime)
    ICountSecond = Itime
    If Itime < = 0 Then ICountSecond = 3600
    FormGraphic.Timer1.Enabled = True
    Do While FormGraphic.Timer1.Enabled = True
        DoEvents
    Loop
    FormGraphic.Timer1.Enabled = False
    If Gron = 1 Then Write #2, "DSTP", Itime, 0, 0
End Sub

Public Sub Picture1_Paint2()
    Dim lwidth, Itime, imode, IX As Integer
    Dim gx, gy, ww, wx, wy, rr, imark
    Dim x1, x2, x3 As Variant
    Dim DName As String, text As String
    On Error Resume Next

    imode = FormGraphic.Picture1.AutoRedraw
    If imode = False Then FormGraphic.Picture1.AutoRedraw = True
    Open strReadFileName For Input As #1
    Do While Not EOF(1)
        Input #1, DName, x1, x2, x3
        Select Case DName
            Case "DCLS"
                FormGraphic.Picture1.Cls
            Case "DCOL"
                Icolor = x1
            Case "DWND"
                wx = x1: wy = x2: ww = x3: Dpwind wx, wy, ww
            Case "DPSZ"
                lwidth = x1: Dpensz lwidth
            Case "DPMV"
                gx = x1: gy = x2: Dpmove gx, gy
            Case "DPDR"
                gx = x1: gy = x2: Dpdraw gx, gy
            Case "DPNT"
                gx = x1: gy = x2: imark = x3: Dpoint gx, gy, imark
            Case "DCRC"
                gx = x1: gy = x2: rr = x3: Dpcirc gx, gy, rr
            Case "DTXT"
                gx = x1: gy = x2: text = x3: Dptext gx, gy, text
            Case "DSTP"
                Itime = x1: Dpause Itime
        End Select
    Loop
    Close #1
    FormGraphic.Picture1.AutoRedraw = imode
    Exit Sub
'
100
    IX = MsgBox("File error", 0)
    Close #1
    FormGraphic.Picture1.AutoRedraw = imode
End Sub

目次のページ