Wizard - Wizard erstellen



  • Also ich möchte ein programm machen was bei tasten drück einen anderen Fensterinhalt anzeigt.Was muss ich alles machen





  • was?



  • oh grade mitbekommen ich habe oben meinen falsch geschreiben na ja t is halt neben z



  • Original erstellt von <louz>:
    oh grade mitbekommen ich habe oben meinen falsch geschreiben na ja t is halt neben z

    Man spricht das T ja eh mit *g*



  • Original erstellt von <loutz>:
    Also ich möchte ein programm machen was bei tasten drück einen anderen Fensterinhalt anzeigt.Was muss ich alles machen

    die benötigten Steuerelemente ein- bzw. ausblenden
    das wars

    oder neuen Dialog öffnen



  • Also er soll einkomplet neus fenster im fenster öffnen.Mit ganzen andren tasten und so.Wie im Wizart halt.



  • Jetzt sag ich's doch. Lies doch mal ein gutes Buch.

    z.B. http://www.mut.de/media/buecher/VCPLUS6/data/start.htm
    oder http://www.duden.de/



  • Das hilft mir JETZ aber auch nicht weiter



  • Ich arbeite z.Z. auch an einem Wizard... wenn ich weis wie es geht, poste ich es hier... allerdings ist die variante mit mehreren Dialogen die bessere, anstatt alle elemente ein und ausblenden, da kriegt man ja voll den krampf, wenn man z.B. 6 verschiedene seiten hat!!



  • Ich wollte das ja uch mit dialoge machen.



  • OK!

    Habe jetzt den Wizard fertig! Hmm, ist aber nicht unbedingt leicht...

    Soll ich jetzt wirklich hier den Code hintun?
    Es ist eine ganze Menge...

    Hmm, OK, ich mache nur die wichtigen Sachen hierrein. Eins nach dem anderem...

    1. Den Hauptdialog erstellen, mit den Buttons Zurück, Weiter... Und man setzt ein Satic-Text an die Stelle, wo die einzelnen Seiten hinsollen und macht es Invisible.

    2. Eine neue Class erstellen (CDialogSheet) und von CDialog ableiten. KEINE Dialog ID angeben!! Er wird zwar meckern, aber das ist egal. Dann löscht man diese Zeile in der CDialogSheet->*.H:

    // Dialog Data
    //{{AFX_DATA(CDialogSheet1)
    enum { IDD = IDD_IRGENDWAS_STEHT_HIER };    //<--- Diese zeile Löschen
    // NOTE: the ClassWizard will add data members here
    //}}AFX_DATA
    

    3. Danach fügt man diese Sachen in dieselbe *.H ein :

    class CDeineHauptDialogClass;        //<--- Diese zeile hinzufügen
    
    /////////////////////////////////////////////////////////////////////////////
    // CDialogSheet dialog
    
    class CDialogSheet : public CDialog
    
    ...
    
    CDialogSheet(UINT IDD, CWnd* pParent);   // "UINT IDD," einfügen
    
    virtual ~CDialogSheet();                 // einfügen
    
    ...
    
    protected:                          // Diesen hanzen Haufen eintragen
    
        static CWnd* m_pParent;       // ParentWindow
        static CButton* m_pBtnBack;   // Pointer auf Zurück-Button
        static CButton* m_pBtnNext;   // Pointer auf Weiter-Button
    
        bool m_bBackEnabled;  // Status des Zurück-Button
        bool m_bNextEnabled;  // Status des Weiter-Button
    
    public:
    
        static CDeineHauptDialogClass* m_Dialog;  // Pointer auf die HauptDialogklasse
    
    // Functions
    public: 
    
        bool bIsBack();    // Statusabfrage des Zurück-Buttons
        bool bIsNext();    // Statusabfrage des Weiter-Buttons
    
        static bool EnableBtnBack(bool bValue);  //Zuruck Enable/Disable
        static bool EnableBtnNext(bool bValue);  //Weiter Enable/Disable
    
        static void SetButtonControl(CButton* pBtnBack, CButton* pBtnNext); // Button-Controll übergabe
    

    4. Nun in die *.CPP datei von CDialogSheet irgendwo ganz oben eintragen:

    //init static Members
    
    CWnd* CDialogSheet::m_pParent = NULL;
    CButton* CDialogSheet::m_pBtnBack = NULL;
    CButton* CDialogSheet::m_pBtnNext = NULL;
    
    CReportWizardDlg* CDialogSheet::m_Dialog = NULL;
    

    5. "UINT IDD, " zu den Constructor Parametern hinzufügen.

    6. Diese Funktionen reinkopieren, in der *.H sind sie ja schon eingetragen.

    CDialogSheet::~CDialogSheet(){
    }
    
    bool CDialogSheet::bIsBack() {
        return m_bBackEnabled;
    }
    
    bool CDialogSheet::bIsNext() {
        return m_bNextEnabled;
    }
    
    void CDialogSheet::SetButtonControl(CButton* pBtnBack, CButton* pBtnNext) {
    
        m_pBtnBack=pBtnBack;
        m_pBtnNext=pBtnNext;
    }
    
    bool CDialogSheet::EnableBtnBack(bool bValue) {
    
        bool bDone=false;
    
        if (m_pBtnBack && m_pBtnBack->m_hWnd&& ::IsWindow( ((CButton*)(m_pBtnBack))->m_hWnd)) {
    
            m_pBtnBack->EnableWindow(bValue);
            bDone=true;
        }
        return bDone;
    }
    
    bool CDialogSheet::EnableBtnNext(bool bValue) {
    
        bool bDone=false;
    
        if (m_pBtnNext && m_pBtnNext->m_hWnd&& ::IsWindow( ((CButton*)(m_pBtnNext))->m_hWnd)) {
    
            m_pBtnNext->EnableWindow(bValue);
            bDone=true;
        }
        return bDone;
    }
    

    7. So, das war's ersteinmal mit der CDialogSheet. Von dieser Klasse werden jetzt alle einzelnen Wizardseiten abgeleitet. Praktisch läuft das so ab. Mann erstellt für jede Seite einen neuen Dialog (Style:Child, Border:none), erstellt die Class und leitet sie manuel von der CDialogSheet ab (public). Dann ergänzt man den ClassConstructor in der CPP und H so ab :

    CDialogSheet1::CDialogSheet1(CWnd* pParent /*=NULL*/)
        : CDialogSheet(CDialogSheet1::IDD, pParent)
    {
        //{{AFX_DATA_INIT(CDialogSheet1)
            // NOTE: the ClassWizard will add member initialization here
        //}}AFX_DATA_INIT
    
        m_bBackEnabled=true;  // bei der ersten seite = false
        m_bNextEnabled=true;  // bei der letzten seite = false
    }
    

    8. Jetzt geht man zum letzten Schritt, der CDeineHauptDialogClass. In der *.H trägt man folgendes ein :

    #include "DialogSheet.h"    // Die Class von der die einzelnen seiten abgeleitet werden.
    #include "DialogSheet1.h"   // Die einzelnen seiten
    #include "DialogSheet2.h"
    #include "DialogSheet3.h"
    #include "DialogSheet4.h"
    #include "DialogSheet5.h"
    
    #define SHEETCOUNT 5  // Anzahl der Seiten.
    

    und in die Class selber trägt man dies ein :

    class CReportWizardDlg : public CDialog
    {
    friend class CDialogSheet;
    friend class CDialogSheet1;
    friend class CDialogSheet2;
    friend class CDialogSheet3;
    friend class CDialogSheet4;
    friend class CDialogSheet5;
    
    ...
    
    private:
        unsigned short m_ActiveSheet;   // Die aktive seite
    
        CDialogSheet* m_Sheets[SHEETCOUNT];  // Das Array mit den Seiten
    
        void ShowSheet(unsigned short iNr, bool bShow=true); Die Funktion zum Wechseln der Seiten.
    

    9. Man erstellt Membervariablen(Control) 1. von dem Static-Text (m_Position) und den Buttons: Zurück (m_BtnBack) und Weiter (m_BtnNext) und diese Funktionen (wenn sie nicht schon da sind) : OnBtnBack, OnBtnNext, OnInitDialog und manuel die ShowSheet Funktion :

    void CDeineHauptDialogClass::ShowSheet(unsigned short iNr, bool bShow) 
    {
        if ((iNr<SHEETCOUNT) && (iNr >= 0)) {
    
            if(bShow) {
    
                m_Sheets[iNr]->EnableBtnBack(m_Sheets[iNr]->bIsBack());
                m_Sheets[iNr]->EnableBtnNext(m_Sheets[iNr]->bIsNext());
    
                m_Sheets[iNr]->ShowWindow(SW_SHOWNORMAL); //Seite zeigen
    
            } else {
    
                m_Sheets[iNr]->ShowWindow(SW_HIDE);   //Seite verbergen
            }
        }
    }
    

    10. Nun kommt nach ein bißchen Code eintragen...

    In den Constructor tragt man dies ein :

    m_ActiveSheet=0;                         //Aktive Seite
        CDialogSheet::m_Dialog=this;             //Sich übergeben :-)
    
        m_Sheets[0]=new CDialogSheet1(this);     //Die Pointer setzen.
        m_Sheets[1]=new CDialogSheet2(this);
        m_Sheets[2]=new CDialogSheet3(this);
        m_Sheets[3]=new CDialogSheet4(this);
        m_Sheets[4]=new CDialogSheet5(this);
    

    In den Destructor :

    for (int i=0; i<SHEETCOUNT; i++) delete m_Sheets[i];  //Delete
    

    In OnInitDialog :

    CRect PosRect;                         
        m_Position.GetWindowRect(&PosRect);   //Vom Static-Text die Position abfragen
        ScreenToClient(&PosRect);  //In den dialog übersetzen
    
        m_Sheets[0]->SetButtonControl(&m_BtnBack, &m_BtnNext); Die Buttoncontrolle an die 1. Seite übergeben.
    
          //Nun die einzelnen Seiten Erstellen;
    
        if(!m_Sheets[0]->Create(CDialogSheet1::IDD, this)) {
            delete m_Sheets[0];
            m_Sheets[0]=NULL;
        }
    
        if(!m_Sheets[1]->Create(CDialogSheet2::IDD, this)) {
            delete m_Sheets[1];
            m_Sheets[1]=NULL;
        }
    
        if(!m_Sheets[2]->Create(CDialogSheet3::IDD, this)) {
            delete m_Sheets[2];
            m_Sheets[2]=NULL;
        }
    
        if(!m_Sheets[3]->Create(CDialogSheet4::IDD, this)) {
            delete m_Sheets[3];
            m_Sheets[3]=NULL;
        }
    
        if(!m_Sheets[4]->Create(CDialogSheet5::IDD, this)) {
            delete m_Sheets[4];
            m_Sheets[4]=NULL;
        }
    
        for (int i=0; i<SHEETCOUNT; i++) {
    
            m_Sheets[i]->SetWindowPos(      //Die Position an die von m_Position anpassen.
                &wndTop,
                PosRect.left,
                PosRect.top,
                PosRect.Width(),
                PosRect.Height(),
                SWP_HIDEWINDOW|SWP_NOSIZE
            );
        }
    
        ShowSheet(m_ActiveSheet, true);   // Die 1. Seite anzeigen.
    

    Ins OnBtnBack :

    if (m_ActiveSheet > 0) {
    
            ShowSheet(m_ActiveSheet,false);
            ShowSheet(--m_ActiveSheet,true);
        }
    

    Ins OnBtnNext :

    if (m_ActiveSheet < SHEETCOUNT) {
    
            ShowSheet(m_ActiveSheet,false);
            ShowSheet(++m_ActiveSheet,true);
        }
    

    *******************************************

    OK, das wars, ich hoffe ich habe nichts vergessen. Damit sollte der Wizard laufen. Wenn ich merke das ich was vergessen habe, trage ich das noch nach... Die anderen Sachen wie z.B. Speicherung der Daten und OnOK und OnCancel abfragen überlasse ich jedem selber, sonst ist das viel zu spezifisch...

    Nun jetzt mal eine frage an von mir : Wie lang kann ein CString werden? Ich habe was von 2GB gehört, stimmt das?



  • 😃 Ich habe mir damals soviel mühe gemacht, ich finde das sollte in die FAQ... 🙄 :p



  • Ich hätte da mal einen Link, alles auf Englisch aber man bekommt ein Schritt für Schritt Anweisung: http://www.codeguru.com/propertysheet/wiz2000.shtml


Anmelden zum Antworten