Control-Techniken: Eigenes Toolboxicon für Steuerelement

    • VB.NET
    • .NET (FX) 3.0–3.5

      Control-Techniken: Eigenes Toolboxicon für Steuerelement

      Dadurch, dass ich es mittlerweile immer öfters benötige, und es hier im Forum noch kein passendes Tutorial diesbezüglich gibt,
      habe ich mich schnell herangesetzt und rasch ein Tutorial zusammengeschrieben.




      Was benötigen Sie?
      Grundsätzlich benötigen Sie für dieses Tutorial keine besonderen Komponenten, lediglich ein Control,
      welches Sie mit einem Toolbox-Icon erweitern wollen, sowie diverse Basisgrundkenntnisse.

      Für dieses Tutorial verwende ich folgendes TestControl:
      TestControl anzeigen

      VB.NET-Quellcode

      1. Option Strict On
      2. Option Explicit On
      3. Option Infer On
      4. Imports System.Drawing
      5. Imports System.ComponentModel
      6. Imports System.Windows.Forms
      7. ''' <summary>
      8. ''' Ein Steuerelement zum Testen des ToolboxBitmaps, auf Basis des Tutorials von Gather.
      9. ''' Das Tutorial ist auf vb-paradise.de zu finden.
      10. ''' </summary>
      11. <DesignerCategory("Code")>
      12. <Description("Ein Steuerelement zum Testen des ToolboxBitmaps, auf Basis des Tutorials von Gather.")>
      13. Public Class TestControl : Inherits Control
      14. #Region " Declarations "
      15. ''' <summary>
      16. ''' Farben zur Darstellung des TestControls.
      17. ''' </summary>
      18. Private _ControlColors As Color() = {Color.Red, Color.Yellow, Color.Green}
      19. #End Region
      20. #Region " Mouse-Hook "
      21. '
      22. ' Die Mouse-Hook wird zum Erkennen des aktuellen Mausstatus verwendet.
      23. '
      24. ''' <summary>
      25. ''' Wird für die Angabe des Aktuellen Mausstatus benötigt.
      26. ''' </summary>
      27. Private _CurrentState As MouseState = MouseState.None
      28. ''' <summary>
      29. ''' Enumweration für den Status der Maus.
      30. ''' </summary>
      31. ''' <remarks>Für dieses Tutorial als Integer definiert.</remarks>
      32. Enum MouseState As Integer
      33. ''' <summary>
      34. ''' Die Maus befindet sich nicht über dem Steuerelement.
      35. ''' </summary>
      36. None = 0
      37. ''' <summary>
      38. ''' Die Maus befindet sich über dem Steuerelement.
      39. ''' </summary>
      40. Over = 1
      41. ''' <summary>
      42. ''' Die Maus befindet sich, mit gedrückter linker Maustaste, über dem Steuerelement.
      43. ''' </summary>
      44. Down = 2
      45. End Enum
      46. Protected Overrides Sub OnMouseEnter(e As System.EventArgs)
      47. _CurrentState = MouseState.Over : Invalidate()
      48. MyBase.OnMouseEnter(e)
      49. End Sub
      50. Protected Overrides Sub OnMouseLeave(e As System.EventArgs)
      51. _CurrentState = MouseState.None : Invalidate()
      52. MyBase.OnMouseLeave(e)
      53. End Sub
      54. Protected Overrides Sub OnMouseDown(e As System.Windows.Forms.MouseEventArgs)
      55. _CurrentState = MouseState.Down : Invalidate()
      56. MyBase.OnMouseDown(e)
      57. End Sub
      58. Protected Overrides Sub OnMouseUp(e As System.Windows.Forms.MouseEventArgs)
      59. _CurrentState = MouseState.Over : Invalidate()
      60. MyBase.OnMouseUp(e)
      61. End Sub
      62. #End Region
      63. #Region " Drawing "
      64. Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
      65. Dim g As Graphics = e.Graphics
      66. Using p As New Pen(_ControlColors(_CurrentState))
      67. g.DrawRectangle(p, New Rectangle(0, 0, Width - 1, Height - 1))
      68. End Using
      69. Using b As New SolidBrush(ForeColor)
      70. Using sf As New StringFormat With {.Alignment = StringAlignment.Center, .LineAlignment = StringAlignment.Center}
      71. g.DrawString("Gathers TestControl", Font, b, ClientRectangle, sf)
      72. End Using
      73. End Using
      74. MyBase.OnPaint(e)
      75. End Sub
      76. #End Region
      77. End Class





      Wie funktioniert das Ganze?

      Mithilfe von ToolboxBitmapAttribute können Sie eine Zeichenfolge angeben, die den Pfad und den Dateinamen für eine Bitmap von 16 x 16 Pixel angibt. Diese Bitmap wird, nachdem sie der Toolbox hinzugefügt wurde, neben dem Steuerelement angezeigt. Sie können auch einen Type angeben, sodass die diesem Typ zugeordnete Bitmap geladen wird. Wenn Sie sowohl Type als auch eine Zeichenfolge angeben, sucht das Steuerelement in der Assembly, die den vom Type-Parameter angegebenen Typ enthält, nach einer Bildressource mit dem vom Zeichenfolgenparameter angegebenen Namen. (Msdn - 2017)

      Das Ganze zerlege ich nun in Einzelteile.




      Was ist zu beachten?
      Beim Setzten des Toolbox-Icons sollten Sie folgendes beachten:
      • Das Icon muss eine Bilddatei vom Typ Bitmap .bmp sein.
      • Die Bittiefe muss 24Bits pro Pixel entsprechen.
      • Die Größe des Bitmaps muss 16x16 entsprechen.
      Nutzt man den eingebauten Editor, welches sich in Visual Studio befindet, lassen sich diese Eigenschaften einfach festlegen.






      Wie binden Sie das Bitmap richtig ein?
      Grundsätzlich sehr simpel:
      Ziehen Sie das zu verwendende Bitmap einfach in die Projektmappe, beziehungsweise fügen Sie es über Rechtsklick -> Hinzufügen -> Vorhandenes Element einfach hinzu.
      Anschließend benennen Sie die Bitmap-Datei genau gleich wie die Klasse, der das Bitmap zugeordnet werden soll.
      In unserem Fall: TestControl.bmp

      Nun muss noch der Buildvorgang gesetzt werden. Diesen stellen Sie von Inhalt auf Eingebettete Ressourcen.




      Hinzufügen des Bitmaps zum Control
      Nun muss das Bitmap nurnoch dem jeweiligen Control zugeordnet werden. Dies geschieht, wie oben schon erwähnt, mit dem ToolboxBitmapAttribut.
      Dazu gibt es zwei Methoden:
      1. Das Hinzufügen mittels Dateipfad (welches für eine portable Bibliothek unvorteilhaft ist), und das
      2. Hinzufügen mittels Ressourcen (wie oben erklärt).

      VB.NET-Quellcode

      1. ' Legt das Bitmap, mittels Dateipfad fest.
      2. <ToolboxBitmap("C:\Documents and Settings\User\Pictures\TestControl.bmp")> _
      3. Public Class TestControl
      4. ' Restlicher ControlCode...
      5. ' Legt einen Typ fest, nachdem in den Ressourcen gesucht wird, sowie der Name nach dem gesucht werden soll.
      6. <ToolboxBitmap(GetType(TestControl), "TestControl.bmp")> Public Class TestControl
      7. ' Restlicher ControlCode...


      Liegen Bitmap in Klasse im selben NameSpace kann der angegebene String entfernt werden. (<ToolboxBitmap(GetType(TestControl)>)
      Ist dies nicht der Fall, kann man die Bitmap-Datei so umbenennen, dass der Dateiname dem obergeordneten Namespace entspricht.
      Liegt unser TestControl nun zum Beispiel im Namespace Controls, müssen wir die Bitmap-Datei in Controls.TestControl.bmp umbennen.
      Diesbezüglich können Sie sich auch folgenden Thread ansehen: Eigenes ToolboxBitmap in Namespace




      Standardicons verwenden
      In Visual Studio ist es ebenfalls möglich bereits vorhandene Standardicons zu verwenden.
      Möchten Sie zum Beispiel das Button-Icon verwenden, welches von Visual Studio bereitgestellt wird, müssen Sie die ToolboxBitmapAttribute wie folgt definieren:

      VB.NET-Quellcode

      1. <ToolboxBitmap(GetType(Button))>





      Transparenz und Kompatibilität
      Wenn man eine Bitmap-Datei verwendet, gibt es natürlich keine Transparenz.
      Keine Sorge, Visual Studio erledigt dies von ganz alleine.
      Weiß (255,255,255) wird automatisch transparent.

      Will man nun Icons erstellen, welche mit den verschiedenen Visual Studio Themes kompatibel sind,
      sollte man die von VS verwendeten Farben ebenfalls verwenden.
      Diese werden ebenfalls automatisch konvertiert.

      Ich empfehle deswegen das Betrachten der Visual Studio Image Library:
      microsoft.com/en-us/download/details.aspx?id=35825





      Das war's!
      Schon haben Sie zu Ihrem Steuerelement ein eigenes Icon hinzugefügt!
      An dieser Stelle noch zwei hilfreiche Links:
      msdn.microsoft.com/de-de/library/4wk1wc0a(v=vs.110).aspx
      msdn.microsoft.com/de-de/libra…pattribute(v=vs.110).aspx

      Ich hoffe dieses Tutorial konnte Ihnen helfen!

      Mit freundlichen Grüßen
      Martin Pfeiffer aka. Gather_




      Mfg: Gather
      Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gather“ ()