2014-09-15 3 views
0

"빠른 앤 더티"이미지 편집기를 쓰고 있습니다. 사용자는 이미지를 pbOriginal에로드하고 자르기 사각형을 드래그하여 pbAltered에 표시 할 수 있습니다. 이 기능은 제 목적을 위해 잘 작동합니다.마우스로 Picturebox 컨트롤 입력

그러나 사용자가 마우스 버튼을 사용하여 그림 상자에 마우스를 놓을 때 코딩하는 데 문제가 있습니다. (일종의 드래그 이벤트와 비슷하지만, 아무 것도 드래그하지 않으려 고합니다. 마우스로 입력을 캡처하고 싶습니다.) 입력을 감지하자마자 선택 프로세스를 시작하게하는 것이 이상적입니다. 활성 LMB을 감지하지만 지금까지 아무 것도 던지지 않은 것은 작동하는 것 같습니다.

다음은 두 가지 코드 조각입니다. 첫 번째는 MouseDown 이벤트를 감지하고 두 번째 이벤트는 MouseMove 이벤트를 감지합니다. MouseEnter를 사용하여 MouseDown 함수의 동작을 모방하는 것을 찾고 있습니다. (두 번째 기능은 무관하다, 그러나 나는 완벽을 위해 그것을 포함하고있다.)

Private Sub pbOriginal_MouseDown(sender As Object, e As MouseEventArgs) Handles pbOriginal.MouseDown 

     If e.Button = Windows.Forms.MouseButtons.Left Then 
      cropX = e.X 
      cropY = e.Y 
      cropPen = New Pen(Color.Red, 2) 
      cropPen.DashStyle = DashStyle.DashDotDot 
      Altered = Nothing 
     End If 
     pbOriginal.Refresh() 

End Sub 

Private Sub pbOriginal_MouseMove(sender As Object, e As MouseEventArgs) Handles pbOriginal.MouseMove 

    Cursor = Cursors.Cross 

    If pbOriginal.Image Is Nothing Then Exit Sub 
    If cropX < 0 Or cropY < 0 Then Exit Sub 

    If e.Button = Windows.Forms.MouseButtons.Left And e.X <= pbOriginal.Right - pbOriginal.Left And e.X >= 0 And e.Y <= pbOriginal.Bottom - pbOriginal.Top And e.Y >= 0 Then 

     pbOriginal.Refresh() 

     Dim OldWidth As Integer = cropWidth 
     Dim OldHeight As Integer = cropHeight 

     cropWidth = e.X - cropX 
     cropHeight = e.Y - cropY 

     'Verify that we're maintaining a square 
     If cropWidth > cropHeight Then 
      If cropWidth > OldWidth Then 
       cropWidth = cropHeight 
      Else 
       cropHeight = cropWidth 
      End If 
     End If 
     If cropHeight > cropWidth Then 
      If cropHeight > OldHeight Then 
       cropHeight = cropWidth 
      Else 
       cropWidth = cropHeight 
      End If 
     End If 

     If cropWidth <= 0 Or cropHeight <= 0 Then 
      Altered = Nothing 
      btnCropNext.Enabled = False 
      Exit Sub 
     End If 


     pbOriginal.CreateGraphics.DrawRectangle(cropPen, cropX, cropY, cropWidth, cropHeight) 
     If cropWidth <> 0 And cropHeight <> 0 Then 
      Dim WRatio As Double = Original.Width/pbOriginal.Width 
      Dim HRatio As Double = Original.Height/pbOriginal.Height 
      Dim rect As Rectangle = New Rectangle(cropX * WRatio, cropY * HRatio, cropWidth * WRatio, cropHeight * HRatio) 
      'First we define a rectangle with the help of already calculated points 
      Dim OriginalImage As Bitmap = New Bitmap(Original, Original.Width, Original.Height) 
      'Original image 
      Dim _img As New Bitmap(CInt(cropWidth * WRatio), CInt(cropHeight * HRatio)) ' for cropinf image 
      Dim g As Graphics = Graphics.FromImage(_img) ' create graphics 
      g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic 
      g.PixelOffsetMode = Drawing2D.PixelOffsetMode.Default 
      g.CompositingQuality = Drawing2D.CompositingQuality.HighQuality 
      'set image attributes 
      g.DrawImage(OriginalImage, 0, 0, rect, GraphicsUnit.Pixel) 
      Altered = _img 
      btnCropNext.Enabled = True 

      OriginalImage.Dispose() 
     Else 
      Altered = Nothing 
      btnCropNext.Enabled = False 
     End If 

    End If 
End Sub 
+0

사용자가 클릭 한 내용에 따라 다릅니다. 양식을 포함하여 거의 모든 컨트롤은 마우스를 캡처하여 마우스가 다시 해제되고 MouseUp 이벤트가 발생할 때이를 확실하게 알 수 있습니다. 그림 상자는 마우스가 창 내부로 이동하는 것을 전혀 인식하지 못합니다. 사용자가 뭔가를 클릭 할 때 정확히 무엇이 발생해야 하는지를 약간 생각해야합니다. 아무 것도 없으면 MouseDown 이벤트에서 컨트롤의 캡처를 다시 False로 설정하십시오. –

+0

문제는 * pbOriginal_MouseDown * 이벤트가 발생하고 * cropX, cropY * 값이 설정된 후에 코드가 작동한다는 것입니다. * mouse down 이벤트 *가 다른 곳에서 트리거되었을 때 캡처를 해제하고 그림 상자 –

+0

으로 설정 한 경우에도 cropX, cropY *를 설정할 수 없습니다. 마우스 포인터가 'PictureBox'에 들어갈 때이를 감지하려면 상당히 공정해야합니다 'MouseEnter' 이벤트를 처리해야한다는 것이 명백합니다. 해당 이벤트가 발생하면 왼쪽 버튼이 눌려 졌는지 테스트하고, 그렇다면 'MouseDown' 이벤트가 같은 위치에서 발생했을 때처럼 수행합니다. – jmcilhinney

답변

0

MouseEnter Event를 사용 해달라고 및 테스트 만약 그렇다면, 다른 선택의 발전을 경우는, 클릭하면 LMB 현명한 방치. MouseMove 시험에서 MouseEnter http://msdn.microsoft.com/en-us/library/system.windows.forms.control.mouseenter(v=vs.110).aspx

당신이 MouseEnter를 사용하려는 해달라고하면 소개 추가 정보, MouseOver과 LMB 경우 각 사진. 하지만 난 처음으로 쉽고 빠르게 처리 할 수 ​​있다고 생각합니다.