تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
مـقـال - ما هو أصل الكلمتان e.DrawFocusRectangle و e.DrawBackground
#1
كاتب الموضوع : silverlight

الموضوع: ما هو أصل الكلمتان e.DrawFocusRectangle و e.DrawBackground
اللغة المستخدمة: الفيجوال بيسك
التطبيق: فيجوال استوديو 2008 [VS 9.0]
الدوت نت: .Net Framework 3.5
المستوي: ليس للمبتدئين


المقـدمـة:

من يهتمون غالبا بتطوير الكونترول وإعادة رسمه مرة ثانية ولكن بشكل مختلف ولو قليلا عن الموجود في الدوت نت العادي يفهمون جيدا ماهية مسميات مثل

e.DrawBackground
e.DrawFocusRectangle

لأنهم و في الغالب ما يستخدمونها في أحداث Events مثل الحدث DrawItem Event

و الهدف هنا من هذا المقال هو توضيح أصل كل من الكلمتان DrawFocusRectangle و DrawBackground أو توضيح ماهية هاتان الكلمتان وبالتالي نستطيع التعديل علي أحدهما أو علي كليهما لتتناسبا مع ما نريده بشكل عام

نبذة عن أصل كلمة DrawFocusRectangle و DrawBackground

هناك بعض الكونترول Controls أو الكلاس Class الموجودة في الدوت نت تدعم خاصية Owner Draw وعلي سيبل المثال لا الحصر هذه الكونترول هي

ListBox Control
ComboBox Control
TabControl Control

غالبا جميع الكونترول التي تدعم خاصية Owner Draw لن تجد بها الحدث Paint Event لأن مايكروسوفت قامت بإخفاء هذا الحدث وستجد بدلا من الحدث Paint Event أحداثا Events أخري مثل الحدث DrawItem Event أو الحدث DrawSubItem Event و لكي نتفهم جيدا أصل معني الكلمتان DrawFocusRectangle و DrawBackground يجب علينا أن ندرس مكونات الكلاس الذي يحتوي علي هاتان الكلمتان وهذا الكلاس هو DrawItemEventArgs Class وبدون الدخول في تفاصيل كثيرة عن كيفية إعادة بناء DrawItemEventArgs أو بناء EventArgsHandler أو Delegates لأن هذا ليس موضوع النقاش لكن و بشكل عام يجب علينا علي الأقل أن نتعرف علي العناصر الموجودة في الكلاس DrawItemEventArgs Class

الكود التالي يوضح جزء من الكلاس DrawItemEventArgs ومكوناته بلغة الفيجوال بيسك وفي المرفقات ستجدون نسخة كاملة من الكلاس بالإضافة إلي الكلاس DrawItemEventHandler



كود :
Public Class DrawItemEventArgs

Inherits EventArgs

' ...........rest of code goes here

#Region " Method "

Public Sub DrawBackground()
' What MicoroSoft did here
' ماذا فعلت مايكروسوفت هنا بالتحديد
End Sub

Public Sub DrawFocusRectangle()
' What MicoroSoft did here
' ماذا فعلت مايكروسوفت هنا بالتحديد
End Sub

#End Region

End Class ' DrawItemEventArgs Class

ماذا فعلت مايكروسوفت لتنفيذ الأمران DrawFocusRectangle و DrawBackground

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

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

في واقع الأمر لو سألتموني أبن تضع مايكروسوفت الكود الخاص برسم DrawFocusRectangle أو الكود الخاص برسم DrawBackground فلن أستطيع أن أجيب علي هذا السؤال تحديدا فهي ربما وضعتهما في أحد الأماكن التالية وهنا أنا أجزم فقط لا غير: -
  • الكلاس الخاص بالكونترول
  • الكلاس EventArgs Class
  • كلاس عام تستخدمه مع جميع الكلاسات التي تحتاج الي مثل هذه الأمور. وأعتقد أن هذا هو الجواب الصحيح علي السؤال الذي طرحناه

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

الإجراءان DrawFocusRectangle Method و DrawBackground

الكود التالي يوضح الكود الخاص بكلاس أخر أطلقت عليه Graphics Utility Class حيث فيه وضعت الأوامر الخاصة برسم DrawFocusRectangle وأيضا الأوامر الخاصة برسم DrawBackground والكود التالي يوضح شكل الكلاس وفي المرفقات ستجدون نسخة كاملة من الكلاس وأعتقد أن الكود واضح ولا يحتاج الي أي تفاصيل أو شرح إضافي وخاصة لمن يتعامل مع GDI


كود :
Public NotInheritable Class GraphicsUtility

Public Shared Sub DrawFocusRectangle(ByVal e As DrawItemEventArgs)

If e.State = DrawItemState.Focus Then

DrawFocusRectangle(e.Graphics, e.Bounds, e.ForeColor, e.BackColor)

End If

End Sub

Public Shared Sub DrawBackground(ByVal e As DrawItemEventArgs)

If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then
Using sb As New SolidBrush(e.BackColor)

e.Graphics.FillRectangle(sb, e.Bounds)

End Using

End If

End Sub

Friend Shared Sub DrawFocusRectangle(ByVal g As Graphics, _
ByVal rect As Rectangle, _
ByVal foreColor As Color, _
ByVal backColor As Color)


If backColor.GetBrightness() >= 0.5 Then

foreColor = Color.Transparent
backColor = Color.FromArgb(255, backColor)

Else
backColor = Color.FromArgb(Math.Abs(backColor.R - 255), Math.Abs(backColor.G - 255), Math.Abs(backColor.B - 255))
foreColor = Color.FromArgb(255, backColor)
End If

Dim brush As Drawing2D.HatchBrush = New Drawing2D.HatchBrush(Drawing2D.HatchStyle.Percent50, backColor, foreColor)
Dim pen As Pen = New Pen(brush, 1)

rect.Width -= 1
rect.Height -= 1

g.DrawRectangle(pen, rect)
pen.Dispose()
brush.Dispose()

End Sub

End Class

تمرير الإجراءان DrawFocusRectangle Method و DrawBackground


الأن لنمرر الأوامر الخاصة برسم كل من DrawFocusRectangle و DrawBackground الموجودة في الكلاس GraphicsUtility الي الكلاس DrawItemEventArgs Class فنحصل علي الشكل التالي من الكود



كود :
Public Class DrawItemEventArgs

Inherits EventArgs
' ...........rest of code goes here

#Region " Method "

Public Sub DrawBackground()
GraphicsUtility.DrawBackground(Me)
End Sub

Public Sub DrawFocusRectangle()
GraphicsUtility.DrawFocusRectangle(Me)
End Sub

#End Region

End Class ' DrawItemEventArgs Class

و بعد الانتهاء من الكود أعلاه نكون قد انتهينا من توضيح فكرة المقال و أتمني أن يكون الموضوع قد أصبح واضحا للمهتمين بمثل هذه الأمور وبالطبع أنتم لستم في حاجة لبناء الكلاس DrawItemEventArgs Class بل يمكنكم استخدام الفكرة الموجودة في الكلاس GraphicsUtility والخاصة برسم كل من DrawFocusRectangle و DrawBackground من خلال الكلاس الذي تبنونه باستخدام الوراثة مع أي من الكلاسات التي تدعم خاصية Owner Draw


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


مع تحياتي
أخوكم عمر


الملفات المرفقة
.rar   DrawFocusRectangle_src.rar (الحجم : 20.62 ك ب / التحميلات : 24)
}}}}
تم الشكر بواسطة:


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


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