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

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

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

Re[2]: PictureBox上に選択した領域を点線で表示


(過去ログ 104 を表示中)

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

■62347 / inTopicNo.1)  PictureBox上に選択した領域を点線で表示
  
□投稿者/ 森のゴリラ (4回)-(2011/10/04(Tue) 15:28:42)

分類:[VB.NET/VB2005 以降] 

PictureBoxに表示させている画像の任意の領域を選択し、例えばその領域の画像の抜き取りや
トリミングなどを行いたいです。
よく、ペイントなどのお絵かきソフトで、画像上を矩形で選択し、点線を表示させていますが、
このようなことを実現したいです。
おそらくPictureBoxの再描画をするのだと思うのですが、例えば、マウス左ボタンでドラッグ(MouseMove)している間、
クリック箇所からの矩形を表示するには、どのようにすればいいのでしょうか?
自分の中のイメージとしては、

1.PictureBox.MouseDownで、(左ボタンの場合)マウスダウンした座標を変数に格納
2.PictureBox.MouseMoveで、(1.の状態を経たことを条件に)1.でマウスダウンした座標とマウスカーソルの座標間に
  矩形を表示

でいけると思いますが、矩形表示を具体的にどこで行うのかが分かりません。
PictureBoxの再描画について検索したところ、PaintイベントでPaintEventArgs引数のGraphicsを使って
再描画を行っているサンプルが多いようですが、今回のケースではどのように再描画を行えばいいのでしょうか?

何だか基本的なことが理解できていなくて申し訳ありませんが、よろしくお願いします。
なお、使用言語はVB2008です。
引用返信 編集キー/
■62348 / inTopicNo.2)  Re[1]: PictureBox上に選択した領域を点線で表示
□投稿者/ shu (1030回)-(2011/10/04(Tue) 15:54:14)
No62347 (森のゴリラ さん) に返信

Dim DashPen as Pen = New Pen(Color.Black, 1)
DashPen.DashStyle = Drawing2D.DashStyle.Custom
DashPen.DashPattern = New Single() {5, 5}

こんな感じでダッシュパターンを定義してDrawRectangleに渡すといいです。
DashPattern は線の長さ、空白の長さの繰り返しです。一点破線とかも作れます。
引用返信 編集キー/
■62349 / inTopicNo.3)  Re[1]: PictureBox上に選択した領域を点線で表示
□投稿者/ 魔界の仮面弁士 (2382回)-(2011/10/04(Tue) 16:13:31)
No62347 (森のゴリラ さん) に返信
> PictureBoxに表示させている画像の任意の領域を選択し、例えばその領域の画像の抜き取りや
> トリミングなどを行いたいです。

Public Class Form1
    Private Dragging As Boolean
    Private requireClip As Boolean = False
    Private MousePos1, MousePos2 As Point

    Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles PictureBox1.MouseDown
        Dragging = True
        MousePos1 = PictureBox1.PointToClient(MousePosition)
        PictureBox1.Invalidate()
    End Sub

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

    Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles PictureBox1.MouseUp
        requireClip = True
        PictureBox1.Refresh()
        Dragging = False
        requireClip = False
    End Sub

    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles PictureBox1.Paint
        If Dragging Then
            MousePos2 = PictureBox1.PointToClient(MousePosition)
            Dim DragArea As New Rectangle( _
                Math.Min(MousePos1.X, MousePos2.X), _
                Math.Min(MousePos1.Y, MousePos2.Y), _
                Math.Abs(MousePos1.X - MousePos2.X), _
                Math.Abs(MousePos1.Y - MousePos2.Y))

            If DragArea.Width > 0 AndAlso DragArea.Height > 0 Then
                If Not requireClip Then
                    ControlPaint.DrawFocusRectangle(e.Graphics, DragArea)
                Else
                    Dim bmp As New Bitmap(DragArea.Width, DragArea.Height)
                    Using g As Graphics = Graphics.FromImage(bmp)
                        Dim img As Image = If(PictureBox1.Image, PictureBox1.BackgroundImage)
                        If img Is Nothing Then
                            g.Clear(PictureBox1.BackColor)
                        Else
                            g.DrawImage(img, New Rectangle(Point.Empty, bmp.Size), DragArea, GraphicsUnit.Pixel)
                        End If
                    End Using
                    PictureBox2.Image = bmp
                End If
            End If
        End If
    End Sub
End Class

引用返信 編集キー/
■62350 / inTopicNo.4)  Re[2]: PictureBox上に選択した領域を点線で表示
□投稿者/ 森のゴリラ (5回)-(2011/10/04(Tue) 16:32:38)
2011/10/04(Tue) 16:36:59 編集(投稿者)

皆さま、早速のコメント・サンプルありがとうございました。
魔界の仮面弁士さまのサンプルを見て、PaintイベントがPictureBoxのInvalidate()メソッド等で発生していることが
理解できました。
また、shuさまのご提示の点線・破線の件もありがとうございました。
もう少し色々と試行錯誤しながらチャレンジしてみたいと思います。
また分からない点がありましたらお伺いします。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -