Kapitel 1         Eine Listbox erstellen und Dateiausgabe der Liste
1. Datei --> Neu --> Projekt
                           --> Vorlage MFC --> MFC-Anwendung
Name: BListbox
Projekt-Stil: MFC
Anwendungstyp: Auf Dialogfeldern basierend
MFC in einer statischen Bibliothek verwenden
Recourcesprache: Deutsch
UNICODE -Bibliotheken verwenden
Nach dem 'Fertigstellen' erscheint das Formular  BListbox mit den beiden Buttons OK und Abbrechen
Form 1
2. Wir entfernen den Button 'Abbrechen' und den Text TODO:...  durch Markieren und Rechtsklick --> Löschen
Den OK - Button lassen wir zunächst so stehen. Wir markieren Ihn und sehen rechts das Eigenschaften-Fenster.
Hier finden wir u.a. die Beschriftung des Buttons --> Caption: OK und die --> ID: IDOK.
Jetzt rufen wir mit Rechtsklick den Klassen-Assistent (MFC Class Wizard) auf. Unter Objekt-IDs sehen wir IDOK schwach markiert und in den Meldungen BN_CLICKED markiert.
Nachdem wir den Button 'Handler hinzufügen...' gedrückt haben und den Vorschlag für den Funktionsnamen angenommen haben, steht unter Memberfunktionen die neue Zeile
  OnBnClickedOk            IDOK           BN_CLICKED
Form 2
Wir haben damit in der Quelldatei BListboxDlg.cpp die neue Funktion OnBnClickedOk() eingefügt.
Über den Button 'Code bearbeiten' gelangen wir an die Stelle im Quelltext:

void CBListboxDlg::OnBnClickedOk()
{
    // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
    CDialogEx::OnOK();
}

Da wir unser Beispielsprogramm auf diese Art nicht beenden wollen, kommentieren wir die Exit-Funktion auch aus:   // CDialogEx::OnOK();
Wichtig: Wir bearbeiten anschließend den OK-Button noch einmal im Dialog-Fenster.
In der Übersicht links schalten wir auf den Reiter Resourcenansicht um
Form 3
und öffnen die Baumstruktur, bis der Ordner Dialog geöffnet ist. Jetzt können wir mit Doppelklick auf  IDD_BLISTBOX_DIALOG unsere Form wieder öffnen.
OK-Button in der Form markieren, Eigenschaften ändern:
                                   ID:  IDC_BEENDEN
                                   Caption:  Beenden
Focus auf Beenden-Button und mit Rechtsklick den Klassen-Assistenten öffnen,
IDC_BEENDEN   BN_CLICKED ist markiert.
Mit 'Handler hinzufügen...' erstellen wir die neue Beenden-Funktion mit dem Memberfunktionsnamen OnBeenden . Dann noch 'Übernehmen' anklicken und mit
'Code bearbeiten'  gelangen wir wieder in den Quellcode der Datei BListboxDlg.cpp . Hier fügen wir den vor auskommentierten Code ein:

void CBListboxDlg::OnBeenden()
{
    // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
    CDialogEx::OnOK();
}


>>Soweit die Vorarbeiten<<

3. Nun richten wir 2 Listboxen ein. Die erste Liste enthält ein Sortiment von Werkzeugen und die 2. Liste soll unsere Bestellliste werden.
Wir gehen dazu wieder in die Resourcenansicht und Klicken doppelt auf  IDD_BLISTBOX_DIALOG . Die Dialogform mit dem Beenden-Button ist wieder zur Ergänzung bereit.
Ganz rechts oben im Studio finden wir den Sticky-Knopf Toolbox bzw. geht es auch umständlicher von der oberen Menüleiste aus unter Ansicht zur Zeile Toolbox.  Der Dialog-Editor enthält alle graphischen Symbole für den Ausbau unserer Dialogform.
Wir platzieren die zwei Listboxen mit Klick auf 'List Box' untereinander  und geben Ihnen mit 'Static Text' eine Überschrift: 'Werkzeuge Sortiment:'   und  'Bestellliste:'
In der Sortimentsliste soll mehrfach ausgewählt werden, also tragen wir in den Eigenschaften ein:
ID:  IDC_WERKZEUGE        Selection:  Mehrfach
Die Bestellliste dient nur zur Übersicht, es soll nichts selektiert werden:
ID:  IDC_BESTELLUNG        Selection:  Einfach
Für die Bearbeitung benötigen wir noch 2 Knöpfe: Zusammenstellen, wenn die Auswahl in der Sortimentsliste abgeschossen werden soll und Speichern, wenn nach Prüfung der Bestellliste alles richtig ausgewählt wurde.
ID:  IDC_ZUSAMMENSTELLEN     Caption:  Zusammenstellen             und            ID:  IDC_SPEICHERN    Caption:  Speichern
Form 4

