2015-09-13 2 views
1

Я искал в Интернете о том, как нарисовать прямоугольное отверстие на форме, и я нашел this хороший пример на языке Delphi, затем я попытался воспроизвести этот пример в VB.NET, до сих пор я добился успеха в рисовании прямоугольника в форме, но размеры этого прямоугольника не соответствуют реальному положению мыши на экране моего компьютера.Размеры прямоугольных отверстий не равны реальной позиции мыши на экране компьютера

А также относительно примера Delphi имели характеристики для адаптации функции ClientToScreen к моему примеру, это, вероятно, может быть решением этой проблемы.

Кто-то может помочь мне с этим, пожалуйста?

Вот моя последняя попытка:

<DllImport("user32.dll")> _ 
    Private Shared Function ClientToScreen(ByVal hWnd As IntPtr, ByRef lpPoint As Point) As Boolean 
    End Function 

    Dim mRect As Rectangle 

    Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles MyBase.MouseDown 
     mRect = New Rectangle(e.X, e.Y, 0, 0) 
     Me.Invalidate() 
    End Sub 

    Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs) 

     If e.Button = Windows.Forms.MouseButtons.Left Then 

      Dim gp As New System.Drawing.Drawing2D.GraphicsPath 

      gp.AddRectangle(New Rectangle(0, 0, Me.Width, Me.Height)) 

      mRect = New Rectangle(mRect.Left, mRect.Top, e.X - mRect.Left, e.Y - mRect.Top) 

      gp.AddRectangle(mRect) 

      Me.Region = New Region(gp) 

      Me.Invalidate() 
     End If 
    End Sub 

    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) 
     Using pen As New Pen(Color.Red, 3) 
      e.Graphics.DrawRectangle(pen, mRect) 
     End Using 
    End Sub 

Это производит следующее: result

ответ

0

Вариант 1

Вы можете рассчитать расстояние между верхней левой точки формы и верхней левую точку своей клиентской области, используя Me.PointToClient(Me.Location) и использовать его, если вы хотите вычислить местоположение:

Код

Public Class HoleForm 
    Dim mRect As Rectangle 
    Dim d 
    Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles MyBase.MouseDown 
     mRect = New Rectangle(e.X - d.x, e.Y - d.y, 0, 0) 
     Me.Invalidate() 
    End Sub 

    Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs) 

     If e.Button = Windows.Forms.MouseButtons.Left Then 

      Dim gp As New System.Drawing.Drawing2D.GraphicsPath 

      gp.AddRectangle(New Rectangle(0, 0, Me.Width, Me.Height)) 

      mRect = New Rectangle(mRect.Left, mRect.Top, e.X - d.x - mRect.Left, e.Y - d.y - mRect.Top) 

      gp.AddRectangle(mRect) 

      Me.Region = New Region(gp) 

      Me.Invalidate() 
     End If 
    End Sub 

    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) 
     Dim mRect2 = New Rectangle(mRect.Location, mRect.Size) 
     mRect2.Offset(d) 
     Using pen As New Pen(Color.Red, 3) 
      e.Graphics.DrawRectangle(pen, mRect2) 
     End Using 
    End Sub 

    Private Sub HoleForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     d = Me.PointToClient(Me.Location) 
    End Sub 
End Class 

Скриншот

enter image description here

Option2

Вы можете использовать Me.TransparencyKey= Color.Red и заполнить прямоугольник с красным цветом, то это будет дырой, как вы ожидаете.

Код

Public Class HoleForm 
    Public Sub New() 

     ' This call is required by the designer. 
     InitializeComponent() 

     ' Add any initialization after the InitializeComponent() call. 
     Me.TransparencyKey = Color.Red 
    End Sub 
    Dim mRect As Rectangle 
    Protected Overrides Sub OnMouseDown(e As MouseEventArgs) 
     mRect = New Rectangle(e.X, e.Y, 0, 0) 
     Me.Invalidate() 
     MyBase.OnMouseDown(e) 
    End Sub 
    Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs) 

     If e.Button = Windows.Forms.MouseButtons.Left Then 
      mRect = New Rectangle(mRect.Left, mRect.Top, e.X - mRect.Left, e.Y - mRect.Top) 
      Me.Invalidate() 
     End If 
    End Sub 

    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) 
     Using HoleBrush As New SolidBrush(Me.TransparencyKey) 
      e.Graphics.FillRectangle(HoleBrush, mRect) 
     End Using 
     Using BorderPen As New Pen(Color.Blue, 3) 
      e.Graphics.DrawRectangle(BorderPen, mRect) 
     End Using 
    End Sub 
End Class 

Скриншот

enter image description here

 Смежные вопросы

  • Нет связанных вопросов^_^