Mittwoch, 28. November 2012

Wie erstelle ich ein Custom Control mit Visual Studio in Visual Basic?

Ich habe es endlich geschafft und mein erstes eigenes Control erstellt.
Ich nutze dazu folgendes Tutorial http://www.codeproject.com/Articles/2016/Writing-your-Custom-Control-step-by-step?msg=4438543#xx4438543xx , welches allerdings in C# und auf Englisch ist.

Also dazu hier von mir ein kleines Tutorial in VB und deutsch:

Was wird draus?

Es soll ein zweifarbiger Button werden. Die Farben können in Ihrer Transparenz verändert werden. Es soll die Möglichkeit geben, das sich die Farben vertauschen, wenn man mit der Maus über den Button fährt.
  1. Das Projekt
    Neues Projekt erstellen
    Menü Datei -> Neues Projekt
    Unter Visual Basic -> Windows -> und rechts Windows Forms Steuerelementbibliothek auswählen
    Name vergeben , Speicherort festlegen -> OK
    Im ProjektmappenExplorer UserControl1.vb markieren und mit Entf Taste löschen
    Über das Menü Projekt -> Neues Element hinzufügen
    Im Dialog nun das Benutzerdefinierte Steuerelement auswählen -> Namen vergeben, bei mir ist es CuteButton -> Hinzufügen
    Im Projektmappenexplorer das Symbol für Alle Dateien anzeigen klicken
    es sollte nun unter der CuteButton.vb noch die CuteButton.Designer.vb Datei erscheinen
    Diese verändert man nun folgendermaßen:
    Die Zeile (dritte von oben)
    Inherits System.Windows.Forms.Control
    wird nun abgeaendert in
    Inherits System.Windows.Forms.Button
  2. Der Code
    Es wird jetzt nur noch die Datei CuteButton.vb verändert.
    Am Anfang sieht sie so aus:
Public Class cuteButton

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)

'Benutzerdefinierten Zeichnungscode hier einfügen
End Sub
End Class

Am Ende sieht es dann so aus:


Imports System.ComponentModel

Public Class cuteButton
  Private Property m_color1 As Color = Color.LightGreen
  Private Property m_color2 As Color = Color.DarkBlue
  Private Property m_color1Transparent As Integer = 64
  Private Property m_color2Transparent As Integer = 64
  Private Property m_Gradient As Single
  Private Property m_SwitchAtMouseOver As Boolean
  Private Property m_Text As String
  Private Property m_TextAlignment As ContentAlignment = ContentAlignment.MiddleCenter

  <Description("Gets and sets CuteButtons textalignment.")> _
  Public Property CuteTextAlignment() As ContentAlignment
    Get
      Return m_TextAlignment
    End Get
    Set(ByVal value As ContentAlignment)
      m_TextAlignment = value
      Invalidate()
    End Set
  End Property

  <Description("Gets and sets CuteButtons text.")> _
  Public Property CuteText() As String
    Get
      Return m_Text
    End Get
    Set(ByVal value As String)
      m_Text = value
      Invalidate()
    End Set
  End Property

  <Description("Gets and sets if the CuteColors are switched when the Mouse is over the CuteButton.")> _
  Public Property CuteMouseOver() As Boolean
    Get
      Return m_SwitchAtMouseOver
    End Get
    Set(ByVal value As Boolean)
      m_SwitchAtMouseOver = value
      Invalidate()
    End Set
  End Property

  <Description("Gets and sets the first gradient color")> _
  Public Property CuteColor1() As Color
    Get
      Return m_color1
    End Get
    Set(ByVal value As Color)
      m_color1 = value
      Invalidate()
    End Set
 End Property

  <Description("Gets and sets the second gradient color")> _
  Public Property CuteColor2() As Color
    Get
      Return m_color2
    End Get
    Set(ByVal value As Color)
      m_color2 = value
      Invalidate()
    End Set
  End Property
 
  <Description("Gets and sets the transparency for the first gradient color (Vals between 0 and 255 allowed)")> _
  Public Property CuteTransparent1() As Integer
    Get
      Return m_color1Transparent
    End Get
    Set(ByVal value As Integer)
      m_color1Transparent = value
      'Beschränkung der eingebbaren Werte, da es ohne zu Fehlern kommen kann

      If m_color1Transparent > 255 Then
         m_color1Transparent = 255
      End If
      If m_color1Transparent < 0 Then
         m_color1Transparent = 0
      End If
      Invalidate()
    End Set
  End Property

  <Description("Gets and sets the transparency for the second gradient color (Vals between 0 and 255 allowed)")> _
  Public Property CuteTransparent2() As Integer
    Get
      Return m_color2Transparent
    End Get
    Set(ByVal value As Integer)
      m_color2Transparent = value
      If m_color2Transparent > 255 Then
         m_color2Transparent = 255
      End If
      If m_color2Transparent < 0 Then
         m_color2Transparent = 0
      End If
      Invalidate()
    End Set
  End Property

  <Description("Gets and sets the angle for the gradient colors (Vals between 0 and 360 allowed)")> _
  Public Property CuteGradient() As Single
    Get
      Return m_Gradient
    End Get
    Set(ByVal value As Single)
      m_Gradient = value
      If m_Gradient > 360 Then
         m_Gradient = 360
      End If
      If m_Gradient < 0 Then
         m_Gradient = 0
      End If
      Invalidate()
    End Set
  End Property

  Private Sub XB_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.MouseEnter
    Dim oldcolor As Color
    If m_SwitchAtMouseOver = True Then
       oldcolor = m_color1
       m_color1 = m_color2
       m_color2 = oldcolor
    End If
  End Sub

  Private Sub XB_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.MouseLeave
    Dim oldcolor As Color
    If m_SwitchAtMouseOver = True Then
       oldcolor = m_color1
       m_color1 = m_color2
       m_color2 = oldcolor
    End If
  End Sub
 
  Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
  Dim c1, c2 As Color
  Dim r As Rectangle
  Dim style As New StringFormat()
  'AusgangsStyle

  style.Alignment = StringAlignment.Center
  style.LineAlignment = StringAlignment.Center

  'Style in Abhängigkeit des Eingstellten Properies CuteTextAlignment
  Select Case m_TextAlignment
    Case ContentAlignment.MiddleLeft
      style.Alignment = StringAlignment.Near
      style.LineAlignment = StringAlignment.Center
    Case ContentAlignment.BottomLeft
      style.Alignment = StringAlignment.Near
      style.LineAlignment = StringAlignment.Far
    Case ContentAlignment.TopLeft
      style.Alignment = StringAlignment.Near
      style.LineAlignment = StringAlignment.Near
    Case ContentAlignment.BottomRight
      style.Alignment = StringAlignment.Far
      style.LineAlignment = StringAlignment.Far
    Case ContentAlignment.MiddleRight
      style.Alignment = StringAlignment.Far
      style.LineAlignment = StringAlignment.Center
    Case ContentAlignment.TopRight
      style.Alignment = StringAlignment.Far
      style.LineAlignment = StringAlignment.Near
    Case ContentAlignment.BottomCenter
      style.Alignment = StringAlignment.Center
      style.LineAlignment = StringAlignment.Far
    Case ContentAlignment.MiddleCenter
      style.Alignment = StringAlignment.Center
      style.LineAlignment = StringAlignment.Center
    Case ContentAlignment.TopCenter
      style.Alignment = StringAlignment.Center
      style.LineAlignment = StringAlignment.Near
  End Select
  'Benutzerdefinierten Zeichnungscode hier einfügen
  'Create two semi transparent colors
  c1 = Color.FromArgb(m_color1Transparent, m_color1)
  c2 = Color.FromArgb(m_color2Transparent, m_color2)
  'Clientrectangel in r ablegen

  r = Me.ClientRectangle
  'Lineargradientbrush b in Form des Clientrechtecks mit den Farben c1 und c2 und dem Winkel m_Gradient
  Dim b As New System.Drawing.Drawing2D.LinearGradientBrush(r, c1, c2, m_Gradient)
  e.Graphics.FillRectangle(b, r)

  'Hier wird noch einmal der CuteText ueber den Button gezeichnet, da der Original Button Text hinter dem Brush b verschwindet. Also wenn die Farben nicht transparent sind, ist der normale Button Text gar nicht lesbar. Style bestimmt die Position des CuteTextes.
  e.Graphics.DrawString(m_Text, MyBase.Font, New SolidBrush(MyBase.ForeColor), r, style)
  b.Dispose()
 End Sub
End Class

Nun muss das Ganze noch über das Menü Erstellen, erstellt werden.

Die Zuweisung in die Toolbox dann über Rechtsklick in gewählter Unterkategorie -> Elemente auswählen -> unter .NET auf durchsuchen klicken -> hier nun die erstellte dll auswählen (unter bin/debug im Verzeichnis des Projektes) Sollte das Element in der Toolbox ausgegraut/nicht verfügbar sein, muss geprüft werden ob das Projekt in mindestens der gleichen Version (.Net Framework) ist, die auch zur Erstellung des Custom Controls verwendet worden ist. Einstellen lässt sich das über die Projekteingenschaften im Reiter Kompilieren. Hier muss der Dialog über den Button Erweiterte Kompilierungsoptionen aufgerufen werden,

Montag, 26. November 2012

kleines Tool zum Umwandeln von Text in Großbuchstaben

Da meine Tochter vorerst nur Großbuchstaben gelernt hat und immer wieder mal ein wenig lesen üben möchte, habe ich mal ein kleines Tool zum Umwandeln von Text in Text mit Großbuchstaben erstellt.

Hier ist der Downloadlink -> Link

Das Programm wird gern von Antivirensoftware als verdächtig eingestuft, ist aber virenfrei.
Die Installation verlangt .Net 4 -> wird ggf. mit installiert (dauert dann etwas länger). Das Tool ist nur für Windows (ab XP).

Installation:

Entpacken. Passwort ist UCaseText.
Setup.exe ausführen.


Anwendung:

In linkes Textfeld Text reinkleben, Knopf (->) in der Mitte drücken und auf der rechten Seite erscheint der Text in Großbuchstaben. Wer möchte kann es sich von dort herauskopieren in Word oder ähnliches und es dann ausdrucken.