C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.47872 の関連記事表示

<< 0 >>
■47872  Re[3]: Graphicsを返すコード教えてください。。
□投稿者/ 魔界の仮面弁士 -(2010/03/16(Tue) 22:04:34)
    2010/03/16(Tue) 22:19:47 編集(投稿者)

    No47811 (lavender さん) に返信
    > Private Sub Make_Line(x as single,y as single)
    > oj.Line((x,y)-(x+10,y+10))
    > End Sub

    それだと文法エラーになるはずなので、実際は
     oj.Line (x, y)-(x + 10, y + 10)
    ですよね? (VB6 の描画系メソッドは構文が特殊なので)

    どうしても、括弧を付けて Line メソッドを呼び出したいなら、
     With oj
      Call .Line(0, x, y, x + 10, y + 10, 0)
     End With
    のように、With ブロックで囲むか、CallByName を使う必要があるはず…。


    > に出来たらとっても楽ちんだな♪と安易に考えたのです。
    > でも今のObjectタイプが何か判断してからGraphicsをインスタンス化しないとダメですよね??
    その方向性では駄目だと思いますよ。
    呼び出される側だけではなく、呼び出し側にも手を加えてください。


    まず VB6 の場合、PictureBox/Form に対する描画処理は「Paint イベント」に記述することになっています。
    このパターンで実装されたものに関しては、VB.NET でも『処理の流れ』は大して変わらないはずです。
    VB.NET の場合も同様に、Paint イベントを使えば OK です。

     'VB6
     Private Sub Picture1_Paint()
      Picture1.ScaleMode = vbPixels
      Picture1.Line (0, 0)-(1000, 1000), vbRed
      Picture1.CurrentX = 32
      Picture1.CurrentY = 8
      Picture1.Print "サンプル"
     End Sub

    ただし、PictureBox/Form のメソッドを使って描画するのではなく、
    イベント引数 e.Graphics が持つ描画メソッドを利用する事になります。

     Private Sub PictureBox1_Paint(ByVal sender As PictureBox, ByVal e As PaintEventArgs) Handles PictureBox1.Paint
      e.Graphics.DrawLine(Pens.Red, 0, 0, 1000, 1000)
      e.Graphics.DrawString("サンプル", sender.Font, Brushes.Black, 32, 8)
     End Sub


    そのため、先の
    > Private Sub Make_Line(x as single,y as single)
    が利用していた『変数 oj』に対しては、
    「PictureBox」等ではなく「Graphics」を渡すことになります。



    問題は、Paint イベントを使っていなかった場合ですね。
    この場合は処理の手順が異なるため、VB.NET では基本的に作り直しが必要になります。


    それでも、できるだけ修正の手間を省こうとするのであれば―――


    まず、「AutoRedraw プロパティ = True」で描画していた場合については、
      'VB6
      Set oj = Picture1
      Make_Line oj, x1, y1 '描画メソッド
      Make_Line oj, x2, y2 '描画メソッド
    の代わりに、
      'VB.NET
      Dim bmp As Bitmap = TryCast(PictureBox1.Image, Bitmap)
      If bmp Is Nothing Then
       bmp = New Bitmap(PictureBox1.ClientSize.Width, PictureBox1.ClientSize.Height)
      End If
      Using g As Graphics = Graphics.FromImage(bmp)
       Make_Line_dotNET(g, x1, y1) '描画メソッド
       Make_Line_dotNET(g, x2, y2) '描画メソッド
      End Using
      PictureBox1.Image = bmp
    となるように修正していけば良いと思います。

    描画メソッド自体はリメイクになりますし、呼び出し側にも修正が必要ですが、
    呼び出す場所(イベント)を変更する手間は省けます。


    また、「Paint イベントは使わないし、AutoRedraw も False のまま」という場合は、
      Dim g As Graphics = PictureBox1.CreateGraphics()
    で得た Graphics クラスに対して描画していくこともできます。



    続いて「Printer オブジェクト」の場合。

    これについては、VB6 互換の Printer オブジェクトを使うという選択肢があります。
    http://msdn.microsoft.com/ja-jp/library/microsoft.visualbasic.powerpacks.printing.compatibility.vb6.printer.aspx


    たとえば
     'VB6
     Option Explicit
     Private Sub Command1_Click()
      Printer.ScaleMode = vbPixels
      Printer.Line (0, 0)-(1000, 1000), vbRed
      Printer.CurrentX = 32
      Printer.CurrentY = 8
      Printer.Print "サンプル"
      Printer.EndDoc
     End Sub
    というコードについては、VB2008 では
     '参照設定に「Microsoft.VisualBasic.PowerPacks.Vs.dll」を加えておくこと
     Imports Microsoft.VisualBasic.PowerPacks.Printing.Compatibility.VB6
     Partial Public Class Form1
      Private Sub Button1_Click() Handles Button1.Click
       Dim p As New Printer()
       p.ScaleMode = vbPixels
       p.Line(0, 0, 1000, 1000)
       p.CurrentX = 32
       p.CurrentX = 8
       p.Print("サンプル")
       p.EndDoc()
      End Sub
     End Class
    のように記述できます。

    VB6 とほとんど同じコードが使えるため、この点に関して移植に悩む事は無いでしょう。

    ただしこのクラスでは、描画処理に Graphics クラスを利用していません。そのため、
    先述の PictureBox 等への描画処理とは、メソッドの扱いが異なってしまうのが難点です。


    もし、プリンタへの出力に対しても Graphics クラスを利用して描画したいのであれば、
    No47752 で紹介された、PrintDocument クラスを使った処理方法を使う必要があります。
    この場合は処理の流れが大きく変わるため、プログラム全体を見直す事になるかと。

     'VB2008
     Imports System.Drawing.Printing
     Partial Public Class Form1
      Private Sub Button1_Click() Handles Button1.Click
       PrintDocument1.Print()
      End Sub

      Private Sub PrintDocument1_PrintPage(ByVal sender As PrintDocument, ByVal e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
       e.Graphics.DrawLine(Pens.Red, 0, 0, 1000, 1000)
       e.Graphics.DrawString("サンプル", Me.Font, Brushes.Black, 32, 8)
       e.HasMorePages = False
      End Sub
     End Class
記事No.47744 のレス /過去ログ81より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -