Button - Hintergrund transparent

  • VB.NET

Es gibt 37 Antworten in diesem Thema. Der letzte Beitrag () ist von SystemUnknow.

    Button - Hintergrund transparent

    Hallo,

    ich habe ein UserControl(um genauer zu sein einen Button).

    Hier mal ein paar Codeausschnitte:


    VB.NET-Quellcode

    1. Public Class MyFirstButton : Inherits Windows.Forms.UserControl
    2. Public Sub New()
    3. InitializeComponent()
    4. Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
    5. Me.SetStyle(ControlStyles.FixedHeight, True)
    6. Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
    7. Me.SetStyle(ControlStyles.ResizeRedraw, True)
    8. Me.DoubleBuffered = True
    9. End Sub
    10. Public Property T3xt() As String
    11. Get
    12. Return _Text
    13. End Get
    14. Set(ByVal value As String)
    15. _Text = value
    16. Me.Invalidate()
    17. End Set
    18. End Property


    Dann habe ich in

    VB.NET-Quellcode

    1. MouseDown, MouseEnter, Leave, MouseLeave, MoseUp un MyBase.Load
    halt das Zeichnen zum jeweiligen Status.

    Inherit Windows.Forms.Button habe ich eingegeben und dann angeklickt, dass mein UserControl von Windows.Forms.Button erben soll.

    Aber dann erscheint das hier:




    Wie lasse ich jetzt vom Typ Button erben?

    Edit: Titel geändert, aktuelles Problem ist jetzt der Hintergrund.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Kevin Hombre“ ()

    ja, der thread ist bischen unklar: iwie scheinst du die Klassen UserControl und button nicht recht auseinanderzuhalten.

    ich habe sogar aus deinem Thread zitiert, nämlich die Frage, von der ich annehmen musste, es sei die aktuellste.
    Und die habe ich präzise beantwortet.

    Dass du dir nun weitere Infos zum gegebenen Stichwort einholst, davon gehe ich mal aus.

    (oder möchtest du gar meine Buch-Empfehlung?)
    Ein UserControl ist bereits eine abgeleitete Klasse, die kannst Du nicht noch zusätzlich von Button erben lassen.
    Du kannst höchstens zu Fuß eine Button-Klasse schreiben:

    VB.NET-Quellcode

    1. Imports System.Windows.Forms
    2. Public Class ClassButton
    3. Inherits Button
    4. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Ein UserControl ist bereits eine abgeleitete Klasse, die kannst Du nicht noch zusätzlich von Button erben lassen.
    Du kannst höchstens zu Fuß eine Button-Klasse schreiben:


    VB.NET-Quellcode

    1. Imports System.Windows.Forms
    2. Public Class ClassButton
    3. Inherits Button
    4. End Class
    Vorher habe ich es ja so gehabt:

    VB.NET-Quellcode

    1. Public Class NButton : Inherits Windows.Forms.UserControl


    Habe ich dann zu:

    VB.NET-Quellcode

    1. Public Class NButton : Inherits Button
    geändert.

    Es erscheint die Meldung:

    VB.NET-Quellcode

    1. Die für die NButton-Klasse festgelegte System.Windows.Forms.Button-Basisklasse darf sich nicht von der System.Windows.Forms.UserControl-Basisklasse eines ihrer anderen partiellen Typen unterscheiden.



    Das Button wird jetzt unterstrichen.
    Ich kann anklicken ob ich von

    VB.NET-Quellcode

    1. System.Windows.Forms.Button
    erben lassen will oder
    von

    VB.NET-Quellcode

    1. System.Windows.Forms.UserControl
    .

    Lasse ich jetzt von System.Windows.Forms.Button erben, so kann ich das Load Event nicht mehr nutzen.
    Lasse ich jetzt von System.Windows.Forms.UserControl erben, so habe ich keinen Typ Button in meinem Control und jedes mal wenn ich das Control verwende und anklicke, lande ich im Load_Event anstatt im Click_Event(muss man dann immer manuell suchen).


    Was nun?

    Kevin Hombre schrieb:

    Die für die NButton-Klasse festgelegte System.Windows.Forms.Button-Basisklasse darf sich nicht von der System.Windows.Forms.UserControl-Basisklasse eines ihrer anderen partiellen Typen unterscheiden.

    Vermutlich hat der Designer eine Partiale Klasse angelegt, als es noch ein UserControl war.
    Diese Partiale Klasse ist jetzt nicht mehr gültig, wenns ein Button sein soll.

    Möglicherweise kannst du im DesignerCode die Inherits UserControl - Anweisung ändern auf Inherits Button.

    Evtl. musst du dann einige Fehler ausbessern, weil die Button-Klasse nicht alles unterstützt, was UserControl unterstützt.

    Evtl. sollte die DesignerCode-Datei aber auch komplett gelöscht werden.

    xtts02 schrieb:

    Du hast vermutlich zuerst ein UserControl erstellt und versucht, diese vom Button erben zu lassen (bzw vom UserControl, was Unsinn ist, denn es ist schon ein UserControl, was Du erstellt hast).
    Lösung: Neu -> Klasse -> Inherits Button ...

    Die Idee ist gut. Hab ich mal ausprobiert, habe eine Klassenbibliothek erstellt und dort Inherits Button.

    Aber leider weiss ich nicht wo ich die Sachen die ich im Load_Event habe hinpacken soll.

    Außerdem kann ich Initializecomponent() auch nicht nutzen.

    Der Button zeigt im moment die Umrisse der Form und wenn ich im Click Event was ausführen möchte geschieht nichts.

    VB.NET-Quellcode

    1. Public Class AuahButton
    2. Inherits Windows.Forms.Button
    3. Public Sub New()
    4. Me.DoubleBuffered = True
    5. ' Weitere Eigenschaften definieren ...
    6. End Sub
    7. Protected Overrides Sub OnClick(e As System.EventArgs)
    8. MessageBox.Show("Hau' mich nicht so !!!", "Auahh !", MessageBoxButtons.OK, MessageBoxIcon.Error)
    9. MyBase.OnClick(e)
    10. End Sub
    11. Protected Overrides Sub OnMouseHover(e As System.EventArgs)
    12. Me.Font = New Font(Me.Font, FontStyle.Bold)
    13. MyBase.OnMouseHover(e)
    14. End Sub
    15. Protected Overrides Sub OnMouseLeave(e As System.EventArgs)
    16. Me.Font = New Font(Me.Font, FontStyle.Regular)
    17. MyBase.OnMouseLeave(e)
    18. End Sub
    19. End Class
    Glückwunsch für Dein ersten eigenes Contrrol. :thumbup:
    Vielleicht überlegst Du Dir gleich, Deinen Klassen sinnvolle Namen zu geben, MyButton ist sicher nicht optimal, aber wohl besser als AuahButton. Beim nächsten Mal hast Du dann schon den Rahmen eines Buttons und kannst ihn nach Belieben "verfeinern".
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Was ist mit Initializecomponent() und wo soll ich die Hintergrundfarbe des Controls festlegen?

    Initializecomponent() habe ich normal immer im Public Sub new() ausgeführt und Me.BackColor habe ich im Load Event gesetzt.

    Wie mach ich das denn?
    Generiere Dir für all diese Eigenschaften Properties, das lässt sich dann von außen und im Designer ganz easy handeln.
    Ob Du die nun in InitializeComponents oder so im Konstruktor setzt, ist völlig egal.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    xtts02 schrieb:

    Man, Rod. Du bist schlecht. Ich habe erwartet: Du würdest dich mehr drüber aufregen, dass bei jedem Klick ein blödsinniger MessageBox erscheint :P

    Solch Zeug ignoriere ich einfach. :thumbsup: :thumbsup: :thumbsup:
    Das hat ja keinen Bezug zu den gesuchten Effekten. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also wirft bis jetzt keine Fehlermeldungen aus.

    Allerdings wird der Button einfach nicht gezeichnet.



    VB.NET-Quellcode

    1. Public Sub New()
    2. Me.DoubleBuffered = True
    3. Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
    4. Me.SetStyle(ControlStyles.FixedHeight, True)
    5. Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
    6. Me.SetStyle(ControlStyles.ResizeRedraw, True)
    7. Me.BackColor = Color.Transparent
    8. End Sub


    VB.NET-Quellcode

    1. Protected Overrides Sub OnPaint(pevent As System.Windows.Forms.PaintEventArgs)
    2. Redraw(pevent.Graphics)
    3. MyBase.OnPaint(pevent)
    4. End Sub


    Mit Redraw sollte der Button eigentlich gezeichnet werden. Der Button hat verschiedene Farben, jenachdem ob man klickt oder mit der Maus drüber fährt.

    Aber wird irgendwie gar nicht gezeichnet. Woran liegt das?
    Tausche mal die Zeilen:

    VB.NET-Quellcode

    1. MyBase.OnPaint(pevent)
    2. Redraw(pevent.Graphics)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich sehe diese Zeilen nur bei Paint, hab ich bei Dir abgeschrieben.
    MyBase.Paint überschreibt den Button mit nichts, also lass es auch gleich weg.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!