التنبيهات التالية ظهرت :
Warning [2] count(): Parameter must be an array or an object that implements Countable - Line: 864 - File: showthread.php PHP 7.4.33 (Linux)
File Line Function
/showthread.php 864 errorHandler->error



تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
Capture Mouse Position within Control Coordinates
#1
السلام عليكم ورجمة الله و بركاته

إيجاد مكان الماوس عي الكونترول في أي وقت أمر هام جدا و أهميته تكمن في أننا تستطيع إستخدامه في كثير من الحلول البرمجية خاصة في ألعاب الكمبيوتر و تحريك الأشياء المرسومة مثل الأشكال الهندسية المختلفة و في تحريك الصور او تحريك اي شئ موجود داخل الكونترول أو حتي إيجاد أي شئ علي الكونترول في أي وقت خاصة وقت التشغيل وأفضل مثال عملي للفكرة التي اريد كتابتها هو 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.XSystem.Globalization.CultureInfo.CurrentCulture) & "," Integer.Parse(Me.YSystem.Globalization.CultureInfo.CurrentCulture))
 
   End Function

End Class 

PHP كود :
Public Delegate Sub MouseLocationChangedEventHandler(sender As ObjectAs MouseLocationChangedEventArgs

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

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

الكونترول :


PHP كود :
Imports System.ComponentModel

Public Class CairoControl
    Inherits Control

    Private _mouseLocation 
As Point = New Point(00)

 
   <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(ptMe.ClientRectangle.Width 1Me.ClientRectangle.Height 1)
 
   End Sub

    Private Sub ClampPointToClient
(pt As PointAs IntegerAs Integer)
 
       If pt.0 Then
            pt
.0
        End 
If
 
       If pt.1 Then
            pt
.1
        End 
If

 
       If pt.0 Then
            pt
.0
        End 
If
 
       If pt.1 Then
            pt
.1
        End 
If
 
   End Sub

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

 
   Protected Sub OnMouseLocationChanged(As MouseLocationChangedEventArgs)
 
       RaiseEvent MouseLocationChanged(Mee)
 
   End Sub

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

    Protected Overrides Sub OnMouseDown
(As MouseEventArgs)
 
       MyBase.OnMouseDown(e)
 
       If Me.HitPoint(e.LocationThen
            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 ObjectAs MouseLocationChangedEventArgsHandles CairoControl1.MouseLocationChanged
        Me
.Text e.ToString
    End Sub

End 
Class 

الأن لنقوم بعمل Run للفورم و لننظر إلي التكست الخاص بالفورم وخاصة عندما يكون الماوس داخل حدود الكونترول الجديد

أتمني تكون الفكرة مفيدة لكم و في المرفقات ستجدون نسخة من الكود بنسخة الفيجوال استوديو 2012

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

تقبلوا تحياتي


الملفات المرفقة
.rar   Test_MouseLocation.rar (الحجم : 73.45 ك ب / التحميلات : 48)
الرد }}}


الردود في هذا الموضوع
Capture Mouse Position within Control Coordinates - بواسطة silverlight - 11-12-15, 10:30 PM


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم