Steuerelemente aus "fremder" Klasse erstellen



  • Hi,

    Ich hab ein Problem, meine dynamisch erzeugten Buttons auch in meinem Dialog angezeigt zu bekommen. Sie wollen einfach nicht so, wie ich will...
    Folgendermaßen bin ich vorgegangen: Ich hab eine Klasse erstellt

    class CTest : public CWnd
    

    In dieser Klasse versuche ich meine Buttons zu erstellen

    static int z=0;
    
    	CButtonST *m_button1, *m_button2;
    	m_button1 = new CButtonST;
    	m_button2 = new CButtonST;
    
    	m_button1->Create(NULL,WS_VISIBLE | WS_TABSTOP | BS_VCENTER, 
                    CRect(20, 60, 40, 90), this, z); z++;
    	m_button2->Create(NULL,WS_VISIBLE | WS_TABSTOP | BS_VCENTER, 
                    CRect(60, 60, 80, 90), this, z); z++;
    
    	delete m_button1,m_button2;
    

    Wenn ich den unteren Code in meine Hauptklasse eingebe funktioniert es.
    this habe ich auch schon einmal gegen einen Zeiger auf meine Dialogklasse getauscht, aber dies hat auch nichts gebracht.

    Ich hoffe mir kann jemand helfen.
    Gruß Eddy



  • hmm also dein extremes eigenleben was deine button so entwickeln kommt bestimmt einmal daher weil du ihnen keine IDC_ zuweist. wenn du mal einen blick in die MSDN wirfst steht unter CButton::Create als letzter parameter UINT nID du übergibst ihnen ein static int das du auch noch hochzählst!!

    und der erste parameter bei create der LPCTSTR lpszCaption würde ich jetzt nicht mit NULL belegen wenn ich nix im Button stehn haben will sondern mit "".

    das nächste was da gänzlich aus dem ruder läuft ist du willst nachdem du die button erstellst sie wieder löschen. das wäre das gleiche wenn du nen text auf ein blatt papier schreibst ihn sofort wieder wegradierst und dich wunderst warum da nix geschrieben steht. 😉

    versuch mal folgenden code bei mir funzen die steuerelemente einwandfrei

    #define IDC_BUTTEN1 3001
    #define IDC_BUTTEN2 3002
    
        CButton *m_button1, *m_button2; 
    
        m_button1 = new CButton(); 
        m_button2 = new CButton(); 
    
        m_button1->Create("Test",WS_VISIBLE | WS_TABSTOP , 
                    CRect(40, 60, 80, 90), GetParent(), IDC_BUTTEN1);  
    
        m_button2->Create("Test",WS_VISIBLE | WS_TABSTOP , 
                    CRect(100, 150, 200, 200), this, IDC_BUTTEN2);
    

    mfg
    LowFly


  • Mod

    1. Wenn Du einen delete direkt am Ende durchführst werden die Controls auch wieder zerstört. So sieht zumindest Dein Snipplett aus.
    2. Ist Deine Control in dem Du die Buttons erzeugen möchtest auch große genug. Beachte vor allem, das die Koordinaten hier relativ zum Parent sind. Also würde Deine Buttons irgendwo rechts vom Start Deines Controls erscheinen.

    @LowFly: Er vergibt IDs beginnent mit 0



  • Danke an euch beiden, aber leider funktioniert es immer noch nicht.

    Ich hab alles durchgeführt, was LowFly bemängelt hat, aber es erscheint immer noch nichts in meinem Dialog.

    GetParent() erzeugt bei mir auch einen Fehler

    Fehler: Debug Assertion Failed
    afxwin2.inl
    Line 265
    

    Wenn ich den Code in meiner Hauptklasse aufrufe funktioniert bei mir auch alles. Muss ich die neue Klasse irgendwie einbinden?

    @ Martin Richter: Die Koordinaten stimmen. Ich konnte sie ja wie oben geschrieben testen.

    Soll ich euch sonst noch etwas mitteilen?

    Gruß Eddy



  • Muss ich die neue Klasse irgendwie einbinden

    was meinst du damit

    erstellst du die button in einer eigenen classe (kein dialog) und ruft sie dann auf??
    oder ist die neuen classe ein dialog.

    wenn die neue klasse kein dialog ist ist es klar warum es nicht funzt.
    ich zitiere mal kurz die MSDN

    MSDN Button::Create(..,..,..,CWnd* pParentWnd,..) schrieb:

    pParentWnd
    Specifies the button control's parent window, usually a CDialog. It must not be NULL

    ich übersetzt das mal mit meinem bescheidenen englisch.

    Low's übersetzung schrieb:

    pParentWnd
    spezifiziert das tastensteuer elternfenster , normalerweise ein CDialog. Es darf nicht UNGÜLTIG sein.

    wird es jetzt ein bischen deutlicher warum es vieleicht nicht geht du brauchst das händel auf das fenster indem du die button erstellst.

    Dein Handle ist UNGÜLTIG WEIL wenn das kein CDialog ist deine neue classe, dann ist this kein CWnd bzw. GetParent() auch nicht. 😉

    ich nehm jetzt mal an das die klasse in der du die butten erstellst die CButtonST ist. übergib beim erstellen der classe CButtonST das CWnd des Dialogs.

    CButtonST *pButSt = new CButtonST(GetParent());
    CButtonST *pButSt = new CButtonST(this);
    

    im Konstrucktor der classe schreibst dann.

    CButtonST::CButtonST(CWnd *pWnd)
    {
       m_pWnd = pWnd;
    }
    

    m_pWnd setzte dann anstatt this o. GetParent ein

    m_button->Create("Test",WS_VISIBLE | WS_TABSTOP , 
                    CRect(100, 150, 200, 200), m_pWnd, IDC_BUTTEN2);
    

    dann sollte es eigendlich klappen

    ansonsten wüste ich jetzt nicht warum.

    mfg
    LowFly



  • Ich hab jetzt alles so gemacht, wie du es gesagt hast ( hoffe ich 😞 )

    Test.cpp

    CButtonST *m_button1, *m_button2;
    	m_button1 = new CButtonST(GetParent());
    	m_button2 = new CButtonST(this);
    	m_button1->Create("",WS_VISIBLE | WS_TABSTOP | BS_VCENTER, 
                    CRect(40, 60, 80, 90), m_pWnd, 1);
    

    BtnSt.h

    class CButtonST : public CButton
    {
    public:
        CButtonST(CWnd *pWnd);
    	CTestDlg* m_pWnd;
    

    BtnSt.cpp

    CButtonST::CButtonST(CWnd *pWnd)
     {
       m_pWnd = pWnd;
    

    Leider bekomme ich immer noch Fehler.

    'IDD_TEST_DIALOG' : nichtdeklarierter Bezeichner 
    error C2057: Konstanter Ausdruck erwartet
    Test.cpp
    error C2440: '=' : 'class CWnd *' kann nicht in 'class CTestDlg *' konvertiert werden
            Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator
     oder eine Typumwandlung im C- oder Funktionsformat
    

    Liegt es an der CButtonST die ich von Codeprojekt habe? Muss ich da irgendwie anders vorgehen?

    Danke nochmals für die tolle Erklärung. Leider war ich zu dumm es umzusetzen.



  • lol ja hätteste das mal früher gesagt.
    dann hätte man sich das hier sparen können.

    hab mir die klasse mal runtergezogen vo cp.

    konnte es zwar nicht testen da ich die alt...h nicht hab. aber allein vom reinschaun würde ich sagen.

    in die header deines dialogs kommt

    CButtonST	 m_btnSTLogo;
    CButtonST	 m_btnFace;
    

    in die OnInit deines dialogs kommt

    m_btnSTLogo.SubclassWindow(GetDlgItem(IDC_DEINBUTTON1));
    m_btnFace.SubclassWindow(GetDlgItem(IDC_DEINBUTTON2));
    
    m_btnSTLogo.SetBitmaps(IDB_DEINICON1, RGB(255, 255, 255));
    
    m_btnFace.SetBitmaps(IDB_DEINICON2, RGB(0, 255, 0));
    

    das wars ganz einfach und simpel.
    wenn man vor hat sich andere classen einzuverleiben sollte man zumindest ansatzweise verstehn was darin passiert.

    Ich hab das jetzt zuende gebracht weil ich es angefangen hab. normalerweise mach ich das nicht jemandem helfen eine classe in sein project zu prügeln der diese nicht mal ansatzweise versteht.

    aber nix für ungut
    hab spaß damit

    mfg
    LowFly



  • Vielen Dank und nochmals Entschuldigung für deine Mühen.

    Gruß Eddy


Anmelden zum Antworten