Für die beiden neuen Button müssen noch Funktionen eingerichtet werden.
Button 'Zusammenstellen' markieren, Klassen-Assistent aufrufen,  IDC_ZUSAMMENSTELLEN und BN_CLICKED sind markiert, jetzt den Button 'Handler hinzufügen...' drücken, dann geben wir der Memberfunktion den Namen: OnZusammenstellen .
Entsprechend für den Button 'Speichern'  den Memberfunktionsnamen OnSpeichern festlegen.
Nun können wir schon einmal 'probieren' , ob unser Projekt im Compiler ohne Fehler durchläuft und der Linker ein ablauffähiges Progamm herstellt:
Obere Menü-Zeile:  Erstellen -->  BListbox neu erstellen . Wenn Sie jetzt alles richtig gemacht haben, erscheint im Ausgabefenster des Studios:
========== Alles neu erstellen: 1 erfolgreich, Fehler bei 0, 0 übersprungen ==========

Dann können Sie das erste mal Ihr Programm starten mit Obere Menüzeile --> Debuggen --> Starten ohne Debugging  und die folgende Windows-Box erscheint:
Form 5
Wundern Sie sich nicht - Damit kann man natürlich noch nicht viel anfangen... Im Sortiment wird nichts zur Auswahl angeboten, beim Klick auf 'Zusammenstellen' passiert nichts und genauso wenig beim Klick auf 'Speichern'.

4. Am Anfang sollte im Werkzeug-Sortiment eine Liste verschiedener Werkzeuge erscheinen. Man könnte das u.a. so programmieren, dass durch ein Ladevorgang die aktuelle Angebotsliste geladen wird - aber wir wollen für
den Anfang einfach eine feste Liste erscheinen lassen:
Alles, was vor Start des Programms zusätzlich organisiert sein muß, wird in der Quelldatei BListboxDlg.cpp am Anfang initialisiert. Dazu ist die folgende Funktion bereitgestellt:
BOOL CBListboxDlg::OnInitDialog()
{
  ...
  ...
return TRUE;  // TRUE zurückgeben, wenn der Fokus nicht auf ein Steuerelement gesetzt wird
}

Suchen Sie den Kopf dieser Funktion in der Quelldatei. Etwas weiter tiefer finden Sie am Ende innerhalb der Funktion etwa die folgenden Zeilen:
    // Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt
    //  wenn das Hauptfenster der Anwendung kein Dialogfeld ist
    SetIcon(m_hIcon, TRUE);            // Großes Symbol verwenden
    SetIcon(m_hIcon, FALSE);        // Kleines Symbol verwenden

    // TODO: Hier zusätzliche Initialisierung einfügen

    return TRUE;  // TRUE zurückgeben, wenn der Fokus nicht auf ein Steuerelement gesetzt wird
}

Zwischen  // TODO:   und   return TRUE;  wird der zusätzliche Code zur Anfangsinitialisierung eingeschoben:
// ListBox Werkzeuge Sortiment
    //Ein Pointer pLB auf ein Datenfeld für die Listbox IDC_Werkzeuge wird deklariert
    CListBox * pLB = (CListBox*) GetDlgItem ( IDC_WERKZEUGE ) ;
   
    //Temporäre Stringfelder werden mit Daten gefüllt
    int i;
    CString ctmpk[5], ctmpw[5], ctmpz[21];
    ctmpk[0] = "Werkzeug-Tragekoffer";
    ctmpk[1] = "Steckschlüssel-Satz";
    ctmpk[2] = "Schraubendreher-Satz";
    ctmpk[3] = "Hebel-Kraftschneider";
    ctmpk[4] = "";


    ctmpz[0] = "Schlosserhammer";
    ctmpz[1] = "Wasserpumpenzange";
    ctmpz[2] = "Bolzenschneider";
    ctmpz[3] = "Gummi-Schonhammer";
    ctmpz[4] = "Tischkreissäge";
    ctmpz[5] = "Stemm- und Abbruchhammer";
    ctmpz[6] = "6-teiliges Maurer Set";
    ctmpz[7] = "Bau- und Montageschrauber";
    ctmpz[8] = "Elektro-Tacker";
    ctmpz[9] = "Hochdruckreiniger";
    ctmpz[10] = "Stufen-Stehleiter";
    ctmpz[11] = "Leiterhaken";
    ctmpz[12] = "Benzinmotorsäge";
    ctmpz[13] = "Elektro-Kettensäge";
    ctmpz[14] = "Baumschere";
    ctmpz[15] = "Elektro-Heckenschere";
    ctmpz[16] = "Benzin-Rasenmäher";
    ctmpz[17] = "";
    ctmpz[18] = "";
    ctmpz[19] = "";
    ctmpz[20] = "Universal-Bohrfutterschlüssel";


    //Hier erfolgt die Einspeisung der temporären Datenzeilen in die Listbox
    for(i=0;i<5;i++)
    {
   
    CListBox * pLB = (CListBox*) GetDlgItem ( IDC_WERKZEUGE ) ;
    pLB -> InsertString ( -1 , ctmpk[i] ) ;
    }

    //Hier erfolgt eine weitere Einspeisung der temporären Datenzeilen in die Listbox
    for(i=0;i<21;i++)
    {
   
    CListBox * pLB = (CListBox*) GetDlgItem ( IDC_WERKZEUGE ) ;
    pLB -> InsertString ( -1 , ctmpz[i] ) ;
    }


5. Nun werden die Funktionen, die hinter den Button 'Zusammenstellen'  und  'Speichern'  stehen ausgefüllt.
Zuvor brauchen wir noch eine Benutzdefinierte Variable für die Feststellung der Speicherung der Zusammenstellung.
Dazu rufen wir den Klassen-Assistenten auf  und gehen auf den Reiter Membervariablen.
Button 'Benutzerdefiniert hinzufügen...' klicken und eingeben:
Typ:  bool           Member:  m_Bwer_speichern
Jetzt ergänzen wir am Ende den Code zur Anfangsinitialisierung mit:
// Variable zur Kontrolle über das Abspeichern der Bestellung
    m_Bwer_speichern = FALSE;


Zum Button 'Zusammenstellen' gehört die Funktion  OnZusammenstellen()
Folgenden Code tragen wir ein:


    //Wir besorgen uns einen Zeiger p_Best auf die Bestellungs-ListBox.
    //Diese List Box muß zuerst geleert werden für den Fall,
    //daß der Benutzer die Schaltfläche "Zusammenstellen"
    //mehrfach anklickt:

    CListBox * p_Best = (CListBox * ) GetDlgItem ( IDC_BESTELLUNG ) ;
    p_Best -> ResetContent () ;

//p_Best -> InsertString ( -1 , _T("Ihre Bestellung enthält ") ) ;

// Menge der Werkzeuge aus der ListBox abholen

    CListBox * p_Werk = (CListBox *) GetDlgItem ( IDC_WERKZEUGE ) ;
    int i , anzahl_werkzeuge, * p_index ;
    CString werkzeug ;

    anzahl_werkzeuge = p_Werk -> GetSelCount () ;

    if ( anzahl_werkzeuge > 0 )
    {    p_Best -> InsertString ( -1 , _T("Zur Bestellung gehören:") ) ;
        p_index = (int *) malloc ( anzahl_werkzeuge * sizeof ( int ) ) ;
        p_Werk -> GetSelItems ( anzahl_werkzeuge , p_index ) ;

// Übertragung der zusammengestellten Werkzeuge in die Listbox Bestellung
        for ( i = 0 ; i < anzahl_werkzeuge ; i ++ )
        {    p_Werk -> GetText( *(p_index+i), werkzeug ) ;
            p_Best -> InsertString ( -1 , werkzeug ) ;
        }

        free ( p_index ) ;
    }
    else
        p_Best -> InsertString ( -1 , _T("Sie haben keine weiteren Werkzeuge bestellt") ) ;

// Variable zur Kontrolle über das Abspeichern der Bestellung
    m_Bwer_speichern = TRUE;


Die Dateiausgabe ähnelt im Ablauf der anderer Programmiersprachen wie zum Beispiel C.

Zum Button 'Speichern' gehört die Funktion OnSpeichern()
Folgenden Code tragen wir ein:

    CFileDialog file_dlg (    FALSE ) ;   // FALSE sagt File Save as
    // 1. Parameter reicht - Rest hat default-Werte

    int result = file_dlg . DoModal () ;

    if ( result == IDOK )
    {    CString file_name = file_dlg . GetPathName( ) ;

        CStdioFile out_file ;

        //out_file ist der interne (von uns im Programm benutzte)Dateiname,
        //file_name enthält den (vom Betriebssystem auf der Festplatte benutzten)
        //externen Dateinamen.
      if ( out_file . Open( file_name , CFile::modeCreate | CFile::modeWrite ) )

        {   
          CListBox * p_Best = (CListBox * ) GetDlgItem ( IDC_BESTELLUNG ) ;
            int i, anzahl_zeilen = p_Best -> GetCount() ;
            CString zeile ;

            for ( i = 0 ; i < anzahl_zeilen ; i ++ )
            {    p_Best -> GetText ( i , zeile ) ;
                out_file . WriteString ( zeile + "\n" ) ;
            }
           
            out_file . Close () ;
            MessageBox (_T("Ihre Bestellung wurde gespeichert!"),
                _T("Werkzeugeversand - Wir danken für Ihre Bestellung"),
                MB_ICONINFORMATION  );
          // Variable zur Kontrolle über das Abspeichern der Bestellung
          m_Bwer_speichern = FALSE;

        }
        else
            MessageBox (_T("Fehler beim Open - Speichern wurde abgebrochen") ) ;
    }
    else
        MessageBox (_T("Speichern wurde abgebrochen") ,
                _T("Werkzeugeversand") , MB_ICONERROR ) ;

Nun können wir wieder 'probieren' , ob unser Projekt im Compiler ohne Fehler durchläuft und der Linker ein ablauffähiges Progamm herstellt:
Obere Menü-Zeile:  Erstellen -->  BListbox neu erstellen . Wenn Sie jetzt alles richtig gemacht haben, erscheint im Ausgabefenster des Studios:
========== Alles neu erstellen: 1 erfolgreich, Fehler bei 0, 0 übersprungen ==========

Dann können Sie das erste mal Ihr Programm starten mit Obere Menüzeile --> Debuggen --> Starten ohne Debugging  und die folgende Windows-Box erscheint:
Form 6