14-04-17, 03:34 AM
(آخر تعديل لهذه المشاركة : 15-04-17, 12:20 AM {2} بواسطة silverlight.)
الجزء الأول
هناك مجموعة من الدوال من النوع Shared و التي تم توزيعها علي بعض الكلاسات في الدوت نت وجميع هذه الدوال تشترك في شئ واحد ألا وهو إن مررت لها IntPtr أو Handle الخاص بالفورم او بالكونترول بشكل صحيح هنا سوف تحصل علي بعض المعلومات الهامة التي يمكن الاستفادة منها بأشكال عديدة.
وهذه الدوال كالتالي:
1- Control.FromHandle
و هي دالة حين تمرر لها IntPtr أو Handle الخاص بأي كونترول هنا سوف تحصل علي الكونترول الذي يمتلك هذا IntPtr او Handle
2- Screen.FromHandle
وهي دالة حين تمرر لها IntPtr أو Handle الخاص بأي كونترول هنا سوف تحصل علي Screen التي يوجد بها هذا الكونترول
3- NativeWindow.FromHandle
وهي أيضا دالة حين تمرر لها IntPtr أو Handle الخاص بأي كونترول هنا سوف تحصل علي NativeWindow المتصلة بهذا الكونترول
بشكل عام جميع هذه الدوال موجودة في فضاء الاسماء System.Windows.Forms
ولكنها موزعة علي ثلاثة كلاسات هي الكلاس Control و الكلاس Screen و الكلاس NativeWindow
للأسف موقع مايكروسوفت لم يعطي أمثلة توضح كيفية استخدام الدوال أعلاه
لذلك المثال التالي سيوضح كيفية التعامل مع هذه الدوال
وهنا انا استخدم Handle الخاص بالفورم مع جميع الأكواد أدناه
ولتحاول عزيزي القارئ أن تضع باتون علي الفورم و تستخدم Handle الخاص بهذا الباتون بدلا من الفورم و لتري ماذا سيحدث معك
1- الكود التالي يوضح كيفية الحصول علي أي كونترول من Handle الخاص به
يمكن كتابة الكود بالشكل التالي:
2- الكود التالي يوضح كيفية الحصول علي Screen التي تحتوي الكونترول او الفورم
3- وبالمثل الكود التالي يوضح كيفية الحصول علي NativeWindow المرتبطة بأي كونترول
4- الكودالتالي يوضح كيفية الحصول علي الفورم عن طريق تمرير Handle الخاص به الي مصفوفة Application.OpenForms
فقط تأكد ان تمرر Index الخاص بالفورم بشكل صحيح
أعتقد أنه و بعد الحصول علي Form او الكونترول أو Screen او NativeWindow بهذا الاسلوب سيكون الأمر يسيرا علي القارئ لكي يتعامل مع هذه المتغيرات كما يحلو له وذلك بهدف الحصول علي معلومات اضافية من كل متغير
قد يتساءل البعض و ما الفائدة من كل هذا الكود و الاجابة علي هذا التساؤل هي أننا نبني مكتبة بسيطة للتعامل مع الفورم و الكونترول و شاشة الكمبيوتر و بالتالي سوف نحتاج الي تلك المعلومات لكي نستفيد منها لاحقا
و لأننا نبني مكتبة لذلك من الأفضل كتابة كلاس بسيط بحيث حين نمرر له IntPtr أو Handle نستطيع أن نحصل علي المعلومات التي نحتاجها
و الكود التالي يوضح شكل هذا الكلاس و لقد كتبته علي هيئة Structure
والأمر متروك للقاري لكي يطور الكلاس و يضيف له بعض السمات الإضافية طبقا لرؤية القارئ
الكود التالي يوضح كيف تستخدم الكلاس كبديلا عن الأمثلة التي كتبنا أكوادها أعلاه
لمزيد من التفاصيل يمكن للقارئ الإطلاع علي الروابط الروابط التالية
Control.FromHandle
Screen.FromHandle
NativeWindow.FromHandle
IntPtr Structure
هناك مجموعة من الدوال من النوع Shared و التي تم توزيعها علي بعض الكلاسات في الدوت نت وجميع هذه الدوال تشترك في شئ واحد ألا وهو إن مررت لها IntPtr أو Handle الخاص بالفورم او بالكونترول بشكل صحيح هنا سوف تحصل علي بعض المعلومات الهامة التي يمكن الاستفادة منها بأشكال عديدة.
وهذه الدوال كالتالي:
1- Control.FromHandle
و هي دالة حين تمرر لها IntPtr أو Handle الخاص بأي كونترول هنا سوف تحصل علي الكونترول الذي يمتلك هذا IntPtr او Handle
2- Screen.FromHandle
وهي دالة حين تمرر لها IntPtr أو Handle الخاص بأي كونترول هنا سوف تحصل علي Screen التي يوجد بها هذا الكونترول
3- NativeWindow.FromHandle
وهي أيضا دالة حين تمرر لها IntPtr أو Handle الخاص بأي كونترول هنا سوف تحصل علي NativeWindow المتصلة بهذا الكونترول
بشكل عام جميع هذه الدوال موجودة في فضاء الاسماء System.Windows.Forms
ولكنها موزعة علي ثلاثة كلاسات هي الكلاس Control و الكلاس Screen و الكلاس NativeWindow
للأسف موقع مايكروسوفت لم يعطي أمثلة توضح كيفية استخدام الدوال أعلاه
لذلك المثال التالي سيوضح كيفية التعامل مع هذه الدوال
وهنا انا استخدم Handle الخاص بالفورم مع جميع الأكواد أدناه
ولتحاول عزيزي القارئ أن تضع باتون علي الفورم و تستخدم Handle الخاص بهذا الباتون بدلا من الفورم و لتري ماذا سيحدث معك
1- الكود التالي يوضح كيفية الحصول علي أي كونترول من Handle الخاص به
يمكن كتابة الكود بالشكل التالي:
PHP كود :
Dim hwnd As IntPtr = Me.Handle
Dim f As Form = TryCast(Control.FromHandle(hwnd), Form)
PHP كود :
Dim hwnd As IntPtr = Me.Handle
Dim scr As Screen = TryCast(Screen.FromHandle(hwnd), Screen)
PHP كود :
Dim hwnd As IntPtr = Me.Handle
Dim f As Form = TryCast(Control.FromHandle(hwnd), Form)
فقط تأكد ان تمرر Index الخاص بالفورم بشكل صحيح
PHP كود :
Dim hwnd As IntPtr = Me.Handle
Dim anyOpenform As Form = TryCast(Control.FromHandle(Application.OpenForms(0).Handle), Form)
أعتقد أنه و بعد الحصول علي Form او الكونترول أو Screen او NativeWindow بهذا الاسلوب سيكون الأمر يسيرا علي القارئ لكي يتعامل مع هذه المتغيرات كما يحلو له وذلك بهدف الحصول علي معلومات اضافية من كل متغير
قد يتساءل البعض و ما الفائدة من كل هذا الكود و الاجابة علي هذا التساؤل هي أننا نبني مكتبة بسيطة للتعامل مع الفورم و الكونترول و شاشة الكمبيوتر و بالتالي سوف نحتاج الي تلك المعلومات لكي نستفيد منها لاحقا
و لأننا نبني مكتبة لذلك من الأفضل كتابة كلاس بسيط بحيث حين نمرر له IntPtr أو Handle نستطيع أن نحصل علي المعلومات التي نحتاجها
و الكود التالي يوضح شكل هذا الكلاس و لقد كتبته علي هيئة Structure
والأمر متروك للقاري لكي يطور الكلاس و يضيف له بعض السمات الإضافية طبقا لرؤية القارئ
PHP كود :
Public Structure WindowPointer
Private _handle As IntPtr
Public Sub New(handle As IntPtr)
_handle = handle
End Sub
Public ReadOnly Property Handle As IntPtr
Get
Return _handle
End Get
End Property
Public Function FindWindow() As System.Windows.Forms.Form
If _handle <> IntPtr.Zero Then
Return FindWindow(_handle)
End If
Return Nothing
End Function
Public Function FindScreen() As System.Windows.Forms.Screen
If _handle <> IntPtr.Zero Then
Return FindScreen(_handle)
End If
Return Nothing
End Function
Private Function FindWindow(hwnd As IntPtr) As System.Windows.Forms.Form
Return (Function()
Return TryCast(System.Windows.Forms.Control.FromHandle(hwnd), System.Windows.Forms.Form)
End Function)()
End Function
Private Function FindScreen(hwnd As IntPtr) As System.Windows.Forms.Screen
Return TryCast(System.Windows.Forms.Screen.FromHandle(hwnd), System.Windows.Forms.Screen)
End Function
End Structure
الكود التالي يوضح كيف تستخدم الكلاس كبديلا عن الأمثلة التي كتبنا أكوادها أعلاه
PHP كود :
Dim hwnd As IntPtr = Me.Handle
Dim wp As WindowPointer = New WindowPointer(hwnd)
Dim scr As Screen = wp.FindScreen()
Dim f As Form = wp.FindWindow()
Me.Text = f.Name + " -" + "Test"
Dim screenBounds As Rectangle = scr.Bounds
Dim scrWorkingAre As Rectangle = scr.WorkingArea
لمزيد من التفاصيل يمكن للقارئ الإطلاع علي الروابط الروابط التالية
Control.FromHandle
Screen.FromHandle
NativeWindow.FromHandle
IntPtr Structure

