Mehrere Controls in einer Klasse zusammenfassen



  • Hi,

    ich denke der Titel ist schon relativ aussagekräftig. Ich verwende eine Kombination von Controls (Label + Button + ComboBox + Label) sehr häufig in meiner Anwendung und habe mir gedacht dass ich eine Klasse daraus bilde.

    Leider bin ich trotz googel nicht ganz dahinter gekommen wie ich das bewerkstelligen muss.

    So wie ich das bisher verstanden habe muss ich mein Control zunächst instanzieren und dann auch noch Create aufrufen bevor ich es verwenden kann:

    CStatic lblData* = new CStatic();
    lblData->Create(...)
    

    Die genau Definition (im Header sind die Deklarationen):

    this->m_lblSource = new CStatic();
    this->m_lblSource->Create(_T("No Text"), WS_CHILD|WS_VISIBLE|SS_SUNKEN, CRect(x, y, 150, 50), pParentWnd ); 
    
    this->m_btnSwitch = new CButton();
    this->m_btnSwitch->Create(_T("No Text"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect((x+200), 10, 100, 30), pParentWnd, 1);
    
    this->m_cboCondition = new CComboBox();
    this->m_cboCondition->Create(WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_DROPDOWNLIST, CRect((x+350), 10, 200, 100), pParentWnd, 1);
    
    this->m_lblDescription = new CStatic();
    this->m_lblDescription->Create(_T("No Text"), WS_CHILD|WS_VISIBLE|SS_SUNKEN, CRect((x+600), y, 150, 50), pParentWnd );
    

    Nun weiss ich nicht, ob das soweit richtig ist?

    Des Weiteren weiss ich nicht, wo ich das jetzt einbinde, so dass es auch angezeigt wird?

    Lg Kerberos


  • Mod

    Grundsätzlich sehe ich da kein Problem.
    Eibinden kannst Du das in jedem Parentfenster, und wenn dieses sichtbar ist und eine entsprechende Größe hat, werden Deine Controls auch sichtbar.

    Du kannst das mit Spy++ kontrollieren.

    PS: Ich halte den this-> Syntax für ungünstig und unleserlich!



  • Hi,

    danke für deine Antwort!

    Die this-> Syntax habe ich vom Wizard übernommen, wusste nicht dass man das im Normalfall weg lässt -> bin ein C++ Neuling.

    Leider wird bei mir nichts angezeigt. Theoretisch müsste das ja mit jedem View funktionieren, das ich übergebe?

    Ich habe ein SDI Projekt mit Basis FormView. In der Klasse xxxView (xxx=Projektname - also der "Hauptdialog") erzeuge ich eine Instanz meiner Klasse, die die Komponenten zusammenfasst, und übergebe als Parameter für pParentWnd die aktuelle Instanz dieses Fensters (this)

    Konstruktor meiner Controls-Klasse

    MyControls( CWnd* pParentWnd, int x, int y )
    {
    this->m_lblSource = new CStatic();
    this->m_lblSource->Create(_T("No Text"), WS_CHILD|WS_VISIBLE|SS_SUNKEN, CRect(x, y, 150, 50), pParentWnd ); 
    
    this->m_btnSwitch = new CButton();
    this->m_btnSwitch->Create(_T("No Text"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect((x+200), 10, 100, 30), pParentWnd, 1);
    
    this->m_cboCondition = new CComboBox();
    this->m_cboCondition->Create(WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_DROPDOWNLIST, CRect((x+350), 10, 200, 100), pParentWnd, 1);
    
    this->m_lblDescription = new CStatic();
    this->m_lblDescription->Create(_T("No Text"), WS_CHILD|WS_VISIBLE|SS_SUNKEN, CRect((x+600), y, 150, 50), pParentWnd ); 
    }
    

    Beispielaufruf in der Klasse xxxView (von CFormView abgeleitet):

    MyControls* controls = new MyControls(this, 50, 50);
    

    Es wird aber nichts angezeigt. Muss man die Controls nochmal expliziet dem Panel zuweisen, anzeigen oder Ähnliches?

    Lg Kerberos


  • Mod

    Wo in CFormView machst Du das denn?
    Ist das CFormView groß genug?



  • Hi,

    nochmals Danke für deine Antwort!

    Ich hab das momentan in den Konstruktor der CFormView reingeschieben. Das Form CFormView sollte eigentlich schon groß genug sein, zumindest das etwas anzeigt wird.

    Kann es sein dass man die Controls zum CFormView hinzufügen muss (ála Container.Add(Control) in C#) oder das man es erst anzeigen muss?(ála Control.Show())

    Lg Kerberos



  • Was ich noch vergessen habe:

    die Container-Klasse habe ich von CWnd abgeleitet.

    Lg Kerberos


  • Mod

    Deine Containerklasse interessiert in diesem Fall niemeanden:
    1. Erzeugst Du dieses Control nicht
    2. Benutzt Du für die Child Windows direkt die Parent Window Addressen.

    Oder?



  • Hi!

    eigentlich schon, meine Vorgehensweise:

    1. Im Konstruktor erzeuge ich eine Instanz meiner Container-Klasse.

    2. Ich erzeuge die Instanzen der Komponenten (CStatic, CButton, ...) die ich benötige.

    3. ich übergebe der Create-Methode der einzelnen Komponenten einen Zeiger auf das CFormView-Objekt.

    Mehr mache ich im Moment noch nicht, weil es bisher auch noch nichts anzeigt 😞 Im nächsten Schritt wäre es denkbar die Komponenten des Containers auf ein eigenes CWnd (ohne Rahmen) zu Packen.

    Lg Kerberos


Anmelden zum Antworten