Windows Forms-Steuerelementbibliothek

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Mangafreak1995.

    Windows Forms-Steuerelementbibliothek

    Hi,

    Wie kann ich mit vb 2010 ein Projekt vom Typ Windows Forms-Steuerelementbibliothek erstellen, ich arbeite mich gerade durch das Galileo Openbook durch, aber das is für 2008, bis jetzt war alles gleich bei meiner version, aber ich finde diesen Projekt-Typ einfach nicht, gibts den in vb 2010, wie heißt der da und wie finde ich ihn?



    Gruß Einsteiger
    So sieht des in dem Buch ausch aus, aber bei mir steht unter installierte Vorlagen nur Visual Basic, aber da kann ich nich noch irgenwelche unterkapitel öffnen, und bei mir steht auch nicht .Net Framework 3.5 drüber sondern nur des sortieren nach, muss ich mir da extra was runterladen?

    Samtrion schrieb:

    Hast du eventuell nur eine Express Version?
    sehr warscheinlich. Is aber kein Problem. Du erstellst einfach eine Klassenbibo und gehst dann im Projekt auf Hinzufügen > Benutzersteuerelement. dann machst du einfach weiter, wie bei Gallileo beschrieben.
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    danke, aber jetzt hab ich schon wieder nen problem

    wie mach ich des in vb 2010 da gibts menu erstellen nicht und kompilieren hab ich auch nie gefunden:

    VB.NET-Quellcode

    1. Nun soll das Benutzersteuerelement zum ersten Mal in der Windows-Testanwendung ausprobiert werden. Voraussetzung ist eine Kompilierung (Menü Erstellen). Anschließend ergänzen Sie die Projektmappe um ein Windows Forms-Projekt und geben den Verweis auf das Steuerelementprojekt an. Dazu aktivieren Sie unter Verweis hinzufügen die Registerkarte Projekte, in der das Projekt des Benutzersteuerelements bereits aufgeführt ist.
    2. Wenn Sie das Benutzersteuerelement aus der Toolbox in die Form der Windows Forms-Anwendung ziehen, werden zwar die Ellipse und die Beschriftung des Labels angezeigt, eine Größenänderung hat aber zur Folge, dass nicht der gesamte Bereich des Benutzersteuerelements neu gezeichnet wird, sondern nur der neu hinzugekommene (zu sehen zum Beispiel bei angedockter Ellipse). Vermeiden lässt sich dieser Effekt mit der Einstellung True der Eigenschaft ResizeRedraw des Benutzersteuerelements, zum Beispiel im Load-Ereignis.


    wenn ich des neue Steuerelement in die neue Form ziehe, dann kommt der Fehler:

    Das Steuerelement ClassLibrary1.UserControl1 hat eine unbehandelte Ausnahme im Designer ausgelöst un wurde deaktiviert.
    Ausnahme: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    Stapelüberwachung: ...


    Bis jetzt hab ich in dem Steuerelement nur ne Ellipse gezeichnet und ein verstecktes Label hinzugefügt.

    ich blicks nemme

    helft mir bitte
    Zeig mal deinen jetztigen Code. Hast du auch alle Verweise da ? System.Windows.Forms, System.Drawing, ...
    Also:

    ich habe einen Klassenbibliothek erstellt, dann habe ich ein Benutzersteuerelement und eine windows-Form hinzugefügt.
    Im Steuerelement lautet der Code:

    VB.NET-Quellcode

    1. Imports System.Windows.Forms
    2. Imports System.Drawing
    3. Public Class UserControl1
    4. Protected TextLabel As Label
    5. Protected fillCol As New SolidBrush(Color.Blue)
    6. Private Sub Grafik(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Me.Paint
    7. Dim g As Graphics = e.Graphics
    8. g.FillEllipse(fillCol, 0, 0, ClientSize.Width, ClientSize.Height)
    9. Dim x As Integer = (ClientSize.Width - TextLabel.ClientSize.Width) / 2
    10. Dim y As Integer = (ClientSize.Height - TextLabel.ClientSize.Height) / 2
    11. TextLabel.Location = New Point(x, y)
    12. End Sub
    13. Private Sub Laden(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    14. ResizeRedraw = True
    15. End Sub
    16. End Class


    In der Form und in der ClassLibrary isch kein Code.

    Dann hab ich auf erstellen geklickt, und mir in der Toolbox alle anzeigen lassen.
    Unter meinem Projektnamen (ganz oben in der Toolbox war mein neues Steuerelement )
    Das wollt ich dann auf die Form ziehen und dann kam der Fehler.

    Als ich heute das Projekt neu geöffnet hab kam mein steuerelement auch unter "alle WPF-Steuerelemente", allerdings deaktiviert.
    Deshalb kann ichs nicht auf die Form ziehen, ich hab jetzt nomal auf erstellen gklickt und jetzt kams wieder unter dem Projektnamen, aktiviert ber der Fehler kommt immer noch, wenns ich in die form ziehen will.

    Danke, dass ihr mir helfen wollt,
    gruß Einsteiger
    Kein Problem dafür sind wir ja da ;)
    Deine Vorgehensweise ist soweit richtig. Unter WPF wirst du es nur nutzen können wenn du es nicht mit GDI machst sondern via XAML oder du nutzt einen Forms-Host.

    Und den Fehler sehe ich auch ;)
    Es gibt zwei Stellen wo du das Label ansprichst :

    Visual Basic-Quellcode

    1. Protected TextLabel As Label

    Visual Basic-Quellcode

    1. TextLabel.Location = New Point(x, y)

    Aber es wird nie das Label initialisiert ;)
    Probier einfach mal den folgenden Code aus. Ich habe ihn kommentiert und kleine Änderungen vorgenommen um dir meine Denkweise mal näherzubringen ;)
    Meine überarbeitete Version

    VB.NET-Quellcode

    1. Option Explicit On
    2. Option Strict On
    3. Imports System.Windows.Forms
    4. Imports System.Drawing
    5. Public Class UserControl1
    6. Protected TextLabel As Label
    7. Private fillCol As SolidBrush ' gut dass du einen konstanten Brush nimmst bei einer konstanten Farbe ;)
    8. Public Sub New() ' hier initialisiert sich alles und hier werde ich auch alles initialisieren ;)
    9. SetStyle(ControlStyles.ResizeRedraw) ' entspricht dem "ResizeRedraw = True"
    10. fillCol = New SolidBrush(Color.Blue)
    11. TextLabel = New Label() ' Label initialisieren/erstellen
    12. Controls.Add(TextLabel) ' dem Steuerelement hinzufügen
    13. End Sub
    14. Private Sub Grafik(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Me.Paint
    15. ' Dim g As Graphics = e.Graphics
    16. ' warum eine extra Variable wenn du g nur einmal nutzt ?
    17. e.Graphics.FillEllipse(fillCol, 0, 0, ClientSize.Width, ClientSize.Height)
    18. End Sub
    19. Private Sub ResizeControl() Handles Me.Resize
    20. ' das Label muss nur neu positioniert werden du die Größe deines Control veränderst (und das passiert nicht so oft, wie es gezeichnet werden muss)
    21. ' Dim x As Integer = (ClientSize.Width - TextLabel.ClientSize.Width) \ 2 man beachte das \ es sorgt automatisch für die Konvertierung von Double zu Integer
    22. ' denn eigentlich würde es ein Fehler geben
    23. ' auch hier habe ich die Variablen weggelassen da sie nur einmal verwendet werden, um die Lesbarkeit zu erhalten habe ich mit _ und Zeilenumbrüchen Ordnung geschafft ;)
    24. ' ich habe ClientSize beim Label weggelassen, da wir vermutlich von der äußeren Form des Labels dieses positionieren wollen
    25. TextLabel.Location = New Point((ClientSize.Width - TextLabel.Width) \ 2, _
    26. (ClientSize.Height - TextLabel.Height) \ 2)
    27. End Sub
    28. End Class
    Meine Control
    Ich habe das auch mal gemacht und das ist mein Code (leider nur aus dem Kopfe)

    VB.NET-Quellcode

    1. Friend Class EllipseLabel : Inherits Label
    2. Public Sub New()
    3. SetStyle(ControlStyles.SupportTransparentBackcolor Or ControlStyles.ResizeRedraw Or ControlStyles.OptimizedDoublebuffer, True)
    4. SetStyle(ControlStyles.Opaque, False)
    5. Backcolor = Color.Transparent
    6. _eColor = Color.Red
    7. End Sub
    8. Protected Overrides Sub OnPaint(ByVal sender As Object, ByVal e As PaintEventArgs)
    9. e.Graphics.FillEllipse(New SolidBrush(_eColor), 0, 0, Width, Height)
    10. e.Graphics.DrawString(Text, Font, New SolidBrush(ForeColor), (Width - e.Graphics.MeasureString(Text, Font).X) \ 2, (Height - e.Graphics.MeasureString(Text, Font).Y) \ 2)
    11. End Sub
    12. Private _eColor As Color
    13. ' hier ein paar Propertymodifikation via ComponentModel
    14. Public Property EllipseColor() As Color
    15. Get : Return _eColor : End Get
    16. Set (ByVal value As Color)
    17. If value <> _eColor Then
    18. _eColor = value
    19. Invalidate()
    20. Else
    21. _eColor = value
    22. End If
    23. End Set
    24. End Property
    25. End Class
    Vielen Dank für die Antwort

    Das SetStyle(ControlStyles.ResizeRedraw) nimmt er mir nicht ich, als lösung bietet der mir nur an den Methodenstub in ClassLibrary1 zu generieren (oder so ähnlich)
    Soll ich des machen?

    edit: und mein erster Code war vom Galileo Openbook

    gruß Einsteiger
    Nein sollst du nicht generieren.
    Ersetze es erstmal durch ResizeRedraw = True, aber warum funktioniert das bei dir nicht.
    WinForms-Andwendung ? Welches Framework nutzt du ?
    Welches Framework ich benutze weiß cih selber nicht, wo kann ich des sehen?
    ich hab mir halt die 2010 express version heruntergeladen und halt des framework, des da dabei war.

    aber es klappt jetzt (yeah)

    nur noch eins, die ellipse ist oben ein wenig abgeschnitten, wie wenn ein rechteck darüber liegen würde, und wenn ich dem textlabel nen Text zuweise so ungefähr: TextLabel.Text = "Hallo" dann ändert sich gar nix

    wie krieg ich des noch hin?
    Meinen Code nehmen ;) denn dann hast du selbst das Label und musst es nicht selbst nach Veränderungen abfragen. Entweder du machst dir eigene Eigenschaften ungefähr so :

    VB.NET-Quellcode

    1. Property PropertyNameOfLabel As PropertyTypeOfLabel
    2. Get
    3. Return Label.PropertyNameOfLabel
    4. End Get
    5. Set (ByVal value As PropertyTypeOfLabel)
    6. If Not(Label.PropertyNameOfLabel.Equals(value)) Then
    7. Label.PropertyNameOfLabel = value
    8. Invalidate()
    9. Else
    10. Label.PropertyNameOfLabel = value
    11. End If
    12. End Set
    13. End Property

    Hier müsstest du zB jetzt "PropertyNameOfLabel" durch "Text" ersetzen und "PropertyTypeOfLabel" durch "String" ersetzen ;) das machst du für alle Eigenschaften des Labels die dir wichtig erscheinen. Sollte eine Meldung kommen : Gibts hier schon dann mach die Eigenschaft als Overrides.