تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
تطوير الكونترول Rendering Control الجزء الخامس
#2

الأن نقوم بعمل Build وسنجد الكونترول موجود في Toolbox وبعد ذلك نضيفه الي الفورم مثله مثل أي كونترول أخر

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

فقط عزيزي القارئ أريد منك أن تلاحظ كلمة واحدة وهي ScrollBarRenderer هذه الكلمة أو الجزئية من الكود هي ما تعنينا تماما

وهي التي من أجلها سوف نضيف كلاس أخر الي الفورم ولنطلق عليه MyScrollBarRenderer وفي هذه الكلاس سنقوم بالجزء الأكبر من العمل المطلوب لتغيير الشكل الكلاسيكي للكونترول أيضا سوف أضيف الي الفورم Module وليكن اسمه MyModule وهنا سوف نضيف بعض المتغيرات وهي جميعها عبارة عن Colors لكي نستخدمها بشكل عام في المشروع.

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

لو نظرنا الي الكلاس الخاص بشركة مايكروسوفت وهو ScrollBarRenderer سنجد أن عناصره كالأتي
هذا الكلاس يمتلك Property واحدة وهي IsSupported بالإضافة الي مجموعة من الطرقMethods المختلفة ومعظمها يختص برسم الكونترول
إذن كل ما علينا فعله هو إعادة بناء الكود الخاص بهذه الطرق والصفات الموجودة في الكونترول الخاص بشركة مايكروسوفت

الطرق المطلوب إعادة كتابة الكود لها عبارة عن الأتي
DrawArrowButton
DrawHorizontalThumb
DrawHorizontalThumbGrip
DrawLeftHorizontalTrack
DrawLowerVerticalTrack
DrawRightHorizontalTrack
DrawSizeBox
DrawUpperVerticalTrack
DrawVerticalThumb
DrawVerticalThumbGrip
GetSizeBoxSize
GetThumbGripSize

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



كود :
Public Shared Sub DrawArrowButton(ByVal g As Graphics, ByVal bounds As Rectangle, ByVal state As ScrollBarArrowButtonState)

End Sub
لا تتعجل عزيزي القارئ فهذه مجرد البداية فنحن نحتاج الي أن نكتب الكود الخاص بهذا ٍSub
لكن قبل أن نفعل ذّلك للنظر الي طبيعة تكوين هذا Sub وتحديدا لما يوجد بين الأقواس سنجد أن هناك ثلاثة متغيرات وهم علي التوالي

g وهي عبارة عن GDI Graphics

bounds وهي عبارة عن System.Drawing.Rectangle

ScrollBarArrowButtonState وهو عبارة عن Enum وتحديدا هذا المتغير هو ما يجب أن نهتم به لأن من خلاله سوف نحدد طريقة رسم السهم في حالاته المختلفة وهي Disabled State و Hot State و Normal State و Pressed State إذن كل ما علينا عمله هو استخدام Select Case ومن ثم نقوم برسم السهم عن طريق GDI Graphics داخل حدود bounds

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

المثال الموجود بالمرفقات يوضح الكلاس الجديد الذي سوف يستخدم كبديل لما صممته مايكروسوفت وهو ليس كاملا لأنك ستكتشف عزيزي القارئ أن الموضوع محتاج وقت طويل وتنظيم ودقة لكي تستطيع بناء الكلاس كاملا ولو لديك الوقت لذلك فمرحبا بك في زمرة مطوري البرامج
تبقي القليل عزيزي القارئ وننتهي من الأمر و الأن بعد أن قمنا بإعادة بناء الكلاس الذي صممته مايكروسوفت وهو ScrollBarRenderer وأطلقنا عليه اسم جديد وهو MyScrollBarRenderer لم يتبقي إلا أن نقوم باستبدال كل كلمة بمعني ScrollBarRenderer الموجودة داخل الكلاس MyCustomScrollBar بالاسم الجديد الي صممناه وهو MyScrollBarRenderer ثم قم بعمل Build ولسوف تجد الكلاسان MSCustomScrollBar وأيضا MyCustomScrollBar موجودان في Toolbox قم بإضافتهما الي الفورم ولسوف تري الفارق شاسعا بينهما

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

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

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

في هذه الحالة فإن الكونترول الذي صممته سيكون مشوها وبالتالي سيكره المستخدم البرنامج وربما يبحث عن البديل الأفضل لما يريده فهو يتوقع شيئا مثاليا منك كمبرمج فأنت الشخص السوبر الذي عليه أن يفعل المستحيل لإرضاء المستخدم فأنت بالنسبة للمستخدم مثل الساحر هوديني الذي يتعامل مع الخيال والحلم
عموما الحل في كلمة واحدة انك سوف تتعامل مع SystemEvents.UserPreferenceChanged وهذا يعني أنك ستكتب هذا Sub أي أنك سوف تضيف Handler لهذا Sub وهو يضاف الي Control Constructor أي تحت Public Sub New ومن ثم تقوم بعمل Remove لهذا Handler في Control Dispose ويجب إزالة هذا Handler حتى لا يحدث Memory Leak وطبعا سنكتب الكود المناسب تحت هذا Sub لكي نتلافى أخطاء المستخدم طبعا لازم نعمل Imports الي Microsoft.Win32 والكود المفروض إضافته لحل هذه المشكلة سيكون كالأتي


كود :
Imports Microsoft.Win32
‘-------------------------
Public Sub New()
AddHandler SystemEvents.UserPreferenceChanged, AddressOf SystemEvents_UserPreferenceChanged
End Sub

Private Sub SystemEvents_UserPreferenceChanged(ByVal sender As Object, ByVal e As UserPreferenceChangedEventArgs)
If e.Category = UserPreferenceCategory.Window Then
Me.Font = SystemFonts.IconTitleFont
End If
End Sub

Private Sub MsCustomScrollBar_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed

RemoveHandler SystemEvents.UserPreferenceChanged, AddressOf SystemEvents_UserPreferenceChanged

End Sub
سنلاحظ أن الفونت قد تم ربطه الي شئ واحد فقط وهو SystemFonts.IconTitleFont

الخلاصة

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

مرفق الكود بنسخة 2008

http://vb4arb.com/vb/uploaded/18_01349241432.zip

أتمني لكم النجاح والتوفيق

اخوكم عمر
}}}
تم الشكر بواسطة:


الردود في هذا الموضوع
تطوير الكونترول Rendering Control الجزء الخامس - بواسطة Raggi Tech - 03-10-12, 09:18 AM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! أنس محمود 10 8,383 19-07-22, 12:15 AM
آخر رد: StartLight4000
  [كود] Line Control silverlight 1 3,177 29-05-19, 10:30 PM
آخر رد: egbest2
  [سؤال] How to Setting the FileUpload value using VB.net inside of a WebBrowser Control dametucorazon 1 2,360 18-03-19, 08:58 PM
آخر رد: 5000
  حساب قيمة معادلة(اقصد صيغة دون مجاهيل) مكتوبة بالتكست : الجزء الخامس والاخير محمد شريقي 4 4,827 23-02-18, 10:44 PM
آخر رد: العواد الصغير
  تصميم ثيمات للكونترول Control Theme silverlight 4 4,158 23-06-17, 02:34 AM
آخر رد: ابراهيم كركوكي
Rainbow Toolbox in VB.NET - Common Controls - Lesson One - Button Control Properties Genius Live 19 16,131 17-06-17, 01:11 PM
آخر رد: نوره
  مقدمة إلي إخفاء المعلومات - الجزء الأول silverlight 5 4,502 07-01-17, 10:44 PM
آخر رد: Basil Abdallah
  مقدمة إلي إخفاء المعلومات - الجزء الثاني silverlight 1 3,209 06-01-17, 11:52 AM
آخر رد: silverlight
  Control Finder Class silverlight 3 2,964 03-12-16, 06:11 AM
آخر رد: أبو عمر
  Generic Delegates & ًWindows Forms Control - Part 2 silverlight 0 2,732 19-01-16, 02:01 PM
آخر رد: silverlight

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


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