03-10-12, 09:10 AM
كيف نقوم بإضافة تعديلات الي Custom Designer
لكي نقوم بذلك نحتاج أن نتحدث قليلا عن ParentControlDesigner
إن الحديث عن ParentControlDesigner Class سوف يغطي بالتبعية الحديث عن ControlDesigner Class ولقد أوضحنا الفرق بينهم وأنهم لا يختلفان علي الإطلاق إلا في أشياء قليله وعموما ParentControlDesigner Class له صفات Properties و طرق Methods أكثر من ControlDesigner Class لذلك سيكون هو هدفنا هنا في هذا الجزء من تطوير الكونترول.
ملحوظه هامه هناك بعض الصفات التي تخص ParentControlDesigner لا نحتاج الي التغيير في قيمها ألأوليه لان الأمر حينئذ سيكون عبارة عن مضيعة للوقت لكن بما أن الهدف هنا هو توضيح وشرح ParentControlDesigner فلسوف أحاول أن إعطاء فكره عن معظم الصفات التي تخص ParentControlDesigner والتي تهمنا في تصميم Custom Control
AllowControlLasso Property
هذه الصفة لها قيمه عبارة عن Boolean أي True أو False وهي خاصية يتم استدعاؤها بعد أن نضيف عنصر ما من Toolbox وتقوم برسم ReversibleRectangle ومن الأفضل عدم التعديل فيها واستخدام قيمتها الافتراضية لكن لو أراد القارئ أن يقوم بتعديلها فكل ما عليه أن يري الكود المرفق. وأيضا لمزيد من المعلومات عن ReversibleRectangle يمكنك أن تراجع كلاس مهم جدا وهو ControlPaint Class وهناك مقال قمت بنشره بالموقع تحت عنوان الكلاس التائه عن هذا الموضوع يمكن أن ترجع إليه إن أردت
AllowGenericDragBox Property
هذه الصفة لها قيمه عبارة عن Boolean أي True أو False وهي تحدد هل يتم رسم Drag Box عندما نحاول أن نقوم بعمل Dragging لآي عنصر من Toolbox والقيمة الافتراضية لها True ومن الأفضل عدم التعديل بها لكن لو أراد القارئ أن يقوم بتعديلها فكل ما عليه أن يري الكود المرفق.
ِAllowSetChildIndexOnDrop Property
هذه الصفة الغرض منها هو الحفاظ علي z-Oorder لكل الكونترول التي يتم سحبها وإضافتها Toolbox و z-Order عبارة عن visual layering للكونترول Control التي تضاف الي Custom Control وقيمة هذه الصفة عبارة عن Boolean أي True أو False وعموما القيم الافتراضية لها عبارة عن True ومن الأفضل عدم التعديل فيها واستخدام قيمتها الافتراضية لكن لو أراد القارئ أن يقوم بتعديلها أن يري الكود المرفق.
DrawGrid Property
واضح جدا أن هذه الصفة تسمح برسم Grid داخل Custom Control وهي عبارة عن Boolean أي True أو False والقيمة الافتراضية لها False ولو أردت أن تظهر Grid انظر الي الكود المرفق.
DefaultControlLocation Property
هذه الصفة الهدف منها شئ هام جدا فهي المسئولة عن تحديد النقطة Point الافتراضية أو الأولية أو مكان ChildControl داخل الكونترول أي عندما نقوم بعمل Double-Click لكي نضيف أي كونترول من Toolbox الي داخل الكونترول الخاص بنا.
مثال علي ذلك عندما تقوم باستخدام الماوس والضغط علي أي كونترول عن طريق Double-Click وإضافة Button مثلا من Toolbox الي أي كونترول أو حتى الي الفورم سنجد أن المكان سيقع داخل الفورم في منطقه معينه وهذه الصفة التي نتحدث عنها هي المسئولة عن ذلك.
إذن لكي نحدد المكان الذي سيقع فيه أي كونترول داخل الكونترول الذي نصممه علينا أن نقوم بعمل Overrides لهذه الخاصية و مثال غلي ذلك انظر الي الكود المرفق.
GridSize Property
من الواضح الهدف من الصفة فهي تحدد مقاس Grid وهي مرتبطة بالصفة DrawGrid واقل قيمه افتراضية 2 واكبر قيمة افتراضية 200 لكن لو أراد القارئ أن يقوم بتعديلها فكل ما عليه أن يري الكود المرفق.
MouseDragTool Property
هذه الصفة تستخدم لإضافة ToolBoxItem أثناء عملية السحب والإفلات الي Designer وهي مرتبطة بكلاس أخر وهوToolBoxItem Class وهذا الكلاس مرتبط نشئ أخر مهم و هو System.Drawing.Design Namespace. الكود المرفق.يوضح كيفية استخدام هذه الصفة
الأن نقوم بعمل Build للكونترول وسوف نراه موجودا داخل Toolbox لنقوم بإضافته الي الفورم باستخدام Double Click نقوم بإضافة Button إلي الكونترول سنلاحظ أن مقاس الكونترول Size صغير إذن نحن نحتاج الي تحديد Size جديد وأيضا لو وقفنا بالماوس علي الباتون الذي أضفناه الي الكونترول ونظرنا الي صفاته المختلفة داخل Properties Window سنجد أن Button.Location أصبح (20, 20).
هناك ملحوظه هامه جدا ذكرتها مايكروسوفت بخصوص التعديل في Size Property وهي للحصول علي أداء أفضل للكونترول يجب أن نقوم بتعديل خاصية Size عن طريق عمل Overrides لخاصية DefaultSize Property وليس عن طريق Constructor أي (Public Sub New)
لنتوقف هنا قليلا لنستعرض الكود الي يغطي كيفية استخدام هذه الصفات السابقة
لكي نقوم بذلك نحتاج أن نتحدث قليلا عن ParentControlDesigner
إن الحديث عن ParentControlDesigner Class سوف يغطي بالتبعية الحديث عن ControlDesigner Class ولقد أوضحنا الفرق بينهم وأنهم لا يختلفان علي الإطلاق إلا في أشياء قليله وعموما ParentControlDesigner Class له صفات Properties و طرق Methods أكثر من ControlDesigner Class لذلك سيكون هو هدفنا هنا في هذا الجزء من تطوير الكونترول.
ملحوظه هامه هناك بعض الصفات التي تخص ParentControlDesigner لا نحتاج الي التغيير في قيمها ألأوليه لان الأمر حينئذ سيكون عبارة عن مضيعة للوقت لكن بما أن الهدف هنا هو توضيح وشرح ParentControlDesigner فلسوف أحاول أن إعطاء فكره عن معظم الصفات التي تخص ParentControlDesigner والتي تهمنا في تصميم Custom Control
AllowControlLasso Property
هذه الصفة لها قيمه عبارة عن Boolean أي True أو False وهي خاصية يتم استدعاؤها بعد أن نضيف عنصر ما من Toolbox وتقوم برسم ReversibleRectangle ومن الأفضل عدم التعديل فيها واستخدام قيمتها الافتراضية لكن لو أراد القارئ أن يقوم بتعديلها فكل ما عليه أن يري الكود المرفق. وأيضا لمزيد من المعلومات عن ReversibleRectangle يمكنك أن تراجع كلاس مهم جدا وهو ControlPaint Class وهناك مقال قمت بنشره بالموقع تحت عنوان الكلاس التائه عن هذا الموضوع يمكن أن ترجع إليه إن أردت
AllowGenericDragBox Property
هذه الصفة لها قيمه عبارة عن Boolean أي True أو False وهي تحدد هل يتم رسم Drag Box عندما نحاول أن نقوم بعمل Dragging لآي عنصر من Toolbox والقيمة الافتراضية لها True ومن الأفضل عدم التعديل بها لكن لو أراد القارئ أن يقوم بتعديلها فكل ما عليه أن يري الكود المرفق.
ِAllowSetChildIndexOnDrop Property
هذه الصفة الغرض منها هو الحفاظ علي z-Oorder لكل الكونترول التي يتم سحبها وإضافتها Toolbox و z-Order عبارة عن visual layering للكونترول Control التي تضاف الي Custom Control وقيمة هذه الصفة عبارة عن Boolean أي True أو False وعموما القيم الافتراضية لها عبارة عن True ومن الأفضل عدم التعديل فيها واستخدام قيمتها الافتراضية لكن لو أراد القارئ أن يقوم بتعديلها أن يري الكود المرفق.
DrawGrid Property
واضح جدا أن هذه الصفة تسمح برسم Grid داخل Custom Control وهي عبارة عن Boolean أي True أو False والقيمة الافتراضية لها False ولو أردت أن تظهر Grid انظر الي الكود المرفق.
DefaultControlLocation Property
هذه الصفة الهدف منها شئ هام جدا فهي المسئولة عن تحديد النقطة Point الافتراضية أو الأولية أو مكان ChildControl داخل الكونترول أي عندما نقوم بعمل Double-Click لكي نضيف أي كونترول من Toolbox الي داخل الكونترول الخاص بنا.
مثال علي ذلك عندما تقوم باستخدام الماوس والضغط علي أي كونترول عن طريق Double-Click وإضافة Button مثلا من Toolbox الي أي كونترول أو حتى الي الفورم سنجد أن المكان سيقع داخل الفورم في منطقه معينه وهذه الصفة التي نتحدث عنها هي المسئولة عن ذلك.
إذن لكي نحدد المكان الذي سيقع فيه أي كونترول داخل الكونترول الذي نصممه علينا أن نقوم بعمل Overrides لهذه الخاصية و مثال غلي ذلك انظر الي الكود المرفق.
GridSize Property
من الواضح الهدف من الصفة فهي تحدد مقاس Grid وهي مرتبطة بالصفة DrawGrid واقل قيمه افتراضية 2 واكبر قيمة افتراضية 200 لكن لو أراد القارئ أن يقوم بتعديلها فكل ما عليه أن يري الكود المرفق.
MouseDragTool Property
هذه الصفة تستخدم لإضافة ToolBoxItem أثناء عملية السحب والإفلات الي Designer وهي مرتبطة بكلاس أخر وهوToolBoxItem Class وهذا الكلاس مرتبط نشئ أخر مهم و هو System.Drawing.Design Namespace. الكود المرفق.يوضح كيفية استخدام هذه الصفة
الأن نقوم بعمل Build للكونترول وسوف نراه موجودا داخل Toolbox لنقوم بإضافته الي الفورم باستخدام Double Click نقوم بإضافة Button إلي الكونترول سنلاحظ أن مقاس الكونترول Size صغير إذن نحن نحتاج الي تحديد Size جديد وأيضا لو وقفنا بالماوس علي الباتون الذي أضفناه الي الكونترول ونظرنا الي صفاته المختلفة داخل Properties Window سنجد أن Button.Location أصبح (20, 20).
هناك ملحوظه هامه جدا ذكرتها مايكروسوفت بخصوص التعديل في Size Property وهي للحصول علي أداء أفضل للكونترول يجب أن نقوم بتعديل خاصية Size عن طريق عمل Overrides لخاصية DefaultSize Property وليس عن طريق Constructor أي (Public Sub New)
لنتوقف هنا قليلا لنستعرض الكود الي يغطي كيفية استخدام هذه الصفات السابقة
كود :
Imports System.ComponentModel
Imports System.Windows.Forms.Design
Imports System.Security.Permissions
Imports System.ComponentModel.Design
Imports System.Drawing.Design
<System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _
<Designer(GetType(MyDesigner), GetType(IDesigner))> _
Public Class MyControl
Inherits Control
' Set the Default size of the Control
Protected Overrides ReadOnly Property DefaultSize() As System.Drawing.Size
Get
Return New Size(200, 200)
End Get
End Property
End Class 'MyControl ------------> Custom Control
<System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _
Public Class MyDesigner
Inherits ParentControlDesigner
Protected Overrides ReadOnly Property DefaultControlLocation() As System.Drawing.Point
Get
' any Controlwill be aded at point to be at x = 20 and y = 20
Return New Point(20, 20)
End Get
End Property
Protected Overrides ReadOnly Property AllowControlLasso() As Boolean
Get
Return False
End Get
End Property
Protected Overrides ReadOnly Property AllowGenericDragBox() As Boolean
Get
Return True
End Get
End Property
Private TrueOrFalse As Boolean = True
Protected Overrides Property DrawGrid() As Boolean
Get
Return TrueOrFalse
End Get
Set(ByVal value As Boolean)
TrueOrFalse = value
End Set
End Property
Private ZOrdersTrueOrFalse As Boolean = True
Protected Overrides ReadOnly Property AllowSetChildIndexOnDrop() As Boolean
Get
Return ZOrdersTrueOrFalse
End Get
End Property
Private gsize As Size = New Size(20, 20)
Protected Overloads Property GridSize() As Size
Get
Return gsize
End Get
Set(ByVal value As Size)
gsize = value
End Set
End Property
Private m_Item As ToolBoxItem = Nothing
Protected Overloads ReadOnly Property MouseDragTool() As ToolboxItem
Get
Return m_Item
End Get
End Property
End Class 'MyDesigner ------------> Custom Designer