| ■No47872 (魔界の仮面弁士 さん) に返信 魔界の仮面弁士さん、丁寧なご返信ありがとうございます!
それだと文法エラーになるはずなので、実際は > oj.Line (x, y)-(x + 10, y + 10) > ですよね? (VB6 の描画系メソッドは構文が特殊なので) > はい、ごめんなさい。2008で起動した時にVB5から2008へアップグレードが走って、それが自動で変えちゃったみたいです。
>>に出来たらとっても楽ちんだな♪と安易に考えたのです。 >>でも今のObjectタイプが何か判断してからGraphicsをインスタンス化しないとダメですよね?? > その方向性では駄目だと思いますよ。 > 呼び出される側だけではなく、呼び出し側にも手を加えてください。
あぅぅ…ダメですか…。 > > まず VB6 の場合、PictureBox/Form に対する描画処理は「Paint イベント」に記述することになっています。 > このパターンで実装されたものに関しては、VB.NET でも『処理の流れ』は大して変わらないはずです。 > VB.NET の場合も同様に、Paint イベントを使えば OK です。
正しくはvb5で、Paintイベントは使用していません。
> また、「Paint イベントは使わないし、AutoRedraw も False のまま」という場合は、 > Dim g As Graphics = PictureBox1.CreateGraphics() > で得た Graphics クラスに対して描画していくこともできます。
AutoRedrawはFalseですから、そっか! CreateGraphicsで問題ないですね!あ〜目からうろこが落ちました。 > > > 続いて「Printer オブジェクト」の場合。 > > これについては、VB6 互換の Printer オブジェクトを使うという選択肢があります。 > http://msdn.microsoft.com/ja-jp/library/microsoft.visualbasic.powerpacks.printing.compatibility.vb6.printer.aspx >
当初はこれを利用しようと思いましたが、PictureBoxの描画処理とかなり違ってきますし、 何よりこんぱちって互換のためだけに残されたオブジェクトですよね?いつかはなくなるんじゃないかと。。。 そう思ってやめました。
> もし、プリンタへの出力に対しても Graphics クラスを利用して描画したいのであれば、 > No47752 で紹介された、PrintDocument クラスを使った処理方法を使う必要があります。 > この場合は処理の流れが大きく変わるため、プログラム全体を見直す事になるかと。
ささっと書いてみました。動作未確認ですけど、 Public Class Form1 Dim PictureBox1 As New PictureBox Dim oj As Object Dim Cnt As Integer Public Pic As PictureBox WithEvents Btn As Button WithEvents PrintDoc As Printing.PrintDocument
Private Sub PBtn_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles PBtn.Click Cnt = IIf(Cnt >= 2, 0, Cnt + 1) SetObject() Make_Line(100, 100) If Cnt = 0 then PrintDoc.Print End Sub Private Sub SetObject() Select Case Cnt Case 0 oj = PrintDoc Case 1 oj = PictureBox1 Case 2 oj = Me End Select End Sub Private Sub Make_Line(ByVal X As Integer, ByVal Y As Integer) Dim G As Graphics = AutoG(oj) G.DrawLine(Pens.Black, 0, 0, X, Y) End Sub Public Function AutoG(ByVal Oj As Object) As Graphics If TypeOf Oj Is PictureBox Then Pic = Oj Pic.Size = Oj.size If Pic.Image Is Nothing Then Pic.Image = New Bitmap(Pic.Width, Pic.Height) ElseIf TypeOf Oj Is Form Then Dim Frm As Form = Oj Frm.BackgroundImage = New Bitmap(Frm.ClientRectangle.Width, Frm.ClientRectangle.Height) Return Graphics.FromImage(Frm.BackgroundImage) ElseIf TypeOf Oj Is Printing.PrintDocument Then Pic = New PictureBox Pic.Size = New Size(1169, 827) 'A4 Pic.Image = New Bitmap(Pic.Size.Width, Pic.Size.Height) End If Return Graphics.FromImage(Pic.Image) End Function
Private Sub PD_PrintPage(ByVal sender As Object, ByVal e As Printing.PrintPageEventArgs) Handles PrintDoc.PrintPage e.Graphics.DrawImage(Pic.Image, 0, 0) End Sub End Class
あ、でもこれだとImage出力するからかなり荒くなってしまう問題がある。。。 やっぱり無理か(>_<) どうしてもこの方法が諦めきれなくて、作りましたが別の方法をクライアントと相談してみます。。。 |