tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルSystem.Drawing.Graphics.DrawLine メソッドについて
記事No8315
投稿日: 2008/10/15(Wed) 09:34
投稿者くりーむぱん
VB6.0と2005の互換表をずっと探していました。
あちこち探してやっとたどり着いた感じです。
VB初心者です。
事情があり、VB6.0の課題をVB2005で自習しているのですが、
エラーに困っています。
フォームをドラッグして直線を引くという課題なのですが、
下から4行目のLineのところでエラーになります。

エラーメッセージ
この引数の数を受け付ける’DrawLine'がないため、オーバーロードの解決に失敗しました。

')'が必要です。

括弧の数は、合っていると思うのですが、

済みません。間違いをご指摘いただけると助かります。
よろしくお願いします。

Public Class Form1
    Dim startX As Integer
    Dim startY As Integer
    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        If e.Button = Windows.Forms.MouseButtons.Left Then
            startX = e.X
            startY = e.Y
        End If
    End Sub
    Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
        If e.Button = Windows.Forms.MouseButtons.Left Then
            system.Drawing.Graphics.drawLine =(startX,startY)-(e.X,e.Y), , BF
        End If
    End Sub
End Class

[ツリー表示へ]
タイトルRe: System.Drawing.Graphics.DrawLine メソッドについて
記事No8316
投稿日: 2008/10/15(Wed) 09:48
投稿者花ちゃん
> 括弧の数は、合っていると思うのですが、

>             system.Drawing.Graphics.drawLine =(startX,startY)-(e.X,e.Y), , BF

括弧の数が問題ではなく、座標位置の指定の仕方に問題があるかと。
ここのTipsのグラフィック関係をご覧下さい。又は、drawLine をキーに検索するとか。

[ツリー表示へ]
タイトルRe: System.Drawing.Graphics.DrawLine メソッドについて
記事No8317
投稿日: 2008/10/15(Wed) 10:42
投稿者魔界の仮面弁士
そもそも、使用している命令が間違っています。

.NET の「DrawLine メソッド」は『直線の描画』を意味します。すなわち
 .DrawLine(Pens.Black, X1, Y1, X2, Y2)
というメソッドは、VB6 でいうところの
 Line (X1, Y1)-(X2, Y2), vbBlack
に相当する命令です。


しかし今回使用するのは、BF 指定(Box-Fill)すなわち『矩形の塗り潰し』ですよね。VB6 の
 Line (X1, Y1)-(X2, Y2), vbBlack, BF
に相当する .NET のコードは、DrawLine ではなく
 .FillRectangle(Brushes.Black, X1, Y1, X2, Y2)
のように、「FillRectangle メソッド」を使う事になります。

ちなみに VB6 の B 指定(Box)すなわち『矩形の枠線描画』を行うのであれば、
「DrawRectangle メソッド」を使う事になります。


Public Class Form1
 Private downPos As Point = Point.Empty
 Private upPos As Point = Point.Empty

 Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseDown
  If e.Button = System.Windows.Forms.MouseButtons.Left Then
   downPos = e.Location
   upPos = downPos
  End If
 End Sub

 Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseUp
  If e.Button = System.Windows.Forms.MouseButtons.Left Then
   upPos = e.Location
   Me.Invalidate()
  End If
 End Sub

 Private Sub Form1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Me.Paint
  If upPos <> downPos Then
   Dim bounds As New Rectangle( _
    New Point(Math.Min(downPos.X, upPos.X), Math.Min(downPos.Y, upPos.Y)), _
    New Size(Math.Abs(downPos.X - upPos.X), Math.Abs(downPos.Y - upPos.Y)))
   e.Graphics.FillRectangle(Brushes.Black, Bounds)
  End If
 End Sub
End Class

[ツリー表示へ]
タイトルもうあきらめます。
記事No8323
投稿日: 2008/10/16(Thu) 00:22
投稿者くりーむぱん
花ちゃんさん、魔界の仮面弁士さん、
どうもありがとうございました。
他のサイトでもお名前拝見しました。
自分の質問にお答えいただきうれしいです。

VB6.0用に書かれたコードを
VB6.0が無いのでVB2005用に書き換えています。
フォーム上をマウスでドラッグ、
ドラッグした始点と終点に直線を引くをしたいのです。
System.Drawing.Graphics.drawLine =(startX,startY)-(e.X,e.Y), , BF
調べていろいろ試しているのですが、
ここのエラーがどうしても外せなくて困っています。

まだ調べは続けますが、何かヒントだけでも頂けたらと思います。
よろしくお願いします。

[ツリー表示へ]
タイトルRe: もうあきらめます。
記事No8324
投稿日: 2008/10/16(Thu) 06:50
投稿者花ちゃん
> フォーム上をマウスでドラッグ、
> ドラッグした始点と終点に直線を引くをしたいのです。

ここのTips集のグラフィック関係の下記等はご覧になられましたか?
それに魔界の仮面弁士さんが投稿されてコードは試してみましたか?

マウスのドラッグで範囲を選択し(四角形を描く)画像を取得してPictureBox2 に表示 (2)
http://hanatyan.sakura.ne.jp/dotnet/zu06.htm

直線・四角形・楕円・三角形(多角形)を描画及び消去 (11個)
http://hanatyan.sakura.ne.jp/dotnet/zu05.htm

VB6.0 の○○は、VB.NET ではどうなった
http://hanatyan.sakura.ne.jp/dotnet/vb6tonet.htm

グラフィック関係は、VB6.0 とはかなり違ってきています、基礎から調べ直さないと
そのまま移行するような事ができません。
(問題の行のコードを修正しても次の行で又、つまづくことになります。)

カラーの指定の仕方一つとっても全然方法が違っていたので私も苦労したのでその辺の
違いを含めてここのTips集に書いたつもりです。
直線・四角形・楕円・三角形(多角形)を描画及び消去 のコードを一度試して見て
下さい。

[ツリー表示へ]
タイトルRe^2: もうあきらめます。
記事No8335
投稿日: 2008/10/17(Fri) 09:34
投稿者くりーむぱん
> グラフィック関係は、VB6.0 とはかなり違ってきています、基礎から調べ直さないと
> そのまま移行するような事ができません。
> (問題の行のコードを修正しても次の行で又、つまづくことになります。)

 【全文引用を避け、必要な部分のみを引用するようにして下さい。】

ありがとうございました。
元のVB6.0用の記述コードがシンプルだったので、
簡単に出来ると思ったのが大間違いでした。

あちこち検索してみましたが、
Lineが何に変わったか?を中心に探していましたので
出てくるのは、g.DrawLine(Pens.Red, 0, 0, 100, 200)みたいなものばかりで
そこから先に進めていませんでした。
また、見つけても意味が解らないので読んでもさっぱりでした。
教えていただいたページ、
今の自分のスキルでは、理解出来るかどうか解りませんが
昔、マイコンベーシックマガジンのプログラムを
意味も解らず闇雲に打ってゲームが動いたときの
感動を思い出してなんとか踏ん張ってみたいと思います。
ご教授どうもありがとうございました。

[ツリー表示へ]
タイトル何とか解決できたと思います。
記事No8345
投稿日: 2008/10/20(Mon) 15:26
投稿者くりーむぱん
花ちゃん様、魔界の仮面弁士様
どうもありがとうございました。
途中で右手が痛くて止めようかとも思いましたが、
何とか踏ん張れました。
ありがとうございました。

Public Class Form1
    Dim startX As Integer
    Dim startY As Integer
        Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
            If e.Button = Windows.Forms.MouseButtons.Left Then
                startX = e.X
                startY = e.Y
            End If
        End Sub
        Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
        Dim g As Graphics = Me.CreateGraphics
        g.DrawLine(Pens.Red, startX, startY, e.X, e.Y)
    End Sub
End Class

[ツリー表示へ]
タイトルRe: 何とか解決できたと思います。
記事No8346
投稿日: 2008/10/20(Mon) 16:50
投稿者魔界の仮面弁士
できましたね、おめでとうございます。

が。あともう一歩。


> Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseUp
>   Dim g As Graphics = Me.CreateGraphics
>   g.DrawLine(Pens.Red, startX, startY, e.X, e.Y)
> End Sub

これはマズイです。Graphics の後始末が行われていませんので。

『作成した Graphics の使用後は、それを作成元が責任を持って破棄せねばならない』
という仕様になっているため、実際には上記は、

 Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseUp
  Using g As Graphics = Me.CreateGraphics
   g.DrawLine(Pens.Red, startX, startY, e.X, e.Y)
  End Using
 End Sub
のように記述する必要があります。
(Using ブロックを使うことで、使用後に破棄されるようになります)


それから、CreateGraphics に描画した内容というのは、別のフォームが重なったり、
フォームを最小化したりすると容易に消えてしまうため、あまり推奨できる描画方法では
ありません。(これは VB6 でいえば、AutoRedraw = False の状態だと思ってください)

一度描いた線を継続的に表示しておきたい場合には、No.8317 にて回答したように
描画処理を「Paint イベント」の e.Graphics にて行うようにすれば OK です。
(この点は、VB6 の Paint イベントの仕組みと同様です)
なお Paint イベントの e.Graphics は、自分で『作成』したものではないため、こちらは
Using 等による「破棄」を行う必要が無い(破棄してはいけない)点に注意してください。

[ツリー表示へ]