C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: Mouse_Moveでの描画について


(過去ログ 71 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■41664 / inTopicNo.1)  Mouse_Moveでの描画について
  
□投稿者/ aki (1回)-(2009/09/27(Sun) 20:26:08)

分類:[.NET 全般] 

お世話になります

言語:VB.net,C#
内容:PicureBoxにMOUSE_MOVEイベントで線を描画したいのですが太さを大きくするとうまく
   描画がされません(大変汚くなります)

これはなぜなのでしょうか? もし対策などありましらたおしえてください

引用返信 編集キー/
■41668 / inTopicNo.2)  Re[1]: Mouse_Moveでの描画について
□投稿者/ たくボン (211回)-(2009/09/27(Sun) 21:37:06)
No41664 (aki さん) に返信
>    描画がされません(大変汚くなります)
>
> これはなぜなのでしょうか? もし対策などありましらたおしえてください

なにを使用して描画をしてますか?
DrawLineかな?細かいことだけど、どうやってるかを書かないと解答付け難いです。
引用返信 編集キー/
■41669 / inTopicNo.3)  Re[2]: Mouse_Moveでの描画について
□投稿者/ aki (2回)-(2009/09/27(Sun) 21:52:12)
こんなかんじです

Dim POS_X As Integer
Dim POS_Y As Integer

Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles   PictureBox1.MouseMove

Dim g As Graphics
g = PictureBox1.CreateGraphics()
g.SmoothingMode = Drawing2D.SmoothingMode.None


' Create a new Pen object.
Dim ePen As New Pen(Color.Green)

' Set the width to 80.
ePen.Width = 80

If e.Button = Windows.Forms.MouseButtons.Left Then
g.DrawLine(ePen, e.X, e.Y, POS_X, POS_Y)
End If

POS_X = e.X
POS_Y = e.Y
' Dispose of the custom pen.
ePen.Dispose()

End Sub
引用返信 編集キー/
■41672 / inTopicNo.4)  Re[3]: Mouse_Moveでの描画について
□投稿者/ たくボン (213回)-(2009/09/27(Sun) 22:33:51)
No41669 (aki さん) に返信
> こんなかんじです
> If e.Button = Windows.Forms.MouseButtons.Left Then
> g.DrawLine(ePen, e.X, e.Y, POS_X, POS_Y)
> End If

連続したなめらかな曲線をひきたいならDrawLineではちと厳しいかも。
DrawCurveでスプライン曲線を描画するのがいいのかも。
ただしMouseMoveでPointの配列を作るのは効率的じゃないと思うから、マウス速度、移動距離とかの重みを計算してPoint配列に追加していくのが理想かも。
描画部分は、Paintで行うのと、Penの変更がないのならメンバ変数に置いておいてFormのDisposeで破棄。
複数の曲線を描画する必要があるなら、クラスを用意してそのクラスでMouseDown, MouseMove, MouseUpのキャプチャとPoint配列の管理、描画メソッドの提供かな。
引用返信 編集キー/
■41673 / inTopicNo.5)  Re[4]: Mouse_Moveでの描画について
□投稿者/ たくボン (214回)-(2009/09/27(Sun) 22:59:32)
2009/09/27(Sun) 23:00:07 編集(投稿者)
2009/09/27(Sun) 23:00:03 編集(投稿者)

<pre><pre>■No41672 (たくボン さん) に返信
> ■No41669 (aki さん) に返信

とりあえず何も重みを考慮してない曲線描画のサンプル。

'CurveLine.vb
Public Class CurveLine
Public Corners As New List(Of Point)
Public Sub New(ByVal pos As Point)
Me.AddCorner(pos)
End Sub
Public Sub AddCorner(ByVal pos As Point)
Me.Corners.Add(pos)
End Sub
Public Sub Draw(ByVal g As Graphics, ByVal p As Pen)
g.DrawCurve(p, Me.Corners.ToArray)
End Sub
End Class

'Form1.vb
Public Class Form1
Dim ActiveCurve As CurveLine = Nothing
Dim Curves As New List(Of CurveLine)
Dim pen1 As Pen
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.pen1 = New Pen(Color.Green, 80)
End Sub
Private Sub PictureBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
Me.ActiveCurve = New CurveLine(e.Location)
End Sub
Private Sub PictureBox1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
If Me.ActiveCurve IsNot Nothing Then Me.ActiveCurve.AddCorner(e.Location)
Me.PictureBox1.Refresh()
End Sub
Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
If Me.ActiveCurve IsNot Nothing Then
Me.ActiveCurve.AddCorner(e.Location)
Me.Curves.Add(Me.ActiveCurve)
Me.ActiveCurve = Nothing
End If
Me.PictureBox1.Refresh()
End Sub
Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
For Each cl As CurveLine In Me.Curves
cl.Draw(e.Graphics, Me.pen1)
Next
If Me.ActiveCurve IsNot Nothing Then Me.ActiveCurve.Draw(e.Graphics, Me.pen1)
End Sub
End Class


開始と終了の線端の形状は、イラレとかのドローソフトを参考にして、角丸や円形に変更すればいいと思うです:-)
あとは、重みとかを考慮するとかしないと、連続で曲線を引くと当然重くなるから注意が必要かな。
可能ならベジエにするのもいいと思うけど、そこらは時間がないから勉強してみてください。
</pre></pre>
引用返信 編集キー/
■41674 / inTopicNo.6)  Re[5]: Mouse_Moveでの描画について
□投稿者/ たくボン (215回)-(2009/09/27(Sun) 23:04:28)
No41673 (たくボン さん) に返信
> 2009/09/27(Sun) 23:00:07 編集(投稿者)
> 2009/09/27(Sun) 23:00:03 編集(投稿者)
>
> ■No41672 (たくボン さん) に返信

補足:

あ、Penを最後Disposeしといて下さいw
色々な色や幅の線を描画するならCurveLineにPenオブジェクトを持たせるのがいいかも。
引用返信 編集キー/
■41709 / inTopicNo.7)  Re[6]: Mouse_Moveでの描画について
□投稿者/ aki (3回)-(2009/09/28(Mon) 22:47:43)
No41674 (たくボン さん) に返信
> ■No41673 (たくボン さん) に返信
>>2009/09/27(Sun) 23:00:07 編集(投稿者)
>>2009/09/27(Sun) 23:00:03 編集(投稿者)
>>
>>■No41672 (たくボン さん) に返信
>
> 補足:
>
> あ、Penを最後Disposeしといて下さいw
> 色々な色や幅の線を描画するならCurveLineにPenオブジェクトを持たせるのがいいかも。

丁寧なご回答ありがとうございます
太さを変えるのにこんなにめんどくさいとは考えていませんでした

ソースを参考に検討してみます 
ありがとうございました

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -