Kann man VS2005 irgendwie so einstellen, daß er VC6++ kompatiblen MFC Code erzeugt?



  • Ich habe hier nämlich gerade ein Buch das auf VC6++ aufbaut und da steht dann so etwas drin wie: Klicken sie hier, klicken sie da usw.

    Aber das ist nicht das Problem, die Schaltflächen heißen in VS2005 zwar alle anders, so muß man z.B. in der Resourcenansicht (da wo man die GUI zusammenbasteln kann) auf "Rechtsklick->Ereignishandler hinzufügen" klicken um eine Memberfunktion der Klasse hinzufügen, aber das ist nicht das Problem.
    Sondern das Problem ist, daß der erzeugte Code weitgehend vom Code, den VC6++ erzeugen würde, abweicht und dann ist es recht schwer den Beispielen im Buch zu folgen.

    Wenn man z.B. den Anweisungen im Buch folgt, dann kann man laut Buch in VC6++ einem statischen Text z.B. die ID Eigenschaft IDC_STATIC_INFO geben und diesem eine Membervariable vom Typ CString hinzufügen, damit ist der Inhalt des Textes bzw. der Variable dann dynamisch veränderbar.
    Das ganze funktioniert in VS2005 leider nicht mehr, denn anstatt eine Variable vom Typ CString zu akzeptieren, ändert VS2005 diese im Code eigenmächtig wieder zu CStatic, im Klassenansicht bleibt es dagegen bei CString.
    Der daraus resultierende Code, mit dem dann diese Variable benutzt wird, ist in VS2005 entsprechend ebenfalls komplett anders.
    Es genügt also auch nicht, in der Editoransicht die Variable eigenhändig einfach in CString zu ändern, denn der Aufrufcode ist ja auch komplett anders:

    void CMeinProjectDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_STATIC_INFO, m_csMeinText);
    }

    Ändert man den Typ also trotzdem in CString um, dann erhält man beim Compilieren logischerweise folgenden Fehler:

    error C2664: 'DDX_Control': Konvertierung des Parameters 3 von 'CString' in 'CWnd &' nicht möglich

    In VC6++ sieht der Code dagegen ganz anders aus, gemäß der Codeschnipsel aus dem Buch lautet der Konstruktor z.B., wenn meine Membervariable z.B. m_csMeinText heißt, folgendermaßen:

    CDialog(CMeinsDLg::II, pParent)
    {
      // {{AFX_DATA_INIT(CMeinsDlg)
      m_csMeinText = _T("");
      //} AFX_DATA_INIT
      m_hIcon = AfxGetApp()->Location(IDR_MAINFRAME);
    }
    

    und wenn man den Text dann updaten will, dann genügt es laut Buch folgenden Code einfach in eine aufgerufene Funktion einzubauen:

    m_csMeinText = CString ("Neuer Text.");
    UpdateData(FALSE)
    

    In VS2005 ist das aufgrund des komplett anderen Funktionscodes leider komplett anders.


  • Mod

    Du darfst in dem Wizard keine Control Variable anlegen sondern Du musst Value auswählen!

    Ansonsten sieht der Code von VS-2005 in keiner Weise anders als bei VC6 aus.
    Auch VC6 kennt Control Variablen.



  • Martin Richter schrieb:

    Du darfst in dem Wizard keine Control Variable anlegen sondern Du musst Value auswählen!

    Danke, jetzt funktioniert es.
    Ich werde mal heute Abend das dann in den Code einbauen und auch mal versuchen wie ich dann mit dem Buch weiterkomme.

    Ansonsten sieht der Code von VS-2005 in keiner Weise anders als bei VC6 aus.
    Auch VC6 kennt Control Variablen.

    Gut zu hören.
    Ich dachte schon, da hätte sich weitgehend etwas geändert.



  • Du meinst nicht VC6 sondern die mit VC6 gelieferte MFC Bibliotheksversion.
    Der VC6 und VC2005 Compiler haben sehr wohl signifikante Unterschiede auch außerhalb der Bugbereinigung.


  • Mod

    Wutz schrieb:

    Du meinst nicht VC6 sondern die mit VC6 gelieferte MFC Bibliotheksversion.
    Der VC6 und VC2005 Compiler haben sehr wohl signifikante Unterschiede auch außerhalb der Bugbereinigung.

    Wie Du Dir denken kannst ist mir das sehr wohl bekannt... 🕶
    Es ging aber um den primitiven Syntax der MFC Klassen bei einem Dialog.


Anmelden zum Antworten