Jak vytvořit vlastní nabídku, Visual Basic .NET nebo Visual Basic 2005

Překlady článku Překlady článku
ID článku: 888168 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Zjistěte, jak vytvořit vlastní nabídku v Microsoft Visual Basic .NET nebo Microsoft Visual Basic 2005 pomocí diskuse i příklady kódu.

Úvod

Tento článek popisuje, jak vytvořit vlastní nabídky v aplikaci Microsoft Visual Basic .NET nebo Microsoft Visual Basic 2005. Vytvořit vlastní nabídku dědění MainMenu řízení a přidání vlastností do položky řízení MainMenu.

Rozšířit třídy MenuItem

Třídy MenuItem neposkytuje předdefinované způsob zobrazení Ikona. Například je vlastnost žádné ikony, které lze nastavit zobrazení Ikona. Při třídy Microsoft .NET Framework neposkytuje funkce, které chcete, můžete rozšířit třídy a můžete poskytnout funkci sami.

Třídy MenuItem můžete rozšířit, takže můžete vytvořit položku nakreslena vlastník nabídky. Položka nakreslena vlastník nabídky znamená, že je Vývojář zodpovědný za výkresu třídy MenuItem na obrazovce.

Rozšířit třídy MenuItem, použijte následující syntaxi dědičnosti třídy.
Public Class MyIconMenu
    Inherits MenuItem
End Class

Deklarovat objekt písma a ikony objektu pro třídu MenuItem

Při dědit ze třídy MenuItem dědí jeho vlastnosti, metody a události. Můžete vytvořit vlastní ikonu pro vlastní třída přepsáním chování dvou metod, které jste dědí. Přepsat chování metody OnMeasureItem a metodu OnDrawItem. Soukromé polí musí také deklarovat v rámci vlastní třídy držet písmo objektu a ikona objektu. Objekt písmo třeba, aby vlastní třídy mohou obsahovat text na ikony.

Pokud vyžadují způsobem pro vývojáře, kteří používají vlastní třída inicializovat soukromé polí použijte konstruktor vlastní třídy. Konstruktor Visual Basic .NET 2003 je zvláštní metoda, která se nazývá Nový. Nová metoda nazývá .NET Framework při vytvoření instance vlastní třídy. Pomocí jazyka .NET 2003 předat parametry vaše konstruktoru.

Visual Basic .NET 2003 podporuje také přetížení metody. Můžete definovat stejnou metodu mnohokrát, jako jsou jedinečné podpisy metodu.

Pomocí konstruktory a metodu přetížení můžete nechat vývojáři inicializovat soukromé polí vlastní třídy. Kód pro vlastní třídy se může podobat následující příklad kódu.
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
Všimněte si, že jste použili metodu přetížení na vaše konstruktor tak, aby vývojář má možnost nutnosti položka nabídky s ikonu nebo položku nabídky bez ikona. Musíte také nastavit vlastnost OwnerDraw vlastní třídy na hodnotu true, pokud chcete zobrazit ikonu. Tento krok je důležitý, protože pokud tento krok není dokončena, jsou v nabídce zobrazeny žádné ikony.

Přidání položek do nabídky

Prozkoumejte dvě metody musí být přepsána. OnMeasureItem metoda je volána, když je nakreslena vaší nabídce. Metoda OnMeasureItem umožňuje určit velikost vaší nabídce nastavením dvou vlastností konstruktor MeasureItemEventArgs. Jsou dvě vlastnosti MeasureItemEventArgs konstruktoru, která nastavíte vlastnost ItemHeight a vlastnost ItemWidth. Tato nastavení jsou předány jako parametry metody OnMeasureItem.

Chcete zjistit výšku na základě výšky na ikonu položky nabídky. To může nebo nemusí být vždy vhodné. Výška text položky nabídky obvykle by neměl překročit výšku na ikonu.

Chcete-li určit šířku vaší nabídce, musíte znát šířku řetězec zobrazený v položce nabídky. Pomocí objektu StringFormat můžete tyto informace načíst. Tento objekt lze nalézt v oboru názvů System.Drawing. Měření šířky položky nabídky musíte zvážit také na ikonu.

Kód pro metodu OnMeasureItem může být podobná následující příklad kódu.
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

Nakreslit vaší nabídce

Po určení velikosti vaší nabídce musí nakreslete vaší nabídce pomocí metody OnDrawItem vlastní třídy. Tato metoda je předán objekt DrawItemEventArgs. Získání objektu Graphics pro položku nabídky můžete použít objekt DrawItemEventArgs. To umožňuje kreslit přímo na povrch vaší nabídce pomocí výkonných GDI + funkce, které jsou k dispozici v rozhraní .NET Framework. První nakreslete barvu pozadí. Potom nakreslete na ikonu. Poslední nakreslete text položky nabídky.

Kód pro vaší nabídky může být podobná následující příklad kódu.
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

Vytvoření klávesové zkratky pro položku nabídky

V příkladech kódu funkce AppendShortcut nazývá v OnMeasureItem metodu a metodu OnDrawItem. By měření a nakreslete vaše řetězce na základě vlastnost text položky nabídky. Však tato nepovažuje fakt, že položka nabídky pravděpodobně klávesovou zkratku. Položka nabídky nemá klávesovou zkratku, musíte zobrazit klávesové zkratky a zvětšit šířku položky nabídky. Klávesové zkratky musí představovat jako řetězec. Funkce AppendShortcut představuje klávesové zkratky jako řetězec a připojí řetězec zástupce existující text položky nabídky.

Kód funkce AppendShortcut může být podobná následující příklad kódu.
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

Zvýrazněte položku nabídky

Po vytvoření položky nabídky Základní ikonu můžete zvýraznit je vybrána položka nabídky. Musíte nakreslit ohraničení a zvýraznit text v metodě OnDrawItem.

Příklad kódu

Následující příklad kódu je dokončeno kód vlastní třídy. Tento příklad kódu zahrnuje kód zvýrazněte položku nabídky.
' Form1.vb
Public 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
Poznámka je třeba změnit kód Visual Basic 2005. Ve výchozím nastavení jazyka při vytváření projektu model Windows Forms vytvoří dva soubory projektu. Pokud formulář Form1 název, dva soubory, které představují formuláře jsou nazvány Form1.vb a Form1.Designer.vb. Zapisovat kód v souboru Form1.vb. Návrhář model Windows Forms zapíše kód v souboru Form1.Designer.vb. Návrhář model Windows Forms používá klíčové slovo částečné implementace Form1 rozdělit do dvou samostatných souborů. Toto chování zabrání právě spolu s kódu direktivami kód generovaný Návrhář.

Další informace o vylepšení nový jazyk Visual Basic 2005 naleznete na webu Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/library/ms379584(vs.80).aspx
Další informace o částečné třídy a Návrhář model Windows Forms na webu služby MSDN:
http://msdn2.microsoft.com/en-us/library/ms171843.aspx

Vlastnosti

ID článku: 888168 - Poslední aktualizace: 11. května 2007 - Revize: 2.5
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Klíčová slova: 
kbmt kbvs2005swept kbvs2005applies kbhowtomaster kbprogramming kbmacroexample kbexpertiseinter kbhowto KB888168 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:888168

Dejte nám zpětnou vazbu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com