Benutzerdefinierte Steuerelemente und Ihre Eigenschaften im Properties Window



  • Hallo,

    ich programmiere ein Benutzerdefiniertes Steuerelement, das von UserControl abgeleitet ist. Dabei möchte ich ein Paar Eigenschaften dem Steuerelement hinzufügen, die im Properties Window angezeigt werden sollen. Der folgende Source Code zeigt wie ich das mache:

    public: property bool MyProperty
    {
    	bool get() 
    	{
    	  return m_bMyPropertyValue;
    	}
    
    	void set(bool val) 
    	{
               m_bMyPropertyValue = val;
    	}
    }
    

    Diese Eigenschaft erscheint aber im Properties Window nicht!
    Darüber hinaus ist es hoch interessant zu erfahren, wie man überhaupt auf das Toolbox in VS zugreift (neue Controls installiert, die mit Icons und Properties aufgelistet werden). Hat jemand vielleicht damit Erfahrung?

    Danke im voraus.



  • martin_pavel schrieb:

    ich programmiere ein Benutzerdefiniertes Steuerelement, das von UserControl abgeleitet ist.

    Hmh, muss man da nicht Attribute definieren? Attribute Class

    martin_pavel schrieb:

    Darüber hinaus ist es hoch interessant zu erfahren, wie man überhaupt auf das Toolbox in VS zugreift

    Vllt hilft
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-216041.html



  • bei einem custom control was ich hier rumliegen hab wurde sowas vor dem property geschrieben

    #region PlusMinusLineColor
    private Color _plusMinusLineColor = Color.DarkGray;
    /// <summary>
    /// Gets or Sets the color of the lines if ShowPlusMinus property is enabled
    /// </summary>
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible), DefaultValue(typeof(Color), "DarkGray")]
    [Browsable(true), Description("Gets or Sets the color of the lines if ShowPlusMinus property is enabled")]
    public Color PlusMinusLineColor
    {
        get
        {
            return _plusMinusLineColor;
        }
        set
        {
            _plusMinusLineColor = value;
            if(Created) Invalidate();
        }
        }
    #endregion
    

    das wird in dem property fenster problemlos angezeigt



  • Das sieht in C++/CLI ungefähr so aus (getestet):

    *.h

    #pragma region BackgroundColor
    private: System::Drawing::Color m_BackColor;
    /// <summary>
    /// Gets or Sets the color of the Background
    /// </summary>
    
    public: property System::Drawing::Color BackgroundColor
    {
    	[DesignerSerializationVisibility(DesignerSerializationVisibility::Visible), DefaultValue(System::Drawing::Color::typeid, "Blue")]
    	[Browsable(true), Description("Gets or Sets the color of the Background")]
        System::Drawing::Color get(void);
        void set(System::Drawing::Color kColor);
    }
    #pragma endregion
    

    *.cpp

    #pragma region BackgroundColor
    System::Drawing::Color TestControlControl::BackgroundColor::get(void)
    {
    	return this->m_BackColor;
    }
    
    void TestControlControl::BackgroundColor::set(System::Drawing::Color kColor)
    {
        m_BackColor = kColor;
        //if(Created) Invalidate();
    }
    #pragma endregion
    

    Leider ändert sich nicht die Farbe des Controls im Designer, es bleibt bei der Default-Einstellung, in diesem Fall Blau.



  • die Farbe ändert sich schon, wenn du halt was Sinnvolles damit machst (z.b. im OnPaint event diese einstellst oder so)...
    Aber dafür muss man halt nicht nur irgendwelche Member-Variablen setzen, sondern wirklich was damit machen.
    Allerdings muss ich sagen, dass ich genau mit diesen Dingen auch lange zu kämpfen hatte (v.a., wenns dann so weit geht, selbst definierte Anzeigen ins Property-Grid einzupflegen).
    Aber wenn man das dann mal hat, dann verwendet man auch ganz gerne mal ein Propertygrid als Control in normalen WinForms GUIs



  • Wenn man die Farbe über die Eigenschaften ändert und sonst nichts macht, passiert im Designer erst mal gar nichts. Erst wenn das Control verschoben oder in der Größe geändert wird, dh. wenn das Control neu gezeichnet werden muss, dann ändert sich auch die Farbe im Designer.

    Aber dafür muss man halt nicht nur irgendwelche Member-Variablen setzen, sondern wirklich was damit machen.

    😮



  • Danke für die Hilfe 👍 . Das hat mich weiter gebracht.

    Noch eine Frage:
    Beim anlegen eines neuen Steuerelements kann man direkt angeben, von welchem Control (zum Beispiel Forms::Label) das neue Steuerelement abgeleitet werden soll?



  • soweit ich weiss nicht, muesste stets in dem eigenen bereich landen


Anmelden zum Antworten