-1

私はこのコードをウェブ上で見つけました。これにより、長方形を描画して、この中に画像を保持することができます。しかし、この長方形を左から右、上から下だけでなく、すべての方向に描画する方法はありますか?助けてくれてありがとう!コードは次のとおりです。

Public Class frmSS
Private Declare Auto Function BitBlt Lib "gdi32.dll" ( _
 ByVal hdcDest As IntPtr, _
 ByVal nXDest As Integer, _
 ByVal nYDest As Integer, _
 ByVal nWidth As Integer, _
 ByVal nHeight As Integer, _
 ByVal hdcSrc As IntPtr, _
 ByVal nXSrc As Integer, _
 ByVal nYSrc As Integer, _
 ByVal dwRop As Int32) As Boolean

Private Declare Auto Function GetDC Lib "user32.dll" (ByVal hWnd As IntPtr) As IntPtr
Private Declare Auto Function ReleaseDC Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal hDC As IntPtr) As IntPtr

Private Sub frmSS_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
    Me.Location = New Point(0, 0)
    Me.ClientSize = Screen.GetBounds(Me).Size
    Me.BackColor = Color.Gray
    Me.DoubleBuffered = True
    Me.Opacity = 0.4#
    Me.Cursor = Cursors.Cross
    Me.ShowInTaskbar = False
End Sub

Private isDragging As Boolean = False
Private canDrag As Boolean = True
Private pt_start As Point = Point.Empty
Private pt_end As Point = Point.Empty

Private Sub frmSS_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
    If Me.canDrag Then
        Me.isDragging = True
        Me.pt_start = e.Location
    End If
End Sub

Private Sub frmSS_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    If Me.isDragging Then
        Me.pt_end = e.Location
        Me.Invalidate()
    End If
End Sub

Private Sub frmSS_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
    If Me.isDragging Then
        Me.isDragging = False
        Me.canDrag = False
        Me.Cursor = Cursors.Default
        Dim r As Rectangle = Me.SelectedRectangle
        Me.Hide()
        Application.DoEvents() 'Make sure everything's good and hidden.
        Me.CaptureThisArea(r)
        Me.Close()
    End If
End Sub

Private ReadOnly Property SelectedRectangle() As Rectangle
    Get
        With pt_start
            If .X >= pt_end.X OrElse .Y >= pt_end.Y Then Return Rectangle.Empty
            Return New Rectangle(.X, .Y, pt_end.X - .X, pt_end.Y - .Y)



        End With
    End Get
End Property

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    Dim g As Graphics = e.Graphics

    Using p As New Pen(Color.Black, 3)
        p.DashStyle = Drawing2D.DashStyle.Dash
        If Me.SelectedRectangle <> Rectangle.Empty Then
            g.FillRectangle(Brushes.Red, Me.SelectedRectangle)
            g.DrawRectangle(p, Me.SelectedRectangle)
        End If
    End Using

    MyBase.OnPaint(e)
End Sub

Private Sub CaptureThisArea(ByVal area As Rectangle)
    Dim bmp As New Bitmap(area.Width, area.Height, Imaging.PixelFormat.Format24bppRgb)
    Using g As Graphics = Graphics.FromImage(bmp)
        Dim srcDC As IntPtr = GetDC(IntPtr.Zero)
        Dim destDC As IntPtr = g.GetHdc()

        BitBlt(destDC, 0, 0, area.Width, area.Height, srcDC, area.X, area.Y, 13369376) 'SRCCOPY = 13369376

        g.ReleaseHdc(destDC)
        ReleaseDC(IntPtr.Zero, srcDC)
    End Using
    Dim s_dl As New SaveFileDialog()
    s_dl.Filter = "Bitmap Images (*.bmp)|*.bmp"
    If s_dl.ShowDialog() = DialogResult.Cancel Then Exit Sub
    bmp.Save(s_dl.FileName)
    MessageBox.Show("File saved!!!")
End Sub

エンドクラス

4

1 に答える 1

1

最初の MouseDown ポイントに基づいて四角形を決定し、MouseMove 中に、現在のマウス座標を各 X 値と Y 値の最小値と最大値に基づいて調整する必要があるかどうかを確認する必要があります。

pt_end をコメントアウトして、dragRect 変数を追加します。

'\\ Private pt_end As Point = Point.Empty
Private dragRect As Rectangle = Rectangle.Empty

MouseMove イベントを次のように変更します。

Private Sub frmSS_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseMove
  If Me.isDragging Then
    Dim minPoint As New Point(Math.Min(e.Location.X, pt_start.X), _
                              Math.Min(e.Location.Y, pt_start.Y))
    Dim maxPoint As New Point(Math.Max(e.Location.X, pt_start.X), _
                              Math.Max(e.Location.Y, pt_start.Y))
    dragRect = New Rectangle(minPoint, New Size(maxPoint.X - minPoint.X, _
                                                maxPoint.Y - minPoint.Y))
    Me.Invalidate()
  End If
End Sub

そこから、コメントアウトした の代わりに dragRect を使用するようにコードを変更しますSelectedRectangle

于 2012-05-21T13:53:59.550 に答える