Initialisisierung einer Eigenen Klasse mit Basisklasse CEdit



  • Hallo,

    ich möchte ein Edit-Control um ein paar Funktionen erweitern.

    Dazu hab ich mir wie im Titel angegeben eine eigene Klasse CMyEdit erstellt,
    welche als Basisklasse CEdit hat.

    Damit Ihr euch was drunter vorstellen könnt ein bisschen Code:

    void CMyEdit::CreateEdit(int id,int x,int y,int groesse)
    {
    CMyEdit *pEdit = new CMyEdit;
    pEdit->Create(
    WS_CHILD |WS_VISIBLE | WS_TABSTOP |WS_BORDER,CRect(x,y,x+20,y+20),this, id);
    }
    

    Nun initialisiere ich das ganze in meinem Hauptdialog:

    CMyEdit *pMyEdit;
    pMyEdit->CreateEdit(blabla...);
    

    Dies funktioniert auch, der Haken ist nur dass jetzt alle Nachrichten in ein und
    derselben Nachrichtenwarteschlange sind( wenn man mehrere Edit Fenster erstellt).

    Deswegen wollte ich es anders machen:

    void CMyEdit::CreateEdit(int id,int x,int y,int groesse)
    {
    Create(
    WS_CHILD |WS_VISIBLE | WS_TABSTOP |WS_BORDER,CRect(x,y,x+20,y+20),this, id);
    }
    

    Initialisierung im Hauptdialog:

    CMyEdit *pMyEdit = new CMyEdit;
    pMyEdit->CreateEdit(blabla...);
    

    Nun schmiert mein das Programm ab.

    Wisst Ihr was ich da falsch mach?



  • Wieso erstellst du innerhalb deiner Klasse nochmal eine Instanz der gleichen Klasse?

    du brauchst doch nur noch:

    void CMyEdit::CreateEdit(int id,int x,int y,int groesse)
    {
      Create(WS_CHILD |WS_VISIBLE | WS_TABSTOP |WS_BORDER,CRect(x,y,x+20,y+20),this,id);
    }
    

    Oder wozu soll das gut sein? Ach und die msges enthalten die ID des Controls, damit kannst du sie auseinanderhalten, diese entspricht der Control-ID der man im Ress-Editor sonst einen Namen gibt. Du musst sie eindeutig machen..



  • Wieso erstellst du innerhalb deiner Klasse nochmal eine Instanz der gleichen Klasse?

    Genau dies will ich ja nicht machen, aber es war bisher der funktionierende Weg.

    Wie muss ich denn die Klasse aus meinem Dialog initialisieren damit es so geht:

    void CMyEdit::CreateEdit(int id,int x,int y,int groesse)
    {
      Create(WS_CHILD |WS_VISIBLE | WS_TABSTOP |WS_BORDER,CRect(x,y,x+20,y+20),this,id);
    }
    

    Also im Haupdialog dann:

    CMyEdit *pMyEdit=new CMyEdit;
    pMyEdit->CreateEdit(...);
    

    Das funktioniert nicht.



  • Was sagt er denn? Das müsste gehen..



  • Was sagt er denn? Das müsste gehen..

    Tut es aber nicht!

    Ich programmier nicht mit VC6 sondern mit embedded VC++.
    Meine Zielplattform ist Windows Mobile 2003 für Pocket PC, aber MFC ist doch MFC wenn mich nicht alles täuscht.
    Meine Pocket PC Anwendung basiert zumindest auf MFC, ja gut es ist bestimmt nicht alles möglich was auf normalen Windows Anwendungen läuft, aber das sollte doch zumindest drin sein.

    Mein Compiler muxt auch nicht, aber ich bekomm auf diesem Weg einfach kein Edit Control.



  • Autsch - ich habe noch nen Fehler gesehen:

    Du kannst als ParentWnd kein "this" deiner eigenen Klasse übergeben, du braucht da natürlich den Zeiger von deinem Dialog/Form.

    Hier mal meine Create-Methode die ich benutze um ein eigenes Control vom CWnd abzuleiten. Du musst dann an der Stelle auch CWnd benutzen dein Dialog/Form ist davon ja auch abgeleitet.

    void CDiagramm::Create(const RECT &rect, CWnd *pParentWnd)
    {
    	CWnd::Create(NULL, "CDiagramm", WS_VISIBLE|WS_BORDER, rect, pParentWnd, 11);
    }
    

    aufgerufen wird das dann mit

    CDiagramm* d = new CDiagramm;
    	d->Create(CRect(1,1,100,100), this);
    

    Ansonsten fällt mir dabei noch ein, das du vielleicht direkt die Elternklasse mit angeben solltest, in deinem Fall also CButton::Create(), dann brauchst du deine Methode auch nicht CreateEdit(), sondern kannst sie auch einfach nur Create() nennen.

    Gehen muss das auch im embedded vc++ mit mfc..



  • Jaja, der this Zeiger. 😮

    Danke, jetzt läufts.


Anmelden zum Antworten