(VB.NET)円を図形描くときに軌跡を表示するには?

解決


イナフ  2005-06-21 23:53:33  No: 122843

いつもお世話になっております。

現在、VB.NETにて図形描画ソフトを作成しております。

MouseDownとMouseMoveを使用し、円を描く際に軌跡を表示
させたいのですが、どのようにすればよいのか皆目検討がつきません…。
直線と矩形については、色々試した結果
下記の2度書き描画にて行えるようになりました。

ControlPaint.DrawReversibleLine(線)
ControlPaint.DrawReversibleFrame(矩形)

VB6ではLineやCircleにて軌跡を表示できるようなのですが、
VB.NETで円の軌跡を表示するにはどのようにすればよいのでしょうか?

MouseMoveにて毎回削除しようにも、図形の削除方法がわかりません…。

どなたかお助けください。


特攻隊長まるるう  2005-06-22 00:24:51  No: 122844

ControlPaint クラスはその名の通り独自のコントロールを
描画するためのもので、ただ単に図形を描きたいだけなら
System.Drawing.Graphics クラスだと思いますが?
Graphics.DrawArc メソッドで好きなタイミングで円弧を
描いていけばいけばいいのでは?


イナフ  2005-06-22 03:54:04  No: 122845

ご返信ありがとうございます。

MouseMoveにて円を描画しますと、マウスを動かす度に
すべての円が描かれてしまい軌跡にはなりませんでした。

VB6では下記の様にCircleを2度描画することにより出来ていたようですが…。

Form2.Circle (X1, Y1), d, QBColor(11) '(2度描きで手前の軌跡を消す )
Form2.Circle (X1, Y1), 半径, QBColor(11)  '( 赤色で軌跡を描く )
d = 半径

VB.NETでは出来ないようです。困りました…。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
現在はテスト的にボタン1でGraphics.DrawEllipseにて円を描き
ボタン2でボタン1で描いた円が削除できないものかと試行錯誤
しております。


特攻隊長まるるう  2005-06-22 20:50:38  No: 122846

>VB6では下記の様にCircleを2度描画することにより出来ていたようですが…。
>
>Form2.Circle (X1, Y1), d, QBColor(11) '(2度描きで手前の軌跡を消す )
>Form2.Circle (X1, Y1), 半径, QBColor(11)  '( 赤色で軌跡を描く )
>d = 半径
半径が『d』と『半径』の2重円を QBColor(11) は明るいシアンだっけ?
で描いてるだけで、同じ色で中心点が同じ円を描いたら半径が大きいほうの
円を1つ描いただけの処理と同じで…どの辺が軌跡なのか理解できませんが…。

>VB.NETでは出来ないようです。困りました…。
円を2個描くだけなのに何を根拠に何ができないのか伝わりません。
普通に出来ます。

>MouseMoveにて円を描画しますと、マウスを動かす度に
>すべての円が描かれてしまい軌跡にはなりませんでした。
Refresh とか実行すれば済んじゃう話では?


特攻隊長まるるう  2005-06-23 01:42:05  No: 122847

PaintEventArgs.Graphics プロパティのヘルプにサンプル載ってるし
必要無いんだけど、お遊びで作ったので暇な閲覧者さんは STACK_STEP
を変更して遊んで下さい。
〜サブタイトル  軌跡って言ったらこっちでしょ〜
[VB.NET]
    Private Const STACK_STEP As Byte = 6 ' 12 36
    Private Const COLOR_STEP As Integer = 255 / STACK_STEP
    Private Const CIRCLE_DIAMETER As Integer = 100
    Private mRedBrush As System.Drawing.SolidBrush
    Private mBlackBrush As System.Drawing.SolidBrush
    Private mX(STACK_STEP - 1), mY(STACK_STEP - 1) As Integer
    Private mCount As Byte
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.mRedBrush = New System.Drawing.SolidBrush(System.Drawing.Color.Red)
        Me.mBlackBrush = New System.Drawing.SolidBrush(System.Drawing.Color.Black)
        Me.mCount = 0
    End Sub
    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
        Dim i As Integer
        With e.Graphics
            For i = 0 To STACK_STEP - 2
                Me.mBlackBrush.Color = Color.FromArgb(255 - i * COLOR_STEP, 255 - i * COLOR_STEP, 255 - i * COLOR_STEP)
                .FillEllipse(Me.mBlackBrush, Me.mX(i), Me.mY(i), CIRCLE_DIAMETER, CIRCLE_DIAMETER)
            Next
            .FillEllipse(Me.mRedBrush, Me.mX(STACK_STEP - 1), Me.mY(STACK_STEP - 1), CIRCLE_DIAMETER, CIRCLE_DIAMETER)
        End With
    End Sub
    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove
        Me.mX(Me.mCount) = e.X
        Me.mY(Me.mCount) = e.Y

        If Me.mCount = STACK_STEP - 1 Then
            Me.mCount = 0
            'Call Me.Refresh()
            Call Me.Invalidate()
        Else
            Me.mCount += 1
        End If
    End Sub

>MouseDownとMouseMoveを使用し、
とかからよくよく考えると『MouseDown の点を中心として MouseMove の位置に円周を
表示しつづけ、MouseUp 辺りで終了』したいのか?って閃いたけど…関係ないって
言ってしまえば全く関係ないサンプルだwでも↑のサンプルの内容が理解できれば…。


イナフ  2005-06-23 04:52:43  No: 122848

何度もご回答ありがとうございました。

Refreshで解決いたしました。
Refreshなんてあったんですね…。

本当に有難うございました。

またお世話になるかも知れませんが、
そのときはまたご教授下さい。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加