كيفية إنشاء قائمة مخصصة في Visual Basic.NET أو في Visual Basic 2005

ملخص

التعرف على كيفية إنشاء قائمة مخصصة في Microsoft Visual Basic.NET أو Microsoft Visual Basic 2005 من خلال المناقشات وأمثلة التعليمات البرمجية.

مقدمة

توضح هذه المقالة كيفية إنشاء قائمة مخصصة في Microsoft Visual Basic.NET أو في Microsoft Visual Basic 2005. يمكنك إنشاء قائمة مخصصة يرث عنصر التحكم MainMenu وعن طريق إضافة خصائص لعناصر التحكم MainMenu .

العودة إلى أعلى

توسيع الفئة MenuItem

لا توفر الفئة MenuItem على طريقة مضمنة لعرض رمز. على سبيل المثال، لا توجد أية خاصية رمز التي يمكنك تعيينها لعرض رمز. عندما لا توفر Microsoft.NET Framework فئة ميزة التي تريدها، يمكنك توسيع هذه الفئة، ويمكنك توفير ميزة نفسك.

يمكنك توسيع
فئة MenuItem حيث أنه يمكنك إنشاء عنصر قائمة رسم المالك. عنصر قائمة رسم المالك يعني أن المطور مسؤولة عن رسم الفئة MenuItem على الشاشة.

لتوسيع
النموذج MenuItem صنف، استخدم بناء الجملة وراثة الفئة التالية.
Public Class MyIconMenu    Inherits MenuItem
End Class
العودة إلى أعلى

قم بتعريف كائن خط وكائن رمز فئة MenuItem

عندما ترث فئة MenuItem ترث به خصائص وأساليب وأحداث. يمكنك إنشاء الرمز الخاص بك للفئة المخصصة بتجاوز سلوك اثنين من الأساليب التي يمكنك ترث. تجاوز سلوك الأسلوب OnMeasureItem وأسلوب أوندراويتيم . يجب أيضا تعريف الحقول الخاصة داخل الفئة المخصصة لاحتواء كائن الخط وكائن رمز . تحتاج كائن الخط حيث تحتوي الفئة المخصصة النص بالإضافة إلى رموز.

إذا كنت تحتاج إلى طريقة للمطورين الذين يستخدمون الفئة المخصصة لتهيئة الحقول الخاصة بك، استخدم الدالة الإنشائية للفئة المخصصة الخاصة بك. منشئ Visual Basic.NET 2003 هو أسلوب خاص يسمى جديد. يتم استدعاء الأسلوب جديد بواسطة.NET Framework عندما يتم إنشاء مثيل الفئة المخصصة. باستخدام Visual Basic.NET 2003، يمكنك تمرير المعلمات إلى الدالة الإنشائية الخاصة بك.

كما يدعم Visual Basic.NET 2003 التحميل الزائد للأسلوب. يمكنك تعريف الأسلوب نفسه عدة مرات، مادامت التواقيع أسلوب فريد.

باستخدام المنشئات والتحميل الزائد للأسلوب، يمكنك السماح للمطورين تهيئة الحقول الخاصة من الفئة المخصصة الخاصة بك. قد تبدو مشابهة لمثال التعليمات البرمجية التالي التعليمات البرمجية للفئة المخصصة الخاصة بك.
Public Class MyIconMenu Inherits MenuItem       Private font As Font
Private icon As Icon

Sub New(ByVal menuText As String)
MyClass.New(menuText, Nothing, Shortcut.None, Nothing)
End Sub

Sub New(ByVal menuText As String, ByVal handler As EventHandler, ByVal shortcut As Shortcut, ByVal ico As icon)
MyBase.New(menuText, handler, shortcut)
Me.icon = ico
Me.font = New Font("Arial", 8)
Me.OwnerDraw = True
End Sub
End Class
لاحظ أن استخدمت أسلوب التحميل الزائد على المنشئ الخاص بك حيث يكون المطور خيار وجود عنصر قائمة برمز أو عنصر قائمة دون رمز. يجب أيضا تعيين الخاصية OwnerDraw الفئة المخصصة إلى القيمة true إذا أردت عرض رمز. تعد هذه الخطوة مهمة لأنه إذا لم يتم إكمال هذه الخطوة، يتم عرض أية رموز في القائمة الخاصة بك.

