|
|
|
|
|
| Steuerelemente - Listenfelder |
Hier stehen Informationen zum Umgang mit dem Listenfeld (ListBox). Ein Listenfeld lässt sich ähnlich handhaben wie ein Kombinationsfeld, nur bietet es wesentlich mehr Möglichkeiten. In den Eigenschaften ist voreingestellt das die Listeneinträge automatisch sortiert werden. Die zugehörige Klasse lautet: CListBox.
- Automatisches Scrolling im Listenfeld - SetCaretIndex()
- Einträge im Listenfeld suchen - FindString(), FindStringExact(), SelectString
- Inhalt von Datenträgern in ein Listenfeld eintragen – Dir()
- Listenfeldinhalt löschen - ResetContent()
- Mehrfachauswahl mit dem Listenfeld
- Nachrichten für Listenfelder
- Schriftart in einem Listenfeld ändern - SetFont()
- Zeilen in einem Listenfeld markieren – SetCurSel()
- Zeilen in einem Listenfeld löschen – DeleteString()
- Zeilen in ein Listenfeld einfügen –
AddString()
- Zeilen in ein Listenfeld einfügen – InsertString()
- Zeilenanzahl in einem Listenfeld ermitteln – GetCount()
- Zeileninhalt aus einem Listenfeld ermitteln – GetText()
- Zeilennummer ermitteln - GetCurSel()
Hat man ein Listenfeld mit einer vertikalen Scrolleiste und fügt diesem Einträge hinzu, werden diese Einträge standardmässig nicht mitgescrollt. Um die zuletzt eingefügten Einträge zu sehen muss man also selbst nach unten scrollen. Im folgenden Beispiel wird eine Anwendung erstellt in der man mit Hilfe eines Button ein Listenfeld mit Einträgen füllt. Dabei wird erst gezeigt wie das Listenfeld standardmässig reagiert und danach wie man das automatische Scrollen einfügt.
Beispiel:
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: AutoScrolling und entferne alle vorhandenen Elemente
- Füge ein Textfeld für die Überschrift ein und ändere den Titel in: Auto Scrolling im Listenfeld
- Füge ein Listenfeld in die eben erstellte Anwendung ein und behalte die vorgegebene ID (IDC_LIST1). Gehe in die Eigenschaften des Listenfeld und deaktiviere das Attribut: Sortieren. Aktiviere aber das Attribut: Vertik. Bildlauf
- Füge ein Button ein, behalte die vorgegebene ID (IDC_BUTTON1) und ändere die Titel in Listenfeld füllen
- Füge eine Member-Variable für das Listenfeld ein - Kategorie: Control, Variablentyp: CListBox, Name: m_ctlListBox1
- Klicke doppelt auf den Button um eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht
einzufügen und übernehme den vorgeschlagenen Funktionsnamen
- Füge folgenden Code in die eben erstellten Funktionen ein:
void CAutoScrollingDlg::OnButton1()
{
CString str_help;
// Listbox mit 20 Zeilen füllen
for(int i=1;i<=20;i++)
{
str_help.Format("%d",i);
// Zeile in Listbox einfügen
m_ctlListBox1.AddString("Test Zeile: " + str_help);
// Listbox aktualisieren
UpdateWindow();
// Kurze Pause einfügen
Sleep(500);
}
}
Beschreibung:
Nachdem man auf den Button geklickt hat wird das Listenfeld mit Einträgen gefüllt und die vertikale Scrolleiste erscheint. Wie man sieht wird immer der oberste Eintrag angezeigt (Test Zeile: 1) und wir müssen von Hand nach unten scrollen, um den letzten Eintrag sehen zu können.
Wir möchten jetzt aber immer den zuletzt eingefügten Eintrag sehen, in unserem Beispiel ist das immer der unterste Eintrag, da wir das automatische Sortieren abgestellt haben.
-
Ändere den Code folgendermaßen, um das automatische Scrollen einzufügen:
void CAutoScrollingDlg::OnButton1()
{
CString str_help;
// Listbox mit 20 zeilen füllen
for(int i=1;i<=20;i++)
{
str_help.Format("%d",i);
// Zeile in Listbox einfügen
m_ctlListBox1.AddString("Test Zeile: " + str_help);
// Listbox aktualisieren
UpdateWindow();
// Anzahl der Zeilen im Listenfeld auslesen
int zeile = m_ctlListBox1.GetCount();
// In aktuelle Zeile scrollen
m_ctlListBox1.SetCaretIndex(zeile);
// Kurze Pause einfügen
Sleep(500);
}
}
Beschreibung:
Wird jetzt der Button angeklickt, wird immer direkt die letzte eingefügte Zeile angezeigt. Dazu wird die altuelle Zeilenanzahl im Listenfeld ausgelesen und dann die letzte Zeile mit Hilfe der Funktion SetCaretIndex() angezeigt.
Soll die letzte eingefügte Zeile auch gleich markiert sein, dann ändere die Zeile:
m_ctlListBox1.SetCaretIndex(zeile);
in:
m_ctlListBox1.SetCurSel(zeile-1);
Und das sieht so aus:
Downloads: AutoScrolling.exe - Gesamtes Projekt
Mit Hilfe der Funktion FindString(), FindStringExact und SelectString kann man ein Listenfeld nach einem String durchsuchen. Alle Funktionen erwarten als Argumente einen ganzzahligen Wert, an welcher Stelle sie ihre Suche beginnen sollen und einen String, in dem das Suchwort steht. Als Rückgabewert erhält man die Zeilennummer in der eine Übereinstimmung vorhanden ist. Wurde keine Übereinstimmung gefunden, bekommt man den Wert -1 zurück. Das funktioniert so:
int nZeilennummer = m_ctlListBox1.FindString(index, string);
int nZeilennummer = m_ctlListBox1.FindStringExact(index, string);
int nZeilennummer = m_ctlListBox1.SelectString(index, string);
Beispiel:
Im folgenden Beispiel wird der vorgegebene Pfad (C:\Windows) im Listenfeld angezeigt. Nachdem man einen Buchstaben oder ein Suchwort eingegeben hat und einen der drei Buttons drückt, beginnt die Suche danach und das Ergebnis wird ausgegeben. Sollte keine Eingabe ins Eingabefeld gemacht worden sein, wird dieser Zustand abgefangen.
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: FindString und entferne alle vorhandenen Elemente. Schau dir die unten stehende Abbildung an, um zu sehen wie die Steuerelemente angeordnet werden
- Füge ein Textfeld für die Überschrift ein. Ändere den Titel in: Dateien suchen - FindString(), FindStringExact(), SelectString()
- Füge ein Listenfeld in die eben erstellte Anwendung ein und behalte die vorgegebene ID (IDC_LIST1)
- Füge drei Buttons ein, ändere die IDs in: (IDC_FINDSTRING, IDC_FINDSTRINGEXACT, IDC_SELECTSTRING) und ändere die Titel in FindString, FindStringExact und SelectString
- Füge ein Eingabefeld hinzu und behalte die vorgegebene ID (IDC_EDIT1)
- Füge noch ein Textfeld unter das Eingabefeld ein, entferne den Titel und ändere die ID in (IDC_STATIC1)
- Füge eine Variable in die Dialogklasse (CFindStringDlg) ein - Variablentyp: int, Variablenname: i_zaehler, Zugriffstatus: Public
- Füge eine Member-Variable für das Listenfeld ein - Kategorie: Control, Variablentyp: CListBox, Name: m_ctlListBox1
- Füge ausserdem noch eine Member-Variable für das Eingabefeld ein - Kategorie: Wert, Variablentyp: CString, Name: m_strEdit1.
- Klicke doppelt auf jeden Button, um für jeden ein Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht
einzufügen und übernehme die vorgeschlagenen Funktionsnamen
- Füge folgenden Code in die eben erstellten Funktionen ein:
void CFindStringDlg::OnFindstring()
{
// Steuerelemente aktualisieren
UpdateData(TRUE);
// Benötigte Variablen erstellen
int i_zeile;
CString str_help;
// Nach eingegebenen String suchen
i_zeile=m_ctlListBox1.FindString(i_zaehler, m_strEdit1);
// Wurde ein passender Eintrag gefunden?
if(i_zeile >= 0)
{
// Zähler merkt sich die aktuelle Zeilenzahl
i_zaehler = i_zeile;
// Gefundenen Text auslesen und Text ausgeben
m_ctlListBox1.GetText(i_zeile, str_help);
SetDlgItemText(IDC_STATIC1, "Gefunden: " + str_help);
}
// Es wurde kein passender Eintrag gefunden
else
SetDlgItemText(IDC_STATIC1, "Nichts gefunden") ;
}
void CFindStringDlg::OnFindstringexact()
{
// Steuerelemente aktualisieren
UpdateData(TRUE);
// Benötigte Variablen erstellen
int i_zeile;
CString str_help;
// Wenn etwas in das Eingabefeld eingegeben wurde...
if(m_strEdit1 != "")
{
// Nach eingegebenen String suchen
i_zeile = m_ctlListBox1.FindStringExact( i_zaehler, m_strEdit1);
// Wurde ein passender Eintrag gefunden?
if(i_zeile >= 0)
{
str_help.Format("%d", i_zeile);
SetDlgItemText(IDC_STATIC1, "Gefunden in der : " + str_help + ". Zeile") ;
}
else
SetDlgItemText(IDC_STATIC1, "Nichts gefunden");
}
}
void CFindStringDlg::OnSelectstring()
{
// Steuerelemente aktualisieren
UpdateData(TRUE);
// Benötigte Variablen erstellen
int i_zeile;
CString str_help;
// Nach eingegebenen String suchen
i_zeile=m_ctlListBox1.SelectString(i_zaehler, m_strEdit1);
// Wurde ein passender Eintrag gefunden?
if(i_zeile >= 0)
{
// Zähler merkt sich die aktuelle Zeilenzahl
i_zaehler = i_zeile;
// Gefundenen Text auslesen und Text ausgeben
m_ctlListBox1.GetText(i_zeile, str_help);
SetDlgItemText(IDC_STATIC1, "Gefunden: " + str_help);
}
// Es wurde kein passender Eintrag gefunden
else
SetDlgItemText(IDC_STATIC1, "Nichts gefunden") ;
}
- Füge jetzt noch folgenden Code in die OnInitDialog() Funktion ein, um Elemente in das Listenfeld einzufügen und den Zähler zu initialisieren
BOOL CFindStringDlg::OnInitDialog()
{
...
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
m_ctlListBox1.Dir(DDL_READWRITE | DDL_HIDDEN | DDL_SYSTEM | DDL_ARCHIVE, "C:\\WINDOWS\\*.*");
i_zaehler=0;
return TRUE;
}
Beschreibung:
FindString gibt den Index des ersten Eintrags, dessen Anfang mit dem Suchbegriff übereinstimmt zurück. Bei FindStringExact muss der Suchbegriff mit dem Eintrag vollständig übereinstimmen.
SelectString arbeitet wie FindString, selektiert den String aber zusätzlich und zeigt ihn damit in der Liste an.
Downloads: FindString.exe - Gesamtes Projekt
Mit Hilfe der Funktion Dir() füllt man ein Listenfeld mit Dateien die den angegebenen Attributen entsprechen. Folgende Attribute stehen zur Auswahl:
| Attribut |
Beschreibung |
| DDL_ARCHIVE |
zeigt archivierte Dateien an |
| DDL_DIRECTORY |
zeigt Unterverzeichnisse mit an(Namen stehen in eckigen Klammern) |
| DDL_DRIVES |
zeigt Laufwerke mit an. Auflistung als [-x-] |
| DDL_HIDDEN |
zeigt versteckte Dateien an |
| DDL_READONLY |
zeigt "read-only" Dateien an |
| DDL_READWRITE |
zeigt "read-write" Dateien an |
| DDL_SYSTEM |
zeigt "system" Dateien an |
| DDL_EXCLUSIVE |
zeigt nur Dateien mit den angegeben Attributen an |
Die Funktion bekommt als Argumente eins oder mehrere der obenstehenden Attribute und den auszulesenden Pfad übergeben. Wenn man mehrere Attribute angeben möchte, dann werden sie mit dem Zeichen | getrennt.
Beispiel:
Im folgenden Beispiel wird eine Anwendung erstellt die beim Klick auf den Button Daten lesen das Listenfeld mit dem angegebenen Pfad füllt. Durch die Angabe mehrerer Attribute werden sämtliche Dateien aus dem angegebenen Verzeichnis (C:\Windows) ausgelesen
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Dir und entferne alle vorhandenen Elemente. Schau dir die unten stehenden Abbildung an, um zu sehen wie die Steuerelemente angeordnet werden
- Füge ein Textfeld für die Überschrift ein. Ändere den Titel in: Dateien von Datenträgern in das Listenfeld eintragen - Dir()
- Füge ein Listenfeld ein und behalte die vorgegebene ID (IDC_LIST1)
- Füge ein Button ein, behalte die vorgebene ID (IDC_BUTTON1) und ändere die Titel in Daten lesen
- Füge eine Member-Variable für das Listenfeld ein - Kategorie: Control, Variablentyp: CListBox, Name: m_ctlListBox1
- Klicke doppelt auf den Button um eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht
einzufügen und übernehme den vorgeschlagenen Funktionsnamen
- Füge folgenden Code in die eben erstellte Funktion ein:
void CDirDlg::OnButton1()
{
// Listenfeldinhalt löschen
m_ctlListBox1.ResetContent();
// Steuerelemente aktualisiern
UpdateData(TRUE);
// Alle Dateien aus C:\Windows anzeigen
m_ctlListBox1.Dir(DDL_READWRITE | DDL_HIDDEN | DDL_SYSTEM | DDL_ARCHIVE, "C:\\WINDOWS\\*.*");
}
Downloads: Dir.exe - Gesamtes Projekt
Mit Hilfe der Funktion ResetContent() kann man den kompletten Inhalt eines Listenfeldes löschen.
Beispiel:
Im folgenden Beispiel wird eine Anwendung erstellt die beim Klick auf den Button Elemente einfügen das Listenfeld füllt. Klickt man dann auf den Button Inhalt löschen wird der Inhalt des Listenfeldes komplett gelöscht.
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: ResetContent und entferne alle vorhandenen Elemente. Schau dir die unten stehenden Abbildung an, um zu sehen wie die Steuerelemente angeordnet werden
- Füge ein Textfeld für die Überschrift ein. Ändere den Titel in: Listenfeldinhalt löschen - ResetContent()
- Füge ein Listenfeld in die eben erstellte Anwendung ein und behalte die vorgegebene ID (IDC_LIST1)
- Füge zwei Buttons ein, behalte die vorgeschlagenen IDs (IDC_BUTTON1, IDC_BUTTON2) und ändere die Titel in Elemente einfügen und Inhalt löschen
- Füge eine Member-Variable für das Listenfeld ein - Kategorie: Control, Variablentyp: CListBox, Name: m_ctlListBox1
- Klicke doppelt auf jeden Button um für jeden eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht
einzufügen und übernehme die vorgeschlagenen Funktionsnamen
- Füge folgenden Code in die eben erstellten Funktionen ein:
void CResetContentDlg::OnButton1()
{
// Inhalt einfügen
m_ctlListBox1.AddString("Pizza");
m_ctlListBox1.AddString("Nudeln");
m_ctlListBox1.AddString("Reis");
m_ctlListBox1.AddString("Schnitzel");
}
void CResetContentDlg::OnButton2()
{
// Inhalt löschen
m_ctlListBox1.ResetContent();
}
Downloads: ResetContent.exe - Gesamtes Projekt
Standardmässig kann man in Listenfeldern nur einen Eintrag auswählen. Mit der richtigen Einstellung ist es aber auch möglich mehrere Einträge auszuwählen. Gehe dazu in die Eigenschaften des Listenfeldes und stelle unter Auswahl(Selection): Mehrfach(Multiple) ein.
Man kann für das Listenfeld Nachrichtenbehandlungsroutinen (Funktionen) für verschiedene Nachrichten erstellen. Das Listenfeld reagiert dann auf diesen Zustand. Es folgt eine Übersicht der auswählbaren Nachrichten und darunter Beispiele zu den wichtigsten Nachrichten:
| Nachricht |
Beschreibung |
| LBN_SELCHANGE |
Reagiert sowie ein Eintrag geändert wird |
| LBN_DBLCLICK |
Reagiert auf einen Doppelklick |
| LBN_ERRSPACE |
Nicht genügend Speicherplatz (out of memory) |
| LBN_KILLFOCUS |
Reagiert auf Verlust des Eingabefocus |
| LBN_SELCANCEL |
Reagiert auf eine abgebrochene Markierung |
| LBN_SETFOCUS |
Reagiert auf Erhalt des Eingabefocus |
LBN_SELCHANGE
Diese Nachricht wird ausgelöst, wenn der Benutzer etwas in dem Listenfeld auswählt. Genau das testen wir im folgendem Beispiel.
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Selchange und entferne alle vorhandenen Elemente. Schau dir die unten stehenden Abbildung an, um zu sehen wie die Steuerelemente angeordnet werden
- Füge ein Textfeld für die Überschrift ein. Ändere den Titel in: Nachrichten - LBN_SELCHANGE
- Füge ein Listenfeld in die eben erstellte Anwendung ein und behalte die vorgegebene ID (IDC_LIST1)
- Füge ein Eingabefeld hinzu und behalte die vorgegebene ID (IDC_EDIT1)
- Füge eine Member-Variable für das Listenfeld ein - Kategorie: Control, Variablentyp: CListBox, Name: m_ctlListBox1
- Füge ausserdem noch eine Member-Variable für das Eingabefeld ein - Kategorie: Wert, Variablentyp: CString, Name: m_strEdit1.
- Füge für das Listenfeld eine Nachrichtenbehandlungsroutine (Funktion) für die Nachricht LBN_SELCHANGE ein. Übernehme den vorgeschlagenen Funktionsnamen
- Füge folgenden Code in die eben erstellten Funktionen ein:
void CSelchangeDlg::OnSelchangeList1()
{
// Ausgewählte Zeile ermitteln
int i_index = m_ctlListBox1.GetCurSel();
// Zugehöriger Text ausgeben
m_ctlListBox1.GetText(i_index, m_strEdit1);
// Eingabefeld aktualisieren
UpdateData(FALSE);
}
- Füge jetzt noch folgenden Code in die OnInitDialog() Funktion ein, um Elemente in das Listenfeld einzufügen
BOOL CSelchangeDlg::OnInitDialog()
{
...
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
// Der ListBox Elemente zufügen:
m_ctlListBox1.AddString("Diana");
m_ctlListBox1.AddString("Jessi");
m_ctlListBox1.AddString("Nina");
m_ctlListBox1.AddString("Zoe");
return TRUE;
}
LBN_DBLCLICK
Diese Nachricht wird ausgelöst, wenn der Benutzer einen Doppelklick im Eingabefeld ausführt. Wenn du das Beispiel der Nachricht LBN_SELCHANGE ausgeführt hast, dann kannst du es jetzt weiter verwenden, ansonsten erstelle eine neue Anwendung nach obenstehender Beschreibung.
void CSelchangeDlg::OnDblclkList1()
{
CString str_help;
// Ausgewählte Zeile ermitteln
int i_index = m_ctlListBox1.GetCurSel();
// Zugehöriger Text ausgeben
m_ctlListBox1.GetText(i_index, str_help);
// Eingabefeld aktualisieren
MessageBox(str_help);
}
Downloads: Selchange.exe - Gesamtes Projekt
Will man in einem Steuerelement eine andere Schriftart als die Standardschrift nutzen, muss man die gewünschte Schriftart mit Hilfe von CreateFont() festlegen und mit der Funktion SetFont() dem Steuerelement zuweisen.
Ein Beispiel wie man die Schriftart für Steuerelemente ändert findest du hier: Schriftart für Steuerelemente ändern
Mit Hilfe der Funktion SetCurSel() kann man eine Zeile in einem Listenfeld markieren. Als Argument erwartet die Funktion die zu markierende Zeilennummer.
Beispiel:
Im folgenden Beispiel wird eine Anwendung erstellt die mit Hilfe der Funktion SetCurSel() direkt nach dem Start der Anwendung eine Zeile im Listenfeld markiert. Zusätzlich ist es möglich eine Zeile in ein Eingabefeld einzugeben, die markiert werden soll.
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: SetCurSel und entferne alle vorhandenen Elemente. Schau dir die unten stehenden Abbildung an, um zu sehen wie die Steuerelemente angeordnet werden
- Füge ein Textfeld für die Überschrift ein. Ändere den Titel in: Zeile markieren – SetCurSel()
- Füge ein Listenfeld in die eben erstellte Anwendung ein und behalte die vorgegebene ID (IDC_LIST1)
- Füge ein Eingabefeld unter das Listenfeld ein und behalte die vorgegebene ID (IDC_EDIT1)
- Füge daneben ein Button ein, behalte die vorgegebene ID (IDC_BUTTON1), aber ändere den Titel in: Zeile markieren
- Füge eine Member-Variable für das Eingabefeld ein - Kategorie: Wert, Variablentyp: int, Name: m_nEdit1
- Füge eine Member-Variable für das Listenfeld ein - Kategorie: Control, Variablentyp: CListBox, Name: m_ctlListBox1
- Klicke doppelt auf den Button um eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht einzufügen und übernehme den vorgegebenen Funktionsnamen
- Füge folgenden Code in die eben erstellte Funktion ein:
void CSetCurSelDlg::OnButton1()
{
// Steuerelement Variable m_nEdit aktualisieren
UpdateData(TRUE);
// Eingegebene Zeile markieren
m_ctlListBox1.SetCurSel(m_nEdit1);
}
- Füge jetzt noch folgenden Code in die OnInitDialog() Funktion ein, um Elemente in das Listenfeld einzufügen. Ausserdem wird mit Hilfe der Funktion SetCurSel() direkt beim Start der Anwendung die zweite Zeile markiert
BOOL CSetCurSelDlg::OnInitDialog()
{
...
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
// Listenfeld füllen
m_ctlListBox1.AddString("Rot");
m_ctlListBox1.AddString("Blau");
m_ctlListBox1.AddString("Gelb");
m_ctlListBox1.AddString("Grün");
// Zeile "Gelb" markieren
m_ctlListBox1.SetCurSel(1);
return TRUE;
}
Downloads: SetCurSel.exe - Gesamtes Projekt
Mit Hilfe der Funktion DeleteString() kann man eine Zeile im Listenfeld löschen. Die Funktion erwartet das man ihr die Zeilennumer übergibt, die man löschen möchte. Möchte man eine vom Benutzer ausgewählte Zeile löschen, braucht man diese nur mit der Funktion GetCurSel() auslesen. Das Ergebnis übergibt man dann der Funktion DeleteString().
Beispiel:
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: DeleteString und entferne alle vorhandenen Elemente. Schau dir die unten stehenden Abbildung an, um zu sehen wie die Steuerelemente angeordnet werden
- Füge ein Textfeld für die Überschrift ein. Ändere den Titel in: Ein Element im Listenfeld löschen – DeleteString()
- Füge ein Listenfeld ein und behalte die vorgeschlagene ID (IDC_LIST1)
- Füge ein Textfeldfeld ein, entferne den Titel und ändere die ID in (IDC_STATIC1)
- Füge ein Button ein, behalte die vorgeschlagene ID (IDC_BUTTON1) und ändere den Titel in Auswahl entfernen
- Füge eine Member-Variable für das Listenfeld ein - Kategorie: Control, Variablentyp: CListBox, Name: m_ctlListBox1
- Klicke doppelt auf den Button um eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht einzufügen und übernehme den vorgeschlagenen Funktionsnamen
- Füge folgenden Code in die eben erstellte Funktion ein:
void CList2Dlg::OnButton1()
{
// Benötigte Variablen erstellen
int i_auswahl; // Für ausgewähltes Listenelement
CString help_str; // Für die Textausgabe
// Auswahl im Listenfeld ermitteln. Das erste Element
// hat den Index 0, das Zweite 1 usw
i_auswahl = m_ctlListBox1.GetCurSel();
// Wenn eine Zeile ausgewählt wurde, lösche sie
if(i_auswahl>=0)
{
// Listenelement löschen
m_ctlListBox1.DeleteString(i_auswahl);
// int in String wandeln
help_str.Format("%d", i_auswahl);
// Ergebnis ausgeben
SetDlgItemText(IDC_STATIC1, "Das Listenelement " + help_str + " wurde entfernt!");
}
else
SetDlgItemText(IDC_STATIC1, "Es wurde nichts ausgewählt!");
}
- Füge jetzt noch folgenden Code in die OnInitDialog() Funktion ein, um Elemente in das Listenfeld einzufügen
BOOL CList2Dlg::OnInitDialog()
{
...
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
// Der ListBox Elemente zufügen:
m_ctlListBox1.AddString("VW");
m_ctlListBox1.AddString("Audi");
m_ctlListBox1.AddString("Honda");
m_ctlListBox1.AddString("BMW");
m_ctlListBox1.AddString("Peugeot");
m_ctlListBox1.AddString("Renault");
m_ctlListBox1.AddString("Opel");
return TRUE;
}
Gleiches Beispiel mit Zeiger
Das gleiche Ergebnis bekommt man, wenn man anstatt der Listenfeld-Variable einen Zeiger verwendet. Der Code für die Funktionen würde so aussehen:
void CList2Dlg::OnButton1()
{
// Benötigte Variablen erstellen
int i_auswahl; // Für ausgewähltes Listenelement
CString help_str; // Für die Textausgabe
CListBox *pListBox = (CListBox *)GetDlgItem(IDC_LIST1); // Zeiger auf Listenfeld
// Auswahl im Listenfeld ermitteln. Das erste Element
// hat den Index 0, das Zweite 1 usw
i_auswahl = pListBox->GetCurSel();
// Wenn eine Zeile ausgewählt wurde, lösche sie
if(i_auswahl>=0)
{
// Listenelement löschen
pListBox->DeleteString(i_auswahl);
// int in String wandeln
help_str.Format("%d", i_auswahl);
// Ergebnis ausgeben
SetDlgItemText(IDC_STATIC1, "Das Listenelement " + help_str + " wurde entfernt!");
}
else
SetDlgItemText(IDC_STATIC1, "Es wurde nichts ausgewählt!");
}
BOOL CList2Dlg::OnInitDialog()
{
...
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
// Der ListBox Elemente zufügen:
CListBox *pListBox = (CListBox *)GetDlgItem(IDC_LIST1); // Zeiger auf Listenfeld
pListBox->AddString("Audi");
pListBox->AddString("Honda");
pListBox->AddString("BMW");
pListBox->AddString("Peugeot");
pListBox->AddString("Renault");
pListBox->AddString("Opel");
pListBox->AddString("VW");
return TRUE;
}
Downloads: DeleteString.exe - Gesamtes Projekt
Mit Hilfe der Funktion AddString() kann man dem Listenfeld einen Eintrag hinzufügen. Als Argument erwartet die Funktion einen String. Im Unterschied zur Funktion InsertString kann man mit AddString nicht festlegen in welcher Zeile der Eintrag hinzugefügt werden soll. Die eingegebene Zeile erscheint bei eingeschalteter automatischer Sortierung sortiert im Listenfeld, ohne automatisches Sortieren immer an unterster Stelle im Listenfeld.
Beispiel:
Im folgenden Beispiel wird eine Anwendung erstellt die beim Klick auf den Button einen eingegebenen String aus einem Eingabefeld ausliest und in ein Listenfeld einfügt. Sollte nichts im Eingabefeld stehen, wird der Benutzer darauf hingewiesen.
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: AddString und entferne alle vorhandenen Elemente. Schau dir die unten stehenden Abbildung an, um zu sehen wie die Steuerelemente angeordnet werden
- Füge ein Textfeld für die Überschrift ein. Ändere den Titel in: Listenelement einfügen – AddString()
- Füge ein Listenfeld in die eben erstellte Anwendung ein und behalte die vorgegebene ID (IDC_LIST1)
- Füge ein Eingabefeld in die eben erstellte Anwendung ein, behalte die vorgegebene ID (IDC_EDIT1)
- Füge ein Button ein, behalte die vorgegebene ID (IDC_BUTTON1) und ändere den Titel in Einfügen
- Füge eine Member-Variable für das Listenfeld ein - Kategorie: Control, Variablentyp: CListBox, Name: m_ctlListBox1
- Klicke doppelt auf den Button, um eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht einzufügen und übernehme den vorgeschlagenen Funktionsnamen
- Füge folgenden Code in die eben erstellte Funktion ein:
void CAddStringDlg::OnButton1()
{
// Steuerelemente aktualisieren
UpdateData(TRUE);
// Es wurde nichts in das Eingabefeld eingegeben!
if(m_strEdit1 == "")
MessageBox("Nichts eingegeben!");
// Es wurde etwas eingegeben, Text in Listenfeld einfügen
else
m_ctlListBox1.AddString(m_strEdit1);
}
Listenfeld initialisieren
Möchte man das Listenfeld direkt beim Programmstart füllen, muss dies in der OnInitDialog() Funktion geschehen.
BOOL CAddStringDlg::OnInitDialog()
{
...
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
// Der ListBox Elemente hinzufügen:
m_ctlListBox1.AddString("Auto-Eintrag 1");
m_ctlListBox1.AddString("Auto-Eintrag 2");
m_ctlListBox1.AddString("Auto-Eintrag 3");
return TRUE;
}
Downloads: AddString.exe - Gesamtes Projekt
Mit Hilfe der Funktion InsertString() kann man, wie auch mit der Funktion AddString() dem Listenfeld Einträge hinzufügen. Der Unterschied zur Funktion AddString() besteht darin, das man mit dieser Funktion zusätzlich zum String noch eine Zeilennummer übergibt, wohin der Eintrag eingefügt werden soll.
Als Argumente erwartet die Funktion die Zeilennummer und einen String. Denke daran das ab 0 gezählt wird. Übergibt man als ersten Parameter -1 würde dies bedeuten, dass die Zeile am Ende der vorhandenen Zeilen eingefügt werden soll.
Beispiel:
Im folgenden Beispiel hat man die Möglichkeit vorzugeben in welche Zeile der eingegebene Text erscheinen soll. Wird kein Text eingegeben, erscheint eine Fehlermeldung.
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: InsertString und entferne alle vorhandenen Elemente. Schau dir die unten stehenden Abbildung an, um zu sehen wie die Steuerelemente angeordnet werden
- Füge ein Textfeld für die Überschrift ein. Ändere den Titel in: Listenelement einfügen – InsertString()
- Füge noch zwei Textfelder ein und ändere die Titel in: Text eingeben und Zeile eingeben
- Füge zwei Eingabefelder hinzu und behalte die vorgegebenen IDs (IDC_EDIT1, IDC_EDIT2)
- Füge ein Listenfeld hinzu und behalte die vorgegebene ID (IDC_LIST1)
- Füge ein Button ein, behalte die vorgegebene ID (IDC_BUTTON1) und ändere den Titel in Text einfügen
- Füge eine Member-Variable für das Listenfeld ein - Kategorie: Control, Variablentyp: CListBox, Name: m_ctlListBox1
- Füge jetzt noch zwei Member-Variablen für die Eingabefelder ein - Für das Eingabefeld Text eingeben: Kategorie: Wert, Variablentyp: CString, Name: m_strEdit1 und für das Eingabefeld Zeile eingeben: Kategorie: Wert, Variablentyp: int, Name: m_nZeile
- Klicke doppelt auf den Button um eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht einzufügen und übernehme den vorgeschlagenen Funktionsnamen
- Füge folgenden Code in die eben erstellte Funktion ein:
void CInsertStringDlg::OnButton1()
{
// Steuerelemente aktualisieren
UpdateData(TRUE);
// Es wurde nichts in das Eingabefeld eingegeben!
if(m_strEdit1 == "")
MessageBox("Keinen Text eingegeben!");
// Es wurde etwas eingegeben, Text ins Listenfeld einfügen
else
m_ctlListBox1.InsertString(m_nZeile, m_strEdit1);
}
Downloads: InsertString.exe - Gesamtes Projekt
Mit Hilfe der Funktion GetCount() kann man ermitteln wie viele Elemente das Listenfeld besitzt. Die Funktion liefert das Ergebnis als Rückgabewert.
Beispiel:
Im folgenden Beispiel fügen wir ein paar Zeilen in ein Listenfeld ein und ermitteln dann dessen Zeilenanzahl. Die ermittelte Zeilenanzahl des Listenfelds wird dann in einem Textfeld ausgegeben. Dabei zeigt das erste Beispiel wie dies mit einer Variablen funktioniert und das zweite Beispiel wie das mit einem Zeiger funktioniert.
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: GetCount und entferne alle vorhandenen Elemente. Schau dir die unten stehenden Abbildung an, um zu sehen wie die Steuerelemente angeordnet werden
- Füge ein Textfeld für die Überschrift ein. Ändere den Titel in: Anzahl der Elemente im Listenfeld ermitteln – GetCount()
- Füge ein Listenfeld in die eben erstellte Anwendung ein und behalte die vorgegebene ID (IDC_LIST1)
- Füge ein Textfeldfeld in die eben erstellte Anwendung ein, entferne den Titel und ändere die ID in (IDC_STATIC1)
- Füge ein Button hinzu, behalte die vorgeschlagene ID (IDC_BUTTON1) und ändere den Titel in Zählen
- Füge eine Member-Variable für das Listenfeld ein - Kategorie: Control, Variablentyp: CListBox, Name: m_ctlListBox1
- Klicke doppelt auf den Button um eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht einzufügen und übernehme den vorgeschlagenen Funktionsnamen
- Füge folgenden Code in die eben erstellte Funktion ein:
void CList1Dlg::OnButton1()
{
// Benötigte Variablen erstellen
int i_anzahl; // Für Anzahl der Listenfeldeinträge
CString help_str; // Für die Textausgabe
// Anzahl der Listenelemente ermitteln
i_anzahl = m_ctlListBox1.GetCount();
// int in String wandeln
help_str.Format("%d", i_anzahl);
// Ergebnis ausgeben
SetDlgItemText(IDC_STATIC1, "Das Listenelement enthält " + help_str + " Einträge");
}
- Füge jetzt noch folgenden Code in die OnInitDialog() Funktion ein, um Elemente in das Listenfeld einzufügen
BOOL CList1Dlg::OnInitDialog()
{
...
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
// Der ListBox Elemente zufügen:
m_ctlListBox1.AddString("VW");
m_ctlListBox1.AddString("Audi");
m_ctlListBox1.AddString("Honda");
m_ctlListBox1.AddString("BMW");
m_ctlListBox1.AddString("Peugeot");
m_ctlListBox1.AddString("Renault");
m_ctlListBox1.AddString("Opel");
return TRUE;
}
Gleiches Beispiel mit Zeiger
Das gleiche Ergebnis bekommt man, wenn man anstatt der Listenfeld-Variable einen Zeiger verwendet. Der Code für die Funktionen würde so aussehen:
void CList1Dlg::OnButton1()
{
// Benötigte Variablen erstellen
int i_anzahl; // Für Anzahl der Listenfeldeinträge
CString help_str; // Für die Textausgabe
CListBox *pListBox = (CListBox *)GetDlgItem(IDC_LIST1); // Zeiger auf Listenfeld
// Anzahl der Listenelemente ermitteln
i_anzahl = pListBox->GetCount();
// int in String wandeln
help_str.Format("%d", i_anzahl);
// Ergebnis ausgeben
SetDlgItemText(IDC_STATIC1, "Das Listenelement enthält " + help_str + " Einträge");
}
BOOL CList1Dlg::OnInitDialog()
{
...
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
// Der ListBox Elemente zufügen:
CListBox *pListBox = (CListBox *)GetDlgItem(IDC_LIST1); // Zeiger auf Listenfeld
pListBox->AddString("Audi");
pListBox->AddString("Honda");
pListBox->AddString("BMW");
pListBox->AddString("Peugeot");
pListBox->AddString("Renault");
pListBox->AddString("Opel");
pListBox->AddString("VW");
return TRUE;
}
Downloads: GetCount.exe - Gesamtes Projekt
Mit Hilfe der Funktion GetText() kann man den Zeileinhalt eines Listenfeldes auslesen. Als Argumente erwartet die Funktion die Zeilennummer und einen String, in den der ausgelesene Text geschrieben wird. Die Zeilennummer kann mit der Funktion GetCurSel() ermittelt werden. Siehe dazu auch das Beispiel: Zeilennummer ermitteln - GetCurSel()
Beispiel:
Im folgenden Beispiel wird eine Anwendung erstellt die den Text des ausgewählten Listenfeldes ermittelt und ausgibt. Wird der Button gedrückt ohne das eine Zeile ausgewählt wurde, wird dies abgefangen und eine Meldung in dem Textfeld ausgegeben.
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: GetText und entferne alle vorhandenen Elemente. Schau dir die unten stehenden Abbildung an, um zu sehen wie die Steuerelemente angeordnet werden
- Füge ein Textfeld für die Überschrift ein. Ändere den Titel in: Zeileninhalt aus einem Listenfeld ermitteln – GetText()
- Füge ein Listenfeld in die eben erstellte Anwendung ein und behalte die vorgegebene ID (IDC_LIST1)
- Füge ein Textfeldfeld in die eben erstellte Anwendung ein, entferne den Titel und ändere die ID in (IDC_STATIC1)
- Füge ein Button ein, behalte die vorgeschlagene ID (IDC_BUTTON1) und ändere den Titel in Zeile auslesen
- Füge eine Member-Variable für das Listenfeld ein - Kategorie: Control, Variablentyp: CListBox, Name: m_ctlListBox1
- Klicke doppelt auf den Button um eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht einzufügen und übernehme den vorgeschlagenen Funktionsnamen
- Füge folgenden Code in die eben erstellte Funktion ein:
void CGetTextDlg::OnButton1()
{
// Benötigte Variable erstellen
int i_zeile;
CString help_str; // Für die Textausgabe
// Zeilennummer ermitteln
i_zeile = m_ctlListBox1.GetCurSel();
// Wenn eine Zeile ausgewählt wurde, gib den Inhalt aus
if(i_zeile >= 0)
{
// Gewählten Zeilennumer auslesen und Inhalt ermitteln
m_ctlListBox1.GetText(m_ctlListBox1.GetCurSel(), help_str);
// Ergebnis ausgeben
SetDlgItemText(IDC_STATIC1, "Die Auswahl enthält den Text: " + help_str);
}
// Es wurde keine Zeile ausgewählt!
else
{
SetDlgItemText(IDC_STATIC1, "Es wurde keine Zeile ausgewählt!");
}
}
- Füge jetzt noch folgenden Code in die OnInitDialog() Funktion ein, um Elemente in das Listenfeld einzufügen
BOOL CGetTextDlg::OnInitDialog()
{
...
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
// Der ListBox Elemente zufügen:
m_ctlListBox1.AddString("Peter");
m_ctlListBox1.AddString("Gustav");
m_ctlListBox1.AddString("Michael");
m_ctlListBox1.AddString("Volker");
return TRUE;
}
Downloads: GetText.exe - Gesamtes Projekt
Mit Hilfe der Funktion GetCurSel() kann man herausfinden welche Zeile im Listenfeld markiert ist. Die Funktion gibt als Rückgabewert die ermittelte Zeile zurück. Zu beachten ist das die erste Zeile dem Wert 0 entspricht, die zweite Zeile dem Wert 1 usw.
Beispiel:
Im folgenden Beispiel wird eine Anwendung erstellt die beim Klick auf den Button Zeile ermitteln ausgibt, welche Zeile im Listenfeld markiert ist. Es enthält auch eine Abfrage, ob überhaupt eine Zeile im Listenfeld markiert wurde.
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: GetCurSel und entferne alle vorhandenen Elemente. Schau dir die unten stehenden Abbildung an, um zu sehen wie die Steuerelemente angeordnet werden
- Füge ein Textfeld für die Überschrift ein. Ändere den Titel in: Zeilennummer ermitteln - GetCurSel()
- Füge ein Listenfeld ein und behalte die vorgegebene ID (IDC_LIST1)
- Füge noch ein Textfeldfeld hinzu, entferne den Titel und ändere die ID in (IDC_STATIC1)
- Füge ein Button ein, behalte die vorgegebene ID (IDC_BUTTON1) und ändere den Titel in: Zeile ermitteln
- Füge eine Member-Variable für das Listenfeld ein - Kategorie: Control, Variablentyp: CListBox, Name: m_ctlListBox1
- Klicke doppelt auf den Button um, eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht einzufügen und behalte den vorgeschlagenen Funktionsnamen
- Füge folgenden Code in die eben erstellte Funktion ein:
void CGetCurSelDlg::OnButton1()
{
// Benötigte Variablen erstellen
int i_zeilennummer; // Für ausgewähltes Listenelement
CString help_str; // Für die Textausgabe
// Markierte Zeile ermitteln
i_zeilennummer = m_ctlListBox1.GetCurSel();
// Wenn eine Zeile markiert ist, gib dessen Inhalt aus
if(i_zeilennummer>=0)
{
// int in String wandeln und Text ausgeben
help_str.Format("%d", i_zeilennummer);
SetDlgItemText(IDC_STATIC1, "Die Zeile Nummer " + help_str + " ist markiert!");
}
// Keine Zeile im Listenfeld markiert
else
{
SetDlgItemText(IDC_STATIC1, "Keine Zeile im Listenfeld ausgewählt!");
}
}
- Füge jetzt noch folgenden Code in die OnInitDialog() Funktion ein, um Elemente in das Listenfeld einzufügen
BOOL CGetCurSelDlg::OnInitDialog()
{
...
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
// Der ListBox Elemente zufügen:
m_ctlListBox1.AddString("Katze");
m_ctlListBox1.AddString("Hund");
m_ctlListBox1.AddString("Maus");
m_ctlListBox1.AddString("Hase");
return TRUE;
};
Downloads: GetCurSel.exe - Gesamtes Projekt |
Die Vervielfältigung der auf diesen Seiten enthaltenen Informationen und Grafiken ist untersagt, ausgenommen davon ist sämtlicher auf diesen Seiten angezeigter Quellcode. Es wird keinerlei Gewähr für die Richtigkeit und Vollständigkeit der bereitgestellten Informationen übernommen. Haftungsansprüche für Schäden, die durch Nutzung der bereitgestellten Informationen verursacht wurden, sind ausgeschlossen. Für den Inhalt von angegebenen Verweisen wird keine Gewährleistung übernommen.
Copyright © 2005 coding-help.de | |