■47872 / inTopicNo.9) |
Re[3]: Graphicsを返すコード教えてください。。 |
□投稿者/ 魔界の仮面弁士 (1559回)-(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
|
|