العودة إلى أعلى

إضافة عناصر إلى القائمة الخاصة بك

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

قد تحتاج إلى تحديد ارتفاع عنصر القائمة استناداً إلى ارتفاع الرمز. هذا قد يكون أو قد لا يكون مناسباً دائماً. بشكل عام، يجب إلا يتجاوز طول النص لعنصر القائمة ارتفاع الرمز.

لتحديد عرض القائمة الخاصة بك، يجب عليك معرفة عرض السلسلة التي يتم عرضها في عنصر القائمة. يمكنك استخدام كائن StringFormat لاسترداد هذه المعلومات. يمكن العثور على هذا الكائن في مساحة الاسم System.Drawing . عندما تقوم بقياس عرض عنصر القائمة، يجب أيضا الاهتمام بالرمز.

قد تكون مشابهة لمثال التعليمات البرمجية التالي التعليمات البرمجية للأسلوب OnMeasureItem الخاص بك.
Protected Overrides Sub OnMeasureItem(ByVal e As MeasureItemEventArgs)        MyBase.OnMeasureItem(e)
Dim sf As StringFormat = New StringFormat()

sf.HotkeyPrefix = HotkeyPrefix.Show
sf.SetTabStops(50, New Single() {0})

e.ItemHeight = Me.icon.Height + 6
e.ItemWidth = CInt(e.Graphics.MeasureString(AppendShortcut(), _
Me.font, 1000, sf).Width) + Me.icon.Width + 5
sf.Dispose()
sf = Nothing
End Sub

العودة إلى أعلى

رسم القائمة الخاصة بك

بعد تحديد حجم القائمة الخاصة بك، يجب رسم القائمة الخاصة بك باستخدام أسلوب أوندراويتيم للفئة المخصصة الخاصة بك. يتم تمرير هذه الطريقة الكائن دراويتيميفينتارجس . يمكنك استخدام كائن دراويتيميفينتارجس للحصول على كائن رسومي لعنصر القائمة. يتيح هذا إمكانية رسم مباشرة على سطح القائمة الخاصة بك عن طريق استخدام GDI + ميزات قوية المتوفرة في.NET Framework. أولاً، رسم خلفية ملونة. ثم ارسم الرمز. أخيرا، رسم النص القائمة العنصر.

قد تكون مشابهة لمثال التعليمات البرمجية التالي التعليمات البرمجية للقائمة الخاصة بك.
Protected Overrides Sub OnDrawItem(ByVal e As DrawItemEventArgs)   Dim br As Brush
Dim sf As StringFormat

MyBase.OnDrawItem(e)
e.Graphics.FillRectangle(SystemBrushes.Control, e.Bounds)
If Not (Me.icon Is Nothing) Then
e.Graphics.DrawIcon(Me.icon, e.Bounds.Left + 3, e.Bounds.Top + 3)
End If

sf = New StringFormat()
sf.HotkeyPrefix = HotkeyPrefix.Show
sf.SetTabStops(50, New Single() {0})
br = New SolidBrush(SystemColors.WindowText)
e.Graphics.DrawString(AppendShortcut(), Me.font, br, e.Bounds.Left + _
Me.icon.Width + 10, e.Bounds.Top + 2, sf)
'Clean up resources.
br.Dispose()
br = Nothing
sf.Dispose()
sf = Nothing
End Sub

العودة إلى أعلى

إنشاء اختصار لوحة مفاتيح لعنصر القائمة

يتم استدعاء الدالة أبيندشورتكوت في أمثلة التعليمات البرمجية في الأسلوب OnMeasureItem وأسلوب أوندراويتيم . ويمكن قياس ورسم السلسلة استناداً إلى خاصية النص لعنصر القائمة. ومع ذلك، هذا لا يعتبر حقيقة قد يكون عنصر قائمة اختصار لوحة مفاتيح. إذا لم يكن عنصر القائمة اختصار لوحة مفاتيح، يجب عرض مفاتيح الاختصار وقم بزيادة عرض عنصر القائمة. يجب أن يمثل مفتاح الاختصار كسلسلة. يمثل مفتاح الاختصار كسلسلة الدالة أبيندشورتكوت وتلحق السلسلة اختصار النص عنصر القائمة الحالي.

قد تكون مشابهة لمثال التعليمات البرمجية التالي التعليمات البرمجية للدالة أبيندشورتكوت .
Private Function AppendShortcut() As String   Dim s As String
s = Me.Text
' Check to see if we have a shortcut.
' If so, append it to our existing text.
If Me.ShowShortcut And Me.Shortcut <> Shortcut.None Then
Dim k As Keys = CType(Shortcut, Keys)
s = s & Convert.ToChar(9) & _
TypeDescriptor.GetConverter(GetType(Keys)).ConvertToString(k)
End If
Return s
End Function

العودة إلى أعلى

تمييز عنصر القائمة

بعد إنشاء عنصر قائمة رمز أساسي، يمكنك تمييز عنصر القائمة كما كان محدداً. يجب رسم حدود وتمييز النص في أسلوب أوندراويتيم .

العودة إلى أعلى

مثال التعليمات البرمجية

مثال التعليمات البرمجية التالي هو المثال الكامل للفئة المخصصة الخاصة بك. مثال التعليمات البرمجية هذا يتضمن تعليمات برمجية لتمييز عنصر القائمة.
' Form1.vbPublic Class Form1
Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

Public Sub New()

MyBase.New()

'This call is required by the Windows Form Designer.

InitializeComponent()

'Add any initialization after the InitializeComponent() call.

End Sub



'Form overrides dispose to clean up the component list.

Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

If disposing Then

If Not (components Is Nothing) Then

components.Dispose()

End If

End If

MyBase.Dispose(disposing)

End Sub



'Required by the Windows Form Designer.

Private components As System.ComponentModel.IContainer



'Note The following procedure is required by the Windows Form Designer.

'It can be modified by using the Windows Form Designer.

'Do not modify it by using the code editor.

Friend WithEvents MainMenu1 As System.Windows.Forms.MainMenu

Friend WithEvents MenuItem1 As System.Windows.Forms.MenuItem

<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

Me.MainMenu1 = New System.Windows.Forms.MainMenu

Me.MenuItem1 = New System.Windows.Forms.MenuItem



Me.MainMenu1.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.MenuItem1})

Me.MenuItem1.Index = 0

Me.MenuItem1.Text = ""



Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)

Me.ClientSize = New System.Drawing.Size(292, 273)

Me.Menu = Me.MainMenu1

Me.Name = "Form1"

Me.Text = "Form1"



End Sub



#End Region



Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'Loading the MyIconMenu onto the first menu in MainMenu1.

Dim ico As Icon = New Icon("c:\GSA.ico")

Dim fm As MyIconMenu = New MyIconMenu("Testing", Nothing, Shortcut.None, ico)

MainMenu1.MenuItems(0).MenuItems.Add(fm)

End Sub



End Class




' MyIconMenu.vb

Imports System

Imports System.ComponentModel

Imports System.Drawing

Imports System.Drawing.Drawing2D

Imports System.Drawing.Text

Imports System.Windows.Forms



Public Class MyIconMenu

Inherits MenuItem



Private font As font

Private icon As icon



'Set properties for border highlighting.

Private borderWidth As Integer = 1

Private borderColor As Color = Color.DarkBlue





Sub New(ByVal menuText As String, ByVal handler As EventHandler, _

ByVal shortcut As Shortcut, ByVal ico As icon)



MyBase.New(menuText, handler, shortcut)

Me.icon = ico

Me.font = New Font("Arial", 8)

Me.OwnerDraw = True



End Sub



Public Overloads Sub Dispose()



Me.font.Dispose()

Me.font = Nothing

Me.icon.Dispose()

Me.icon = Nothing

MyBase.Dispose()



End Sub



Protected Overrides Sub OnMeasureItem(ByVal e As MeasureItemEventArgs)



MyBase.OnMeasureItem(e)

Dim sf As StringFormat = New StringFormat



sf.HotkeyPrefix = HotkeyPrefix.Show

sf.SetTabStops(50, New Single() {0})



e.ItemHeight = Me.icon.Height + 6

e.ItemWidth = CInt(e.Graphics.MeasureString(AppendShortcut(), _

Me.font, 1000, sf).Width) + Me.icon.Width + 5



sf.Dispose()

sf = Nothing



End Sub



Protected Overrides Sub OnDrawItem(ByVal e As DrawItemEventArgs)



Dim br As Brush

Dim sf As StringFormat



MyBase.OnDrawItem(e)



If CBool(e.State And DrawItemState.Selected) Then

'Draw a border to highlight the menu.

e.Graphics.FillRectangle(SystemBrushes.HighlightText, _

e.Bounds)



ControlPaint.DrawBorder(e.Graphics, e.Bounds, _

Me.borderColor, Me.borderWidth, _

ButtonBorderStyle.Solid, _

Me.borderColor, Me.borderWidth, _

ButtonBorderStyle.Solid, _

Me.borderColor, Me.borderWidth, _

ButtonBorderStyle.Solid, _

Me.borderColor, Me.borderWidth, _

ButtonBorderStyle.Solid)



Else

e.Graphics.FillRectangle(SystemBrushes.Control, e.Bounds)

End If



If Not (Me.icon Is Nothing) Then

e.Graphics.DrawIcon(Me.icon, e.Bounds.Left + 3, _

e.Bounds.Top + 3)

End If



sf = New StringFormat

sf.HotkeyPrefix = HotkeyPrefix.Show

sf.SetTabStops(50, New Single() {0})

br = New SolidBrush(SystemColors.WindowText)

e.Graphics.DrawString(AppendShortcut(), Me.font, br, _

e.Bounds.Left + Me.icon.Width + 10, _

e.Bounds.Top + 2, sf)



'Clean up resources.

br.Dispose()

br = Nothing

sf.Dispose()

sf = Nothing



End Sub



Private Function AppendShortcut() As String



Dim s As String

s = Me.Text



' Check to see if we have a shortcut.

' If so, append it to our existing text.

If Me.ShowShortcut And Me.Shortcut <> Shortcut.None Then

' Use TypeDescriptor to get a string representation of a

' Shortcut class.

Dim k As Keys = CType(Shortcut, Keys)



s = s & Convert.ToChar(9) & _

TypeDescriptor.GetConverter(GetType(Keys)).ConvertToString(k)

End If

Return s

End Function



End Class

ملاحظة: يجب تغيير التعليمات البرمجية في Visual Basic 2005. بشكل افتراضي، Visual Basic إنشاء ملفين للمشروع عند إنشاء مشروع Windows Forms. إذا تم تسمية النموذج Form1، الملفين تمثل النموذج تسمية Form1.vb و Form1.Designer.vb. كتابة التعليمات البرمجية في الملف Form1.vb. مصمم نماذج Windows بكتابة التعليمات البرمجية في ملف Form1.Designer.vb. مصمم نماذج Windows يستخدم الكلمة الأساسية الجزئية لتقسيم تطبيق Form1 إلى ملفين مستقلين. يمنع هذا السلوك التعليمة البرمجية التي تم إنشاؤها من قبل مصمم يتم interspersed مع التعليمات البرمجية الخاصة بك.

لمزيد من المعلومات حول التحسينات لغة Visual Basic 2005 جديد، قم بزيارة موقع شبكة مطوري Microsoft (MSDN) التالي على الويب:

لمزيد من المعلومات حول فئات جزئية ومصمم نماذج Windows، قم بزيارة موقع Msdn التالي:

العودة إلى أعلى
خصائص

رقم الموضوع: 888168 - آخر مراجعة: 15‏/01‏/2017 - المراجعة: 1

تعليقات