none
CheckState bei Eigenem Control mitgeben RRS feed

  • Frage

  • Hallo zusammen,

    jatzt habe ich einen CheckButton gestaltet mit Ton und Hintergrundfarbe. Das geht auch alles soweit dank eurer Hilfe.

    Aber wie kann ich die Eigenschaften
    Checked
    CheckState
    dem UserControl mit auf dem weg geben.
    So das ich diese später auch beeinflussen bzw. steuern kann.

    Beispiel:
    If Button.Checked = True Then
    ...
    End If

    vielen lieben dank
    Bernd

    Dienstag, 6. April 2010 06:00

Antworten

  • Hallo ChaosBernd,

    Habe im folgenden Beispiel eine CheckBoxWithValue erstellt die von System.Windows.Forms.CheckBox erbt.

    Bei Form1_Load habe ich dann diesem Steuerelement ein paar Eigenschaften angegeben.

    Nachher prüfe ich auf einem Knopf, mithilfe der CheckState Funktion, die Checked Eigenschaft von dieser CheckBoxWithValue.

     

    Public Class Form1
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            Dim myCheck As New CheckBoxWithValue()
    
            myCheck.Value = True
            myCheck.Text = "ABCD"
            myCheck.Name = "MyCheckBox"
            myCheck.Checked = True
    
            Me.Controls.Add(myCheck)
    
        End Sub
    
        Friend Class CheckBoxWithValue
            Inherits System.Windows.Forms.CheckBox
            Private myValue As Object
    
       
            Public Property Value() As Object
                Get
                    Return myValue
                End Get
                Set(ByVal value As Object)
                    myValue = value
                End Set
            End Property
    
        End Class
        Private Function CheckedState(ByVal name As String) As Boolean
            For Each c As Control In Me.Controls
    
                If (c.Name = name) And (TypeOf c Is CheckBox) Then
    
                    If DirectCast(c, CheckBox).Checked Then
                        Return True
                    Else
                        Return False
                    End If
                End If
            Next
    
            Return Nothing
        End Function
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            If CheckedState("MyCheckBox") Then
                MsgBox("Checked")
            Else
                MsgBox("Unchecked")
            End If
    
        End Sub
    End Class

    Grüße,

    Robert

    Dienstag, 6. April 2010 07:34
    Moderator
  • Hallo Bernd,

    wie Thorsten schon schrieb:
    Wenn Du über ein UserControl gehst, mußt Du jede Eigenschaft und
    auch Ereignisse nach aussen weiterleiten.

    Für die CheckBox wären das Checked + CheckedChanged bzw.
    CheckState + CheckStateChanged.
    Das könnte auf die beiden Eigenschaften reduziert wie folgt aussehen:

    Imports System.ComponentModel
    
    Public Class CheckedButton ' Inherits UserControl
        Private WithEvents checkBoxButton As System.Windows.Forms.CheckBox
    
        Public Sub New()
            InitializeComponent()
    
            ' Aus InitializeComponent zur Verdeutlichung
            Me.checkBoxButton = New System.Windows.Forms.CheckBox()
            '
            'checkBoxButton
            '
            Me.checkBoxButton.Appearance = System.Windows.Forms.Appearance.Button
            Me.checkBoxButton.AutoSize = True
            Me.checkBoxButton.Dock = System.Windows.Forms.DockStyle.Fill
            Me.checkBoxButton.Location = New System.Drawing.Point(0, 0)
            Me.checkBoxButton.Name = "checkBoxButton"
            Me.checkBoxButton.Size = New System.Drawing.Size(120, 24)
            Me.checkBoxButton.TabIndex = 0
            Me.checkBoxButton.UseVisualStyleBackColor = True
            Me.Controls.Add(Me.checkBoxButton)
        End Sub
    
    #Region "Checked Eigenschaft"
        ''' <summary>
        ''' Gibt an ob die Schaltfläche markiert ist.
        ''' </summary>
        ''' <remarks>Wird an die interne Schaltfläche weitergereicht.</remarks>
        <Category("CheckedButton"), _
         RefreshProperties(RefreshProperties.All),
         Bindable(True), _
         DefaultValue(False)> _
        Public Property Checked() As Boolean
            Get
                Return Me.checkBoxButton.Checked
            End Get
            Set(ByVal value As Boolean)
                Me.checkBoxButton.Checked = value
            End Set
        End Property
    
        ''' <summary>
        ''' Tritt ein wenn sich die CheckedChange Eigenschaft ändert.
        ''' </summary>
        ''' <remarks>
        ''' Leitet das Ereignis an die interne Schaltfläche weiter.
        ''' </remarks>
        <Category("CheckedButton")> _
        Public Custom Event CheckedChanged As EventHandler
            AddHandler(ByVal value As EventHandler)
                AddHandler Me.checkBoxButton.CheckedChanged, value
            End AddHandler
            RemoveHandler(ByVal value As EventHandler)
                RemoveHandler Me.checkBoxButton.CheckedChanged, value
            End RemoveHandler
            RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
                ' Do Nothing Visual Basic mag es nunmal nur so
                ' http://www.panopticoncentral.net/archive/2004/08/06/1545.aspx
            End RaiseEvent
        End Event
    #End Region
    
    #Region "CheckState Eigenschaft"
        ''' <summary>
        ''' Gibt den Status der Schaltfläche an.
        ''' </summary>
        ''' <remarks>Wird an die interne Schaltfläche weitergereicht.</remarks>
        <Category("CheckedButton"), _
         RefreshProperties(RefreshProperties.All),
         Bindable(True), _
         DefaultValue(CheckState.Unchecked)> _
        Public Property CheckState() As System.Windows.Forms.CheckState
            Get
                Return Me.checkBoxButton.CheckState
            End Get
            Set(ByVal value As System.Windows.Forms.CheckState)
                Me.checkBoxButton.CheckState = value
            End Set
        End Property
    
        ''' <summary>
        ''' Tritt ein wenn sich die CheckedChange Eigenschaft ändert.
        ''' </summary>
        ''' <remarks>
        ''' Leitet das Ereignis an die interne Schaltfläche weiter
        ''' </remarks>
        <Category("CheckedButton")> _
        Public Custom Event CheckStateChanged As EventHandler
            AddHandler(ByVal value As EventHandler)
                AddHandler Me.checkBoxButton.CheckStateChanged, value
            End AddHandler
            RemoveHandler(ByVal value As EventHandler)
                RemoveHandler Me.checkBoxButton.CheckStateChanged, value
            End RemoveHandler
            RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
                ' Do Nothing
            End RaiseEvent
        End Event
    #End Region
    End Class
    
    Ich habe dabei die Eigenschaftswerte direkt an das zugrundeliegende Steuerelement weitergeleitet,
    ebenso die Ereignisse via Custom Event.

    Gruß Elmar

    Dienstag, 6. April 2010 12:34
    Beantworter

Alle Antworten

  • Hallo ChaosBernd,

    Habe im folgenden Beispiel eine CheckBoxWithValue erstellt die von System.Windows.Forms.CheckBox erbt.

    Bei Form1_Load habe ich dann diesem Steuerelement ein paar Eigenschaften angegeben.

    Nachher prüfe ich auf einem Knopf, mithilfe der CheckState Funktion, die Checked Eigenschaft von dieser CheckBoxWithValue.

     

    Public Class Form1
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            Dim myCheck As New CheckBoxWithValue()
    
            myCheck.Value = True
            myCheck.Text = "ABCD"
            myCheck.Name = "MyCheckBox"
            myCheck.Checked = True
    
            Me.Controls.Add(myCheck)
    
        End Sub
    
        Friend Class CheckBoxWithValue
            Inherits System.Windows.Forms.CheckBox
            Private myValue As Object
    
       
            Public Property Value() As Object
                Get
                    Return myValue
                End Get
                Set(ByVal value As Object)
                    myValue = value
                End Set
            End Property
    
        End Class
        Private Function CheckedState(ByVal name As String) As Boolean
            For Each c As Control In Me.Controls
    
                If (c.Name = name) And (TypeOf c Is CheckBox) Then
    
                    If DirectCast(c, CheckBox).Checked Then
                        Return True
                    Else
                        Return False
                    End If
                End If
            Next
    
            Return Nothing
        End Function
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            If CheckedState("MyCheckBox") Then
                MsgBox("Checked")
            Else
                MsgBox("Unchecked")
            End If
    
        End Sub
    End Class

    Grüße,

    Robert

    Dienstag, 6. April 2010 07:34
    Moderator
  • Hallo Robert,
    erstmal vielen dank. Aber so wie ich den Code lese steht er im Form1. Also schon im späteren Anwendungsprogramm.

    Ich hatte vor einen Button zu basteln bei dem alle Eigenschaften fertig sind.
    Wenn ich später beim programmieren den Aufwand wieder betreiben muss, macht es keinen Sinn.
    Dann habe schneller eine CheckBox aus der ToolBox gezogen und das Designe angepasst.

    Was ich eigentlich meine ist, das ich das Control komplett fertig übergebe.
    Also alle Eingenschaften vorab fertigstelle und dann mit auf dem weg gebe.
    In meinem Beispiel war es eine CheckBox die ummodeliert wurde zu einem Button mit CheckStatus.
    Nun könnte man ja auch andere Eigenschaften und Ereignisse mit auf dem Weg geben.

    Thorsten hatte mir bereit geschrieben wie man das Click Ereignis mit auf dem Weg gibt.

    'Leitet nur ds Click Event des Button1 and die Form weiter
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      Me.OnClick(e)
    End Sub
    

     

    Und das wollte ich für z.B. den CheckState mit auf den Weg geben.

    vielen dank
    Bernd

    Dienstag, 6. April 2010 08:10
  • Hallo Bernd,

    präziser beantworten liesse sich die Frage, wenn man die Art der Implementierung
    besser kennen würde. Thorsten Dörfler hatte bereits in Click Event bei eigenen Controls
    vorgeschlagen, direkt von Button (oder ButtonBase) abzuleiten, was ich dabei ebenfalls
    tun würde - eine Standard CheckBox  ist am Ende auch von Button abgeleitet.

    Hast Du über UserControl abgeleitet, so müsstest Du wie dort gezeigt,
    alle Eigenschaften reflektieren bzw. neue dort einfügen, wo Du über den
    Standard hinausgehst.

    Gruß Elmar

    Dienstag, 6. April 2010 08:14
    Beantworter
  • Ok,
    vieleicht verstehe ich das ganze nur falsch.

    Imports System.ComponentModel
    <ToolboxBitmap(GetType(BS_CheckButton), "BS_CheckButton.bmp")> <DefaultEvent("Click")> Public Class BS_CheckButton
        '<ToolboxBitmap("C:\test.bmp")>
        '#Region "Antwort aus msdn"
        'Leitet nur das Click Event des Button1 and die Form weiter
        Private Sub BS_Check_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BS_Check.Click
            Me.OnClick(e)
        End Sub
        '    ' Das erzeugt ein ButtonClick Event später in der Form
        '    'In dem Formular hast Du dann für Dein UserControl ein zusätzliches Ereignis "ButtonClick" zur Auswahl, 
        '    'das nur beim Klicken auf den Button ausgelöst wird.
        '    'Public Event ButtonClick As EventHandler
        '    'Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        '    '    RaiseEvent ButtonClick(sender, e)
        '    'End Sub
        '#End Region
        Dim PlaySound As Boolean = False
        Dim BagColor As Boolean = False
        Dim ChckStat As Boolean = True
        ''' <summary>
        ''' Check Changed
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        ''' <remarks></remarks>
        Private Sub BS_Check_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BS_Check.CheckedChanged
            Einstellen()
            Me.Invalidate()
        End Sub
        ''' <summary>
        ''' Load
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        ''' <remarks></remarks>
        Private Sub Haeckchen_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Me.Size = New Size(Me.Size.Width, Me.Size.Width)
            Einstellen()
        End Sub
        ''' <summary>
        ''' Einstellungen
        ''' </summary>
        ''' <remarks></remarks>
        Private Sub Einstellen()
            If PlaySound = True Then
                My.Computer.Audio.Play(My.Resources.Windows_Battery_Critical, AudioPlayMode.Background)
            End If
            Select Case BS_Check.CheckState
                Case CheckState.Checked
                    ChSt = False
                    BS_Check.BackgroundImage = My.Resources.apply
                    BS_Check.CheckState = CheckState.Checked
                    Select Case BagColor
                        Case True
                            BS_Check.FlatAppearance.CheckedBackColor = Color.Red
                        Case False
                            BS_Check.FlatAppearance.CheckedBackColor = Color.Transparent
                    End Select
                Case CheckState.Unchecked
                    ChSt = True
                    BS_Check.BackgroundImage = My.Resources.x
                    BS_Check.CheckState = CheckState.Unchecked
                    Select Case BagColor
                        Case True
                            BS_Check.BackColor = Color.Green
                        Case False
                            BS_Check.BackColor = Color.Transparent
                    End Select
            End Select
        End Sub
        ''' <summary>
        ''' Paint
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        ''' <remarks></remarks>
        Private Sub BS_Check_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles BS_Check.Paint
            Me.Size = New Size(Me.Size.Width, Me.Size.Width)
            Runden.abrunden(BS_Check, 0, 0, BS_Check.Width, BS_Check.Height, BS_Check.Width)
        End Sub
        ''' <summary>
        ''' Sound Effekt ein aus schalten
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        <Description("Sound Effect on Click, True or False"), Category("BS_CheckButton")> _
        Public Property PlaySnd() As Boolean
            Get
                Return PlaySound
            End Get
            Set(ByVal value As Boolean)
                PlaySound = value
            End Set
        End Property
        ''' <summary>
        ''' Hintergrund Farbe ein aus schalten
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        <Description("Back Color, True or False"), Category("BS_CheckButton")> _
        Public Property BaCo() As Boolean
            Get
                Return BagColor
            End Get
            Set(ByVal value As Boolean)
                BagColor = value
            End Set
        End Property
        ''' <summary>
        ''' Provisorium für der CheckStatus, welches auch später abgefragt werden kann.
        '''     ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        <Description("CheckState, True or False"), Category("BS_CheckButton")> _
        Public Property ChSt() As Boolean
            Get
                Return ChckStat
            End Get
            Set(ByVal value As Boolean)
                ChckStat = value
            End Set
        End Property
    End Class

    Das ist eine CheckBox, die Ansicht habe ich auf Button geändert. Dann mit Bilder, Hintegrundfarben und Ton versehen.
    Das funktioniert alles.

    Public Class Form1
    
        Private Sub BS_CheckButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BS_CheckButton1.Click
            ' Mit meinem Provisorium funktioniert auch die Abfrage. Einwandfrei
            If BS_CheckButton1.ChSt = True Then
                MessageBox.Show("nicht gecheckt")
            Else
                MessageBox.Show("gecheckt")
            End If
        End Sub
    
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            ' möchte aber nun hier den CheckStatus etzen, geht das nicht weil es ihn in den Eigenschaften garnicht gibt.
        End Sub
    End Class
    Soweit sogut.
    Jedoch möchte ich z.B. den CheckStatus haben.

    Ich lesen mir die anderen Threads nochmal durch. Und auch die Beispiele von msdn und Gallileo.
    Ich denke das ich da etwas falsch oder garnicht verstehen.

    Danke
    Bernd 
    Dienstag, 6. April 2010 08:54
  • Hallo Bernd,

    wie Thorsten schon schrieb:
    Wenn Du über ein UserControl gehst, mußt Du jede Eigenschaft und
    auch Ereignisse nach aussen weiterleiten.

    Für die CheckBox wären das Checked + CheckedChanged bzw.
    CheckState + CheckStateChanged.
    Das könnte auf die beiden Eigenschaften reduziert wie folgt aussehen:

    Imports System.ComponentModel
    
    Public Class CheckedButton ' Inherits UserControl
        Private WithEvents checkBoxButton As System.Windows.Forms.CheckBox
    
        Public Sub New()
            InitializeComponent()
    
            ' Aus InitializeComponent zur Verdeutlichung
            Me.checkBoxButton = New System.Windows.Forms.CheckBox()
            '
            'checkBoxButton
            '
            Me.checkBoxButton.Appearance = System.Windows.Forms.Appearance.Button
            Me.checkBoxButton.AutoSize = True
            Me.checkBoxButton.Dock = System.Windows.Forms.DockStyle.Fill
            Me.checkBoxButton.Location = New System.Drawing.Point(0, 0)
            Me.checkBoxButton.Name = "checkBoxButton"
            Me.checkBoxButton.Size = New System.Drawing.Size(120, 24)
            Me.checkBoxButton.TabIndex = 0
            Me.checkBoxButton.UseVisualStyleBackColor = True
            Me.Controls.Add(Me.checkBoxButton)
        End Sub
    
    #Region "Checked Eigenschaft"
        ''' <summary>
        ''' Gibt an ob die Schaltfläche markiert ist.
        ''' </summary>
        ''' <remarks>Wird an die interne Schaltfläche weitergereicht.</remarks>
        <Category("CheckedButton"), _
         RefreshProperties(RefreshProperties.All),
         Bindable(True), _
         DefaultValue(False)> _
        Public Property Checked() As Boolean
            Get
                Return Me.checkBoxButton.Checked
            End Get
            Set(ByVal value As Boolean)
                Me.checkBoxButton.Checked = value
            End Set
        End Property
    
        ''' <summary>
        ''' Tritt ein wenn sich die CheckedChange Eigenschaft ändert.
        ''' </summary>
        ''' <remarks>
        ''' Leitet das Ereignis an die interne Schaltfläche weiter.
        ''' </remarks>
        <Category("CheckedButton")> _
        Public Custom Event CheckedChanged As EventHandler
            AddHandler(ByVal value As EventHandler)
                AddHandler Me.checkBoxButton.CheckedChanged, value
            End AddHandler
            RemoveHandler(ByVal value As EventHandler)
                RemoveHandler Me.checkBoxButton.CheckedChanged, value
            End RemoveHandler
            RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
                ' Do Nothing Visual Basic mag es nunmal nur so
                ' http://www.panopticoncentral.net/archive/2004/08/06/1545.aspx
            End RaiseEvent
        End Event
    #End Region
    
    #Region "CheckState Eigenschaft"
        ''' <summary>
        ''' Gibt den Status der Schaltfläche an.
        ''' </summary>
        ''' <remarks>Wird an die interne Schaltfläche weitergereicht.</remarks>
        <Category("CheckedButton"), _
         RefreshProperties(RefreshProperties.All),
         Bindable(True), _
         DefaultValue(CheckState.Unchecked)> _
        Public Property CheckState() As System.Windows.Forms.CheckState
            Get
                Return Me.checkBoxButton.CheckState
            End Get
            Set(ByVal value As System.Windows.Forms.CheckState)
                Me.checkBoxButton.CheckState = value
            End Set
        End Property
    
        ''' <summary>
        ''' Tritt ein wenn sich die CheckedChange Eigenschaft ändert.
        ''' </summary>
        ''' <remarks>
        ''' Leitet das Ereignis an die interne Schaltfläche weiter
        ''' </remarks>
        <Category("CheckedButton")> _
        Public Custom Event CheckStateChanged As EventHandler
            AddHandler(ByVal value As EventHandler)
                AddHandler Me.checkBoxButton.CheckStateChanged, value
            End AddHandler
            RemoveHandler(ByVal value As EventHandler)
                RemoveHandler Me.checkBoxButton.CheckStateChanged, value
            End RemoveHandler
            RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
                ' Do Nothing
            End RaiseEvent
        End Event
    #End Region
    End Class
    
    Ich habe dabei die Eigenschaftswerte direkt an das zugrundeliegende Steuerelement weitergeleitet,
    ebenso die Ereignisse via Custom Event.

    Gruß Elmar

    Dienstag, 6. April 2010 12:34
    Beantworter
  • Hallo Elmar,
    wie gewohnt eine ausfürliche und verständliche erklärung. vielen lieben dank dafür !

    Wenn es denn nun wirklich richtig verstanden habe.
    Es ist also so das ich alles komplett selber schreiben muss. Jedes Event oder auch jede Eigenschaft die so ein Control haben soll.
    Das finde ich sehr entäuschen von .NET !
    Warum ?
    Erstelle ich ein Control, wird ja so eine Art Panel angezeigt, in der ich ja dann meine Controls gestalten kann.
    Von diesem Panel werden alle Eigenschaften an das neu erstellte Control weitergegeben vererbt).
    Aber genau mit diesen Eigenschaften kann ich doch bei einem selbst erstellten Control nicht anfangen. (na nicht viel)

    Das was der Programmierer aber weitergeben möchte, also das wo es drauf ankommt, das muss mann selber erstellen.
    Ich hatte eigentlich gedacht,
    und darum war mein Verständnis dafür auch so schleppend.
    Wenn ich einen Button in einen Panel ziehe, kann ich dort meine Vorgaben machen und die restlichen Events und Eigenschaften werden genau wie bei dem Panel automatich weitergegeben.

    Naja, dann ist es halt so.

    Nochmals deutlich,
    es war keine Kretik an euch.

    Nun bin ich aber wieder um einiges weiter mit eurer Hilfe.

    lieben dank

    bernd

    Dienstag, 6. April 2010 16:23
  • Hallo Bernd,

    niemand sagt, dass das Entwickeln eigener Steuerelemente keine Arbeit ist!
    Mit ein, zwei Eigenschaften anpassen ist dabei selten getan,
    zumindest wenn man die gleiche Qualität wie bei den mitglieferten
    Steuerelementen erreichen will.

    Ein UserControl und auch andere Container sind nur sehr bedingt
    für das Entwickeln eigener Steuerelemente geeignet. Ihre Aufgabe
    liegt mehr darin eine Zusammenstellung von Steuerlementen zu
    verwalten. Siehe Empfehlungen zum Typ von Steuerelementen

    Beim Erweitern von Steuerelementen, wie es bei Dir passiert, ist das
    Ableiten von einem bestehenden Steuerelement wie CheckBox oft
    einfacher. Und wo das nicht geht, entweder weil so etwas noch nicht
    existiert, oder weil das bestehende Steuerlement sich nur schlecht
    erweitern läßt - was bei den Windows Steuerelementen oft der Fall ist,
    weil sie oft nicht die nötigen Schnittstellen haben bzw. abgeschlossen
    sind. Siehe
    Gewusst wie: Erstellen von Steuerelementen für Windows Forms

    Du kannst ja mal den anderen Ansatz versuchen, über eine Checkbox
    zu gehen. Denn dort brauchst Du die Krücke für die Ereignisse nicht.
    Bei der letzten Antwort hatte ich damit zwar angefangen,
    es aber erst mal zurückgehalten:

    Imports System.ComponentModel
    
    Public Class CheckedButtonEx
        Inherits System.Windows.Forms.CheckBox
    
        Public Sub New()
            MyBase.Appearance = System.Windows.Forms.Appearance.Button
            MyBase.UseVisualStyleBackColor = False
        End Sub
    
        ''' <summary>
        ''' Ansicht immer als Button
        ''' </summary>
        ''' <remarks>Über Attribute ausgeblendet um Veränderungen zu verhindern</remarks>
        <Browsable(False), _
        EditorBrowsable(EditorBrowsableState.Never), _
        DefaultValue(System.Windows.Forms.Appearance.Button)> _
        Public Shadows Property Appearance As System.Windows.Forms.Appearance
            Get
                Return MyBase.Appearance
            End Get
            Set(ByVal value As System.Windows.Forms.Appearance)
                MyBase.Appearance = value
            End Set
        End Property
    
        Private Function ShouldSerializeAppearance() As Boolean
            Return False
        End Function
    
        ''' <summary>
        ''' Wird selbst gmalt
        ''' </summary>
        ''' <remarks>Über Attribute ausgeblendet um Veränderungen zu verhindern</remarks>
        <Browsable(False), _
        EditorBrowsable(EditorBrowsableState.Never), _
        DefaultValue(False)> _
        Public Shadows Property UseVisualStyleBackColor As Boolean
            Get
                Return MyBase.UseVisualStyleBackColor
            End Get
            Set(ByVal value As Boolean)
                MyBase.UseVisualStyleBackColor = value
            End Set
        End Property
    
        Private Function ShouldSerializeUseVisualStyleBackColor() As Boolean
            Return False
        End Function
    
        Protected Overrides Sub OnPaint(ByVal pe As System.Windows.Forms.PaintEventArgs)
            MyBase.OnPaint(pe)
    
            ' ab hier selber malen
        End Sub
    
    End Class
    

    Wobei Dich dabei noch einiges erwartet, da noch vollkommen unfertig!
    Hauptproblem vor jeglicher Erweitung ist dabei das Standarverhalten
    so anzupassen, dass es nicht im Wege ist.
    Und um es "perfekt" zu machen, lies Erweitern der Entwurfszeitunterstützung

    Thorstens Links zur Benamsung solltest Du auch lesen,
    denn nur wenn es wie ein Windows Forms Steuerelement in
    Eigenschaften, Ereignissen usw. aussieht und verhält,
    wird man es als solches honorieren.

    Und wenn Du damit durch bist, dürftest zumindest wissen,
    warum es relativ wenige "professionelle" Steuerlemente
    abseits der Standardsteuerelemente und käuflichen gibt.

    Als Anregung (mal wieder C#): http://www.codeproject.com/KB/buttons/RoundButton.aspx
    Mir zu bunt, aber VB: http://www.codeproject.com/KB/buttons/CButton.aspx

    Gruß Elmar

    Dienstag, 6. April 2010 17:53
    Beantworter
  • Hallo Elmar,

    ich hatte heute bei der Arbeit 2 Stunden zeit und habe versucht deinen letzten Post mal in ein Prujekt nachzubauen.
    Aber egal ws ich da heute alles angestellt habe, ich bekomme nicht mal den anfang hin.
    Neues Projekt Erstellen
    WindowsForms-Steuerelementbibliothek
    Name -> EesteButton
    UserControl1 -> Umbenennen in CheckedButtonEx
    wechseln in Codeanschicht und deinen Code reinkopieren. Und schon rappelt es fehlermeldungen.
    Erste fehler gleich bei:

    Inherits System.Windows.Forms.CheckBox


    Fehler 1 Die für die CheckedButtonEx-Klasse festgelegte System.Windows.Forms.CheckBox-Basisklasse darf sich nicht von der System.Windows.Forms.UserControl-Basisklasse eines ihrer anderen partiellen Typen unterscheiden. C:\Users\Bernd\AppData\Local\Temporary Projects\ErsteButton\UserControl1.vb 4 14 ErsteButton

    was mach ich denn da falsch.
    ich würde gerne dein Beispiel mal als Basis zum einsteigen nehmen.

    den vorletzten Post habe ich mal in anfgrif genommen. dauert aber noch bis ich mich da durchgearbeitet habe.

    gibt es eigentlich für diesen Bereich ein schönes Schritt für Schritt Tut irgenwo ?
    ich habe Google und msdn durch. finde aber nichts für dummis wie mich.


    lieben dank
    Bernd

    Mittwoch, 7. April 2010 15:07
  • Hallo Bernd,

    erstelle einfach eine neue Klasse (oder verwende Class1 und benenne die Datei um).
    Denn ein UserControl produziert schon zuviel Code (eine XXX.Designer.vb),
    wo sich das Inherits UserControl versteckt.
    Wenn Du die automatisch erzeugten Dateien sehen willst, aktiviere
    in der Projektmappe die Ansicht "Alle Dateien anzeigen".

    Gruß Elmar
    Mittwoch, 7. April 2010 15:50
    Beantworter
  • Hallo Elmar,
    jetzt schäme ich mich. aber egal

    Wo soll ich das machen ! Ich habe das in Windows Forms , Windows Bilbithek usw......

    bekomme das nicht hin.

    eorry

    bernd

    Mittwoch, 7. April 2010 16:55
  • Hallo Bernd,

    über die Menüleiste: "Projekt" -> "Klasse hinzufügen"
    oder im Kontextmenü des Projektmappen-Explorer: Hinzufügen -> "Klasse..."
    oder über Tastatur: STRG+UMSCHALT+A -> Klasse

    Gruß Elmar

    Mittwoch, 7. April 2010 17:47
    Beantworter
  • Entschuldige ich habe mich falsch ausgedrück. Wie ich eine neue Klasser erstellen weis ich ja.

    Wenn ich aber eine Klasse in einer KlassenBibliothek erstelle, dann habe ich kein Test Fenster.
    Erstelle ich eine ganz neues Projekt((WindowsControlLibary) darin dann einen Klasse, wird mir diese Klasse auch nicht im Test Fenster angezeigt.

    "erstelle einfach eine neue Klasse (oder verwende Class1 und benenne die Datei um)."
    wenn ich das mache kommt ebenfalls jeine Testfenster, es kommt sogar eine Fehlermeldung.
    System.ArgumentException wurde nicht behandelt.
      Message="Die Assembly \"H:\\bernddos\\VB08\\WindowsControlLibrary2\\WindowsControlLibrary2\\obj\\Debug\\WindowsControlLibrary2.dll\" enthält keine UserControl-Typen."
      Source="UserControlTestContainer"
      StackTrace:
           bei Microsoft.VisualStudio.Tools.UserControlTestContainer.UserControlTestContainer_Load(Object sender, EventArgs e)
           bei System.Windows.Forms.Form.OnLoad(EventArgs e)
           bei System.Windows.Forms.Form.OnCreateControl()
           bei System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
           bei System.Windows.Forms.Control.CreateControl()
           bei System.Windows.Forms.Control.WmShowWindow(Message& m)
           bei System.Windows.Forms.Control.WndProc(Message& m)
           bei System.Windows.Forms.ScrollableControl.WndProc(Message& m)
           bei System.Windows.Forms.ContainerControl.WndProc(Message& m)
           bei System.Windows.Forms.Form.WmShowWindow(Message& m)
           bei System.Windows.Forms.Form.WndProc(Message& m)
           bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
           bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
           bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
           bei System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow)
           bei System.Windows.Forms.Control.SetVisibleCore(Boolean value)
           bei System.Windows.Forms.Form.SetVisibleCore(Boolean value)
           bei System.Windows.Forms.Control.set_Visible(Boolean value)
           bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
           bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
           bei System.Windows.Forms.Application.Run(Form mainForm)
           bei Microsoft.VisualStudio.Tools.UserControlTestContainer.Main(String[] args)
      InnerException:

    Ich habe jetzt jedemenge versuche. alles varianten die mir eingefallen sind.
    ich erziele kein Testfenster !

    aber trotzdem viele lieben dank

    bernd

    Mittwoch, 7. April 2010 20:28
  • Hallo Bernd,

    tja, die kleinen Designer-Assistenten - bei richtigem Programmieren nerven sie leider mehr.
    Hintergrund: Wenn man eine Steuerelement Bibliothek erstellt ohne weiteres Testprojekt,
    so will einem VS unter die Arme greifen und verwendet den UserControlTestContainer .
    Der kann aber, wie der Name schon andeutet, ausschließlich mit UserControls umgehen.

    Will man Steuerelemente von Grund auf entwerfen, so muß man selbst tätig werden.

    Eine kleine Schritt für Schritt Anleitung - und als Download das Ergebnis.

    • Anlage einer Windows Forms Klassenbibliothek (CheckedButtonControlLibrary als CheckedButton Projekt)
    • Löschen UserControl1.vb (brauchen wir nicht)
    • Anlage der Klasse CheckButtonEx und Code von oben einfügen
    • Anlage eines Windows Form Anwendung Projektes zum Testen (CheckedButtonTest)
    • dieses als Startprojekt festlegen
    • Projekt-Verweis hinzufügen auf CheckButtonControlLibrary
    • In das Formular Form1 den Testcode einfügen:

    Public Class Form1
        Private CheckedButtonEx1 As CheckedButtonControlLibrary.CheckedButtonEx
        Public Sub New()
            ' This call is required by the Windows Form Designer.
            InitializeComponent()
    
            ' Add any initialization after the InitializeComponent() call.
            Me.CheckedButtonEx1 = New CheckedButtonControlLibrary.CheckedButtonEx
            Me.CheckedButtonEx1.Appearance = System.Windows.Forms.Appearance.Button
            Me.CheckedButtonEx1.Location = New System.Drawing.Point(22, 13)
            Me.CheckedButtonEx1.Name = "CheckedButtonEx1"
            Me.CheckedButtonEx1.Size = New System.Drawing.Size(104, 24)
            Me.CheckedButtonEx1.TabIndex = 0
            Me.CheckedButtonEx1.Text = "CheckedButtonEx1"
            Me.Controls.Add(Me.CheckedButtonEx1)
    
        End Sub
    End Class
    
    Alternativ kannst Du die CheckedButtonControlLibrary zur ToolBox hinzufügen , was sich
    aber in der Regel erst ab einem einigermaßen ausgereiften Entwicklungsstand lohnt.
    Vorher wird der generierte Code häufiger bei Änderungen Fehler verursachen und
    da ist es besser das Erzeugen selbst in die Hand zu nehmen (was man auch können sollte).

    Gruß Elmar

    Donnerstag, 8. April 2010 09:13
    Beantworter
  • Hallo Elmar,

    vielen lieben dank.
    Das ist mal eine knackige, kurze und konkrete Anleitung.
    Damit komme ich weiter. Nun habe ich eine Grundlage mit der ich arbeiten und lernen kann.

    Das es kein Zuckerschlecken wird ist mir klar. Das ich auch noch viel dazu lernen musss, ebenfalls.
    Aber ich habe mittlerweile 11 Bücher gekauft. Was mir bei den Büchern auffällt, jeder versucht soviele Themen wie möglich reinzupacken.
    Die sollten lieber mal ein Buch mit einem vernünftigem konzept gestalten und ein Thema von A-Z beahndeln.

    vielen dank

    nun werde ich der EigeneCotrol Champ. hihi
     

    Donnerstag, 8. April 2010 18:59