Capture Mouse Position within Control Coordinates


إيجاد مكان الماوس عي الكونترول في أي وقت أمر هام جدا و أهميته تكمن في أننا تستطيع إستخدامه في كثير من الحلول البرمجية خاصة في ألعاب الكمبيوتر و تحريك الأشياء المرسومة مثل الأشكال الهندسية المختلفة و في تحريك الصور او تحريك اي شئ موجود داخل الكونترول أو حتي إيجاد أي شئ علي الكونترول في أي وقت خاصة وقت التشغيل وأفضل مثال عملي للفكرة التي اريد كتابتها هو
 Google Maps

أغلب المبرمجين يعتمدون علي طرق و دوال موجودة بالفعل في الكونترول مثل : -

Control.PointToClient Method
Control.MousePosition
Cursor.Position

و لأني مهتم جدا بالجرافكس  و الانيميشين وجدت انني دائما ما يجب علي أن أتعامل مع أجداث الماوس المختلفة حتي أستطيع تحديد مكان الماوس علي الكونترول و لكي أوفر علي نفسي مشقة تكرار كتابة هذه الأكواد وجدت انني أحتاج الي تطوير الكونترول الخاص بشركة مايكروسوفت و إضافة بعض الصفات الإضافية له و التي أستطيع بإستخدامها تحديد مكان الماوس داخل حدود الكونترول في أي وقت وكان شرطا لدي لتنفيذ هذه الفكرة هو أن لا أستخدم الدوال والطرق الخاصة بشركة مايكروسوفت والمذكورة أعلاه

الفكرة:

لكي أقوم بتنفيذ الفكرة كنت في حاجة الي إطلاق حدث جديد  داخل أحداث الماوس المختلفة  بحيث يتم ربط عناصر هذا الحدث مع مكان الماوس وبالتالي استطيع أن أستفيد من هذا الحدث في استرجاع مكان الماوس داخل الكونترول في اي وقت.

الكود :

الكود الخاص بهذا الحدث  موجود أدناه و هو بسيط جدا حيث أن عناصره عبارة عن نقطة


Public Class MouseLocationChangedEventArgs
    Inherits EventArgs

    Public Sub New(pt As Point)
        Me._Location = pt
    End Sub

    Public Property Location As Point

    Public ReadOnly Property X As Integer
        Get
            Return Me.Location.Y
        End Get
    End Property

    Public ReadOnly Property Y As String
        Get
            Return Me.Location.X
        End Get
    End Property

    Public Overrides Function ToString() As String
        Return (Integer.Parse(Me.X, System.Globalization.CultureInfo.CurrentCulture) & "," & Integer.Parse(Me.Y, System.Globalization.CultureInfo.CurrentCulture))
    End Function

End Class

Public Delegate Sub MouseLocationChangedEventHandler(sender As Object, e As MouseLocationChangedEventArgs)

الأن يتبقي السؤال كيف يتم الربط بين الأكواد أعلاه و أي كونترول أخر؟
وللعلم فقط يمكن استخدام الأكواد اعلاه مع أي كونترول جديد يتم كتابته أو مع اي كونترول يتم توريثه من أي كونترول أخر و حتي يمكن إستخدامه مع الفورم وهنا سوف استخدم الأكواد أعلاه في يناء كونترول جديد و بسيط و علي المهتمين بالفكرة إستخدام نفس الأسلوب مع أي كونترول أخر.

الكونترول :

Imports System.ComponentModel

Public Class CairoControl
    Inherits Control

    Private _mouseLocation As Point = New Point(0, 0)

    _
    Public ReadOnly Property MouseLocation As Point
        Get
            Return Me._mouseLocation
        End Get
    End Property

    Private Sub ClampPointToClient(pt As Point)
        Me.ClampPointToClient(pt, Me.ClientRectangle.Width - 1, Me.ClientRectangle.Height - 1)
    End Sub

    Private Sub ClampPointToClient(pt As Point, w As Integer, h As Integer)
        If pt.X < 0 Then
            pt.X = 0
        End If
        If pt.X > w - 1 Then
            pt.X = w - 1
        End If

        If pt.Y < 0 Then
            pt.Y = 0
        End If
        If pt.Y > h - 1 Then
            pt.Y = h - 1
        End If
    End Sub

    Private Function HitPoint(pt As Point) As Boolean
        Me.ClampPointToClient(pt)
        If pt.X >= 0 AndAlso pt.X < Me.Width AndAlso pt.Y >= 0 AndAlso pt.Y < Me.Height Then
            Me._mouseLocation.X = pt.X
            Me._mouseLocation.Y = pt.Y
            Return True
        End If
        Return False
    End Function

    Protected Sub OnMouseLocationChanged(e As MouseLocationChangedEventArgs)
        RaiseEvent MouseLocationChanged(Me, e)
    End Sub

    Protected Overrides Sub OnMouseMove(e As MouseEventArgs)
        MyBase.OnMouseMove(e)
        If Me.HitPoint(e.Location) Then
            Dim args As New MouseLocationChangedEventArgs(Me._mouseLocation)
            Me.OnMouseLocationChanged(args)
        End If
    End Sub

    Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
        MyBase.OnMouseDown(e)
        If Me.HitPoint(e.Location) Then
            Dim args As New MouseLocationChangedEventArgs(Me._mouseLocation)
            Me.OnMouseLocationChanged(args)
        End If
    End Sub

    Public Event MouseLocationChanged As MouseLocationChangedEventHandler

End Class

استخدام الكود:


Public Class Form1

    Private Sub CairoControl1_MouseLocationChanged(sender As Object, e As MouseLocationChangedEventArgs) Handles CairoControl1.MouseLocationChanged
        Me.Text = e.ToString
    End Sub

End Class
 


Comments

Popular posts from this blog

مقدمة الي تشفير الحروف الأبجدية العربية

VB.NET Translucent Control using GDI+

Add Custom Event to a Class in VB.NET