11-12-15, 10:30 PM
السلام عليكم ورجمة الله و بركاته
إيجاد مكان الماوس عي الكونترول في أي وقت أمر هام جدا و أهميته تكمن في أننا تستطيع إستخدامه في كثير من الحلول البرمجية خاصة في ألعاب الكمبيوتر و تحريك الأشياء المرسومة مثل الأشكال الهندسية المختلفة و في تحريك الصور او تحريك اي شئ موجود داخل الكونترول أو حتي إيجاد أي شئ علي الكونترول في أي وقت خاصة وقت التشغيل وأفضل مثال عملي للفكرة التي اريد كتابتها هو Google Maps
أغلب المبرمجين يعتمدون علي طرق و دوال موجودة بالفعل في الكونترول مثل : -
Control.PointToClient Method
Control.MousePosition
Cursor.Position
و لأني مهتم جدا بالجرافكس و Animation وجدت انني دائما ما يجب علي أن أتعامل مع أجداث الماوس المختلفة حتي أستطيع تحديد مكان الماوس علي الكونترول و لكي أوفر علي نفسي مشقة تكرار كتابة هذه الأكواد وجدت انني أحتاج الي تطوير الكونترول الخاص بشركة مايكروسوفت و إضافة بعض الصفات الإضافية له و التي أستطيع بإستخدامها تحديد مكان الماوس داخل حدود الكونترول في أي وقت وكان شرطا لدي لتنفيذ هذه الفكرة هو أن لا أستخدم الدوال والطرق الخاصة بشركة مايكروسوفت والمذكورة أعلاه
الفكرة:
لكي أقوم بتنفيذ الفكرة كنت في حاجة الي إطلاق حدث جديد EventHandler داخل أحداث الماوس المختلفة مثل MouseMove و مثل MouseDown بحيث يتم ربط عناصر هذا الحدث مع مكان الماوس وبالتالي استطيع أن أستفيد من هذا الحدث في استرجاع مكان الماوس داخل الكونترول في اي وقت.
الكود :
الكود الخاص بهذا EventHandler مع EventArgs الخاصة به موجود أدناه و هو بسيط جدا حيث أن عناصره عبارة عن نقطة Point
الأن يتبقي السؤال كيف يتم الربط بين الأكواد أعلاه و أي كونترول أخر؟
وللعلم فقط يمكن استخدام الأكواد اعلاه مع أي كونترول جديد يتم كتابته أو مع اي كونترول يتم توريثه من أي كونترول أخر و حتي يمكن إستخدامه مع الفورم وهنا سوف استخدم الأكواد أعلاه في يناء كونترول جديد و بسيط و علي المهتمين بالفكرة إستخدام نفس الأسلوب مع أي كونترول أخر.
الفكرة العامة هنا هي عمل HitTest لمكان الماوس علي أن يتم عمل Clamp للنقطة التي سوف تستخدم لإيجاد مكان الماوس بحيث انها لا تخرج عن حدود الكونترول ومن ثم يتم تمرير هذا النقطة الي الحدث الموجود في الكود أعلاه من داخل أحداث الماوس
الكونترول :
الأن لنقوم بعمل Build لهذا الكونترول ثم نضعه داخل الفورم
ثم نقوم بإطلاق الحدث MouseLocationChangedEventArgs و الخاص بهذا الكونترول من داخل الفورم بحيث يكون الكود كالتالي والهدف هنا هو اختبار نجاح الفكرة التي نتحدث هنا
الأن لنقوم بعمل Run للفورم و لننظر إلي التكست الخاص بالفورم وخاصة عندما يكون الماوس داخل حدود الكونترول الجديد
أتمني تكون الفكرة مفيدة لكم و في المرفقات ستجدون نسخة من الكود بنسخة الفيجوال استوديو 2012
و إن شاء الله وفي المشاركات اللاحقة سوف أوضح كيفية الإستفادة من الأكواد التي كتبناها أعلاه و كيفية استخدامها مع أشياء أخري مثل تحريك الرسومات او تحريك الكونترول أو ايجاد اي كونترول
تقبلوا تحياتي
إيجاد مكان الماوس عي الكونترول في أي وقت أمر هام جدا و أهميته تكمن في أننا تستطيع إستخدامه في كثير من الحلول البرمجية خاصة في ألعاب الكمبيوتر و تحريك الأشياء المرسومة مثل الأشكال الهندسية المختلفة و في تحريك الصور او تحريك اي شئ موجود داخل الكونترول أو حتي إيجاد أي شئ علي الكونترول في أي وقت خاصة وقت التشغيل وأفضل مثال عملي للفكرة التي اريد كتابتها هو Google Maps
أغلب المبرمجين يعتمدون علي طرق و دوال موجودة بالفعل في الكونترول مثل : -
Control.PointToClient Method
Control.MousePosition
Cursor.Position
و لأني مهتم جدا بالجرافكس و Animation وجدت انني دائما ما يجب علي أن أتعامل مع أجداث الماوس المختلفة حتي أستطيع تحديد مكان الماوس علي الكونترول و لكي أوفر علي نفسي مشقة تكرار كتابة هذه الأكواد وجدت انني أحتاج الي تطوير الكونترول الخاص بشركة مايكروسوفت و إضافة بعض الصفات الإضافية له و التي أستطيع بإستخدامها تحديد مكان الماوس داخل حدود الكونترول في أي وقت وكان شرطا لدي لتنفيذ هذه الفكرة هو أن لا أستخدم الدوال والطرق الخاصة بشركة مايكروسوفت والمذكورة أعلاه
الفكرة:
لكي أقوم بتنفيذ الفكرة كنت في حاجة الي إطلاق حدث جديد EventHandler داخل أحداث الماوس المختلفة مثل MouseMove و مثل MouseDown بحيث يتم ربط عناصر هذا الحدث مع مكان الماوس وبالتالي استطيع أن أستفيد من هذا الحدث في استرجاع مكان الماوس داخل الكونترول في اي وقت.
الكود :
الكود الخاص بهذا EventHandler مع EventArgs الخاصة به موجود أدناه و هو بسيط جدا حيث أن عناصره عبارة عن نقطة Point
PHP كود :
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
PHP كود :
Public Delegate Sub MouseLocationChangedEventHandler(sender As Object, e As MouseLocationChangedEventArgs)
الأن يتبقي السؤال كيف يتم الربط بين الأكواد أعلاه و أي كونترول أخر؟
وللعلم فقط يمكن استخدام الأكواد اعلاه مع أي كونترول جديد يتم كتابته أو مع اي كونترول يتم توريثه من أي كونترول أخر و حتي يمكن إستخدامه مع الفورم وهنا سوف استخدم الأكواد أعلاه في يناء كونترول جديد و بسيط و علي المهتمين بالفكرة إستخدام نفس الأسلوب مع أي كونترول أخر.
الفكرة العامة هنا هي عمل HitTest لمكان الماوس علي أن يتم عمل Clamp للنقطة التي سوف تستخدم لإيجاد مكان الماوس بحيث انها لا تخرج عن حدود الكونترول ومن ثم يتم تمرير هذا النقطة الي الحدث الموجود في الكود أعلاه من داخل أحداث الماوس
الكونترول :
PHP كود :
Imports System.ComponentModel
Public Class CairoControl
Inherits Control
Private _mouseLocation As Point = New Point(0, 0)
<Browsable(False)> <Category("Behavior")> <Description("Gets the position of the mouse cursor in control coordinates.")> <DefaultValue(GetType(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 Clas
الأن لنقوم بعمل Build لهذا الكونترول ثم نضعه داخل الفورم
ثم نقوم بإطلاق الحدث MouseLocationChangedEventArgs و الخاص بهذا الكونترول من داخل الفورم بحيث يكون الكود كالتالي والهدف هنا هو اختبار نجاح الفكرة التي نتحدث هنا
PHP كود :
Public Class Form1
Private Sub CairoControl1_MouseLocationChanged(sender As Object, e As MouseLocationChangedEventArgs) Handles CairoControl1.MouseLocationChanged
Me.Text = e.ToString
End Sub
End Class
الأن لنقوم بعمل Run للفورم و لننظر إلي التكست الخاص بالفورم وخاصة عندما يكون الماوس داخل حدود الكونترول الجديد
أتمني تكون الفكرة مفيدة لكم و في المرفقات ستجدون نسخة من الكود بنسخة الفيجوال استوديو 2012
و إن شاء الله وفي المشاركات اللاحقة سوف أوضح كيفية الإستفادة من الأكواد التي كتبناها أعلاه و كيفية استخدامها مع أشياء أخري مثل تحريك الرسومات او تحريك الكونترول أو ايجاد اي كونترول
تقبلوا تحياتي