いつもお世話になっております。
現在、VB.NETにて図形描画ソフトを作成しております。
MouseDownとMouseMoveを使用し、円を描く際に軌跡を表示
させたいのですが、どのようにすればよいのか皆目検討がつきません…。
直線と矩形については、色々試した結果
下記の2度書き描画にて行えるようになりました。
ControlPaint.DrawReversibleLine(線)
ControlPaint.DrawReversibleFrame(矩形)
VB6ではLineやCircleにて軌跡を表示できるようなのですが、
VB.NETで円の軌跡を表示するにはどのようにすればよいのでしょうか?
MouseMoveにて毎回削除しようにも、図形の削除方法がわかりません…。
どなたかお助けください。
ControlPaint クラスはその名の通り独自のコントロールを
描画するためのもので、ただ単に図形を描きたいだけなら
System.Drawing.Graphics クラスだと思いますが?
Graphics.DrawArc メソッドで好きなタイミングで円弧を
描いていけばいけばいいのでは?
ご返信ありがとうございます。
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で描いた円が削除できないものかと試行錯誤
しております。
>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 とか実行すれば済んじゃう話では?
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でも↑のサンプルの内容が理解できれば…。
何度もご回答ありがとうございました。
Refreshで解決いたしました。
Refreshなんてあったんですね…。
本当に有難うございました。
またお世話になるかも知れませんが、
そのときはまたご教授下さい。
ツイート | ![]() |