Links Titel
Pixel
     
Steuerelemente - Kombinationsfelder


Hier stehen Informationen zum Umgang mit dem Kombinationsfeld (ComboBox). Ein Kombinationsfeld lässt sich ähnlich handhaben wie ein Listenfeld. In den Eigenschaften ist voreingestellt, das die enthaltenen Listenelemente automatisch sortiert werden. Um den ausklappbaren Teil des Kombinationfelds zu vergrössern, muss man nur den kleinen Pfeil im Kombinationsfeld anklicken und kann dann die Grösse verändern. Die zugehörige Klasse lautet: CComboBox.


Übersicht

  - Eingabe in einem Kombinationsfeld auslesen - GetDlgItemText()
  - Daten in das Kombinationsfeld einfügen
  - Kombinationsfeld beim Start initialisieren
  - Nachrichten für Kombinationsfelder
  - Schriftart in einem Kombinationsfeld ändern - SetFont()
  - Zeileninhalt eines Kombinationsfeldes auslesen - GetLBText()
  - Zeile in ein Kombinationsfeld einfügen - AddString()
  - Zeilen an gewünschte Stelle im Kombinationsfeld einfügen - InsertString()
  - Zeilen in einem Kombinationsfeld markieren – SetCurSel()
  - Zeilennummer in einem Kombinationsfeld ermitteln - GetCurSel()

 

Eingabe in einem Kombinationsfeld auslesen - GetDlgItemText()

Wenn man sich für ein Kombinationsfeld vom Typ Dropdown (Voreinstellung) entscheidet, kann der Anwender dort auch direkt etwas hinein schreiben. Um dies zu ermitteln erstellt man sich dafür am besten eine Nachrichtenbehandlungsroutine (Funktion) für die Nachricht CBN_EDITCHANGE und liest dann die Eingabe mit der Funktion GetDlgItemText() aus. Im folgenden Beispiel wird genau das gemacht.

Beispiel:
  • Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen Eingabe auslesen und entferne alle vorhandenen Elemente
  • Füge ein Textfeld für die Überschrift ein. Ändere den Titel in: Eingabe im Kombinationsfeld auslesen - GetDlgItemText()
  • Füge ein Kombinationsfeld in die eben erstellte Anwendung ein und behalte die vorgegebene ID (IDC_COMBO1)
  • Füge darunter ein Eingabefeld ein und behalte die vorgegebene ID (IDC_EDIT1)
  • Füge für das Kombinationsfeld eine Nachrichtenbehandlungsroutine (Funktion) für die Nachricht CBN_EDITCHANGE ein und übernehme den vorgeschlagenen Funktionsnamen
  • Füge folgenden Code in die eben erstellte Funktion ein:
  void CEingabeauslesenDlg::OnEditchangeCombo1()
  {
    CString help_str;

    // Text aus Kombinationsfeld lesen
    GetDlgItemText(IDC_COMBO1, help_str);

    // Ausgelesenen Text ins Eingabefeld schreiben
    SetDlgItemText(IDC_EDIT1, help_str);
  }


Eingabe auslesen


Downloads: Eingabe auslesen.exe - Gesamtes Projekt

 

Daten in das Kombinationsfeld einfügen

Da man mit verschiedenen Visual C++ Versionen auch verschieden die Daten in das Kombinationsfeld einfügt, zeige ich hier wie das mit den verschiedenen Versionen klappt:

Visual C++ 6.0:
Um dem Kombinationsfeld Daten vorzugeben klicke mit der rechten Maustaste auf das Kombinationsfeld und wähle Eigenschaften. Gehe dort in das Register: Daten. Hier kannst du Datenelemente eintragen, die beim Start der Anwendung direkt im Kombinationsfeld vorgegeben sind. Nachdem du etwas in eine Zeile eingegeben hast drücke Strg und Enter, um in die nächste Zeile zu gelangen.

Visual C++.NET 2002/2003:
Um dem Kombinationsfeld Daten vorzugeben gehe in dessen Eigenschaften. Hier kann man unter der Eigenschaft: Daten (Data) die Datenelemente eintragen, die direkt beim Start der Anwendung im Kombinationsfeld stehen sollen. Die Einträge werden mit einem Semikolon voneinander getrennt, also z.B. so: Fuchs;Hase;Hamster

 

Kombinationsfeld beim Start initialisieren

Möchte man beim Start der Anwendung im Kombinationsfeld einen Eintrag voreinstellen, dann braucht man nur die Funktion SetCurSel() in der OnInitDialog()-Funktion aufzurufen. Hat man eine zugehörige Control-Variable für das Kombinationsfeld erstellt, dann kann man diesen Code verwenden:

  BOOL CCombo1Dlg::OnInitDialog()
  {
    ...
    // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
    // Eintrag voreinstellen, z.B 0 für den ersten Eintrag
    m_ctlComboBox.SetCurSel(0);

    return TRUE;
  }


Will man keine Control-Variable erstellen, kann man auch einen Zeiger verwenden:

  BOOL CCombo1Dlg::OnInitDialog()
  {
    ...
    // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
    // Zeiger auf das Kombinationsfeld zuweisen
    CComboBox *z_ComboBox = (CComboBox*)GetDlgItem(ID_DES_KOMBINATIONFELDS);

    // Eintrag voreinstellen, z.B 0 für den ersten Eintrag
    z_ComboBox->SetCurSel(0);

    return TRUE;
  }


Siehe dazu auch das Beispiel: Zeilen in einem Kombinationsfeld markieren – SetCurSel()

 

Nachrichten für Kombinationsfelder

Man kann Nachrichtenbehandlungsroutinen (Funktionen) für verschiedene Nachrichten erstellen. Das Kombinationsfeld reagiert dann auf die jeweilige Aktion. Es folgt eine Übersicht einiger der auswählbaren Nachrichten:

Nachricht Beschreibung
CBN_EDITCHANGE Eingabe in das Kombinationsfeld durch Benutzer
CBN_CLOSEUP Kombinationsfeld wurde geschlossen
CBN_DBLCLK Doppelklick auf ein Element ausgeführt
CBN_DROPDOWN Kombinationsfeld wurde aufgeklappt
CBN_KILLFOCUS Eingabefokus verloren
CBN_SELCHANGE Ein Element wurde ausgewählt

Nun folgen Beschreibungen zu den wichtigsten Nachrichten:

CBN_EDITCHANGE
Für den Fall das der Benutzer Daten direkt in das Kombinationsfeld eingibt, benötigt man eine Funktion für die Nachricht CBN_EDITCHANGE, um darauf zu reagieren.
Ein Beispiel dazu gibt es hier: Eingabe in einem Kombinationsfeld auslesen

CBN_CLOSEUP/CBN_DROPDOWN
Wird der kleine Pfeil neben dem Kombinationsfeld angeklickt, öffnet sich das Kombinationsfeld und die Nachricht CBN_DROPDOWN wird gesendet. Schliesst man das Kombinationsfeld wieder über den kleinen Pfeil, wird die Nachricht CBN_CLOSEUP gesendet.

CBN_DBLCLK
Diese Nachricht wird gesendet, wenn ein Element im Kombinationsfeld doppelt angeklickt wurde. Dies funktioniert aber nur dann, wenn als Kombinationsfeld Typ: Einfach ausgewählt wurde.

CBN_KILLFOCUS
Diese Nachricht wird gesendet, wenn das Kombinationsfeld den Eingabefokus verloren hat, d.h. wenn z.B in ein anderes Steuerelement geklickt wurde oder mit der Tab-Taste zum nächsten Steuerelement gesprungen wurde.

CBN_SELCHANGE
Diese Nachricht wird ausgelöst, wenn der Benutzer etwas in dem Kombinationsfeld auswählt.
Ein Beispiel dazu gibt es hier: Zeileninhalt eines Kombinationsfeldes auslesen - GetLBText()

 

Schriftart in einem Kombinationsfeld ändern - SetFont()

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

 

Zeileninhalt eines Kombinationsfeldes auslesen - GetLBText()

Man benötigt die Funktion GetLBText(), wenn man den Text eines markierten Elements im Kombinationsfeld auslesen will. Der Funktion übergibt man als 1. Argument die Zeile aus der ein Text gelesen werden soll und als 2. Argument einen String, der den ausgelesenen Text speichert.

Im folgenden Beispiel wird eine ausgewählte Zeile mit der Funktion GetCurSel() ermittelt, damit wir deren Index an GetLBText() übergeben können.

Beispiel:
  • Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: GetLBText und entferne alle vorhandenen Elemente
  • Füge ein Textfeld für die Überschrift ein. Ändere den Titel in: Zeileninhalt eines Kombinationsfeldes auslesen - GetLBText()
  • Füge ein Kombinationsfeld in die eben erstellte Anwendung ein und behalte die vorgegebene ID (IDC_COMBO1)
  • Klicke auf die Pfeilschaltfläche im Kombinationsfeld, um die Grösse anzupassen. Damit alle Einträge sichtbar werden wenn es aufgeklappt wird, muss es etwas nach unten gezogen werden
  • Füge dem Kombinationsfeld in den Eigenschaften folgende Elemente hinzu: Hase, Hamster, Ratte, Maulwurf. Wie man das macht steht hier: Daten in das Kombinationsfeld einfügen
  • Füge ein Eingabefeld ein und behalte die vorgegebene ID (IDC_EDIT1)
  • Füge eine Member-Variable für das Kombinationsfeld ein - Kategorie: Control, Variablentyp: CComboBox, Name: m_ctlComboBox1
  • Füge für das Kombinationsfeld eine Nachrichtenbehandlungsroutine (Funktion) für die Nachricht CBN_SELCHANGE ein. Übernehme den vorgeschlagenen Funktionsnamen
  • Füge folgenden Code in die eben erstellte Funktion ein:
  void CGetLBTextDlg::OnSelchangeCombo1()
  {
    // Benötigte Variablen erstellen
    int i_auswahl;
    CString help_str;

    // Ausgewählte Zeile ermitteln
    i_auswahl=m_ctlComboBox1.GetCurSel();

    // Text des ausgewählten Eintrags auslesen
    m_ctlComboBox1.GetLBText(i_auswahl,help_str);

    // Ausgelesenen Text ins Eingabefeld schreiben
    SetDlgItemText(IDC_EDIT1, help_str + " ausgewählt!");
  }


GetLBText


Downloads: GetLBText.exe - Gesamtes Projekt

 

Zeile in ein Kombinationsfeld einfügen - AddString()

Man kann einem Kombinationsfeld Einträge hinzufügen, indem man in den Eigenschaften das Register Daten wählt. Um in die nächste Zeile zu gelangen muss man Strg und Enter drücken. Will man seine Einträge erst im Programm festlegen hilft die Funktion AddString() weiter. Man übergibt ihr einen String, der den einzufügenden Text enthält.

Im folgenden Beispiel wird bei Klick auf den Button jeweils ein neuer Eintrag in das Kombinationsfeld eingefügt.

Beispiel:
  • Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: AddString und entferne alle vorhandenen Elemente
  • Füge ein Textfeld für die Überschrift ein. Ändere den Titel in: Elemente einfügen - AddString
  • Füge ein Kombinationsfeld in die eben erstellte Anwendung ein und behalte die vorgegebene ID (IDC_COMBO1)
  • Füge einen Button ein, behalte die vorgegebene ID (IDC_BUTTON1) und ändere den Titel in: Zeile einfügen
  • Füge eine Member-Variable für das Kombinationsfeld ein - Kategorie: Control, Variablentyp: CComboBox, Name: m_ctlComboBox1
  • Klicke doppelt auf den Button, um eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht einzufügen. Übernehme den vorgeschlagenen Funktionsnamen
  • Füge folgenden Code in die eben erstellte Funktion ein:
  void CAddStringDlg::OnButton1()
  {
    m_ctlComboBox1.AddString("Neuer Eintrag");
  }


AddString

Beschreibung:
Bei jedem Klick auf den Button wird eine neue Zeile in das Kombinationsfeld eingefügt. Da Sortieren im Kombinationsfeld voreingestellt ist, werden eingefügte Einträge automatisch sortiert. Schaltet man die automatische Sortierung in den Eigenschaften des Kombinationsfelds (Register: Formate) aus, wird mit der Funktion AddString() ein neuer Eintrag immer an letzter Stelle im Kombinationsfeld eingefügt.

Um zu steuern in welche Zeile ein Eintrag hinzugefügt werden soll, eignet sich die Funktion InsertString(). Mehr Informationen dazu gibt es hier: Zeilen an gewünschte Stelle im Kombinationsfeld einfügen - InsertString()


Downloads: AddString.exe - Gesamtes Projekt

 

Zeilen an gewünschte Stelle im Kombinationsfeld einfügen - InsertString()

Mit der Funktion InsertString() kann man dem Kombinationsfeld Elemente hinzufügen, genauso wie mit der Funktion AddString(). Mit InsertString() kann man aber noch zusätzlich steuern, in welche Zeile der neue Eintrag eingefügt werden soll. Man übergibt der Funktion die Zeilennummer in der die neue Zeile eingefügt werden soll und einen String, der den einzufügenden Text enthält. Übergibt man für die Zeilennummer -1 würde dies bedeuten, dass die Zeile am Ende der vorhandenen Zeilen eingefügt werden soll. Die Funktion hat in diesem Fall dann die gleiche Funktionalität wie AddString().

Das folgende Beispiel zeigt wie man eine String in einer beliebige Zeile im Kombinationsfeld einfügen kann.

Beispiel:
  • Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: InsertString und bestücke den Dialog mit Steuerelementen wie die unten stehende Abbildung zeigt. Das wäre im wesentlichen ein Kombinationsfeld (IDC_COMBO1), ein Eingabefeld (IDC_EDIT1), und ein Button (IDC_BUTTON1) mit der Beschriftung: Zeile einfügen
  • Füge ein Textfeld für die Überschrift ein. Ändere den Titel in: Zeilen an gewünschte Stelle im Kombinationsfeld einfügen - InsertString()
  • Klicke auf die Pfeilschaltfläche im Kombinationsfeld, um die Grösse anzupassen. Damit alle Einträge sichtbar werden wenn es aufgeklappt wird, muss es etwas nach unten gezogen werden
  • Füge dem Kombinationsfeld in den Eigenschaften folgende Elemente hinzu: Rot, Grün, Gelb und Blau. Wie man das macht steht hier: Daten in das Kombinationsfeld einfügen
  • Ebenfalls in den Eigenschaften des Kombinationsfeld deaktiviere die Eigenschaft: Sortieren
  • Füge für das Kombinationsfeld eine Member-Variable ein - Kategorie: Control, Variablentyp: CComboBox, Name: m_ctlComboBox1
  • Klicke doppelt auf den Button, um eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht einzufügen. Übernehme den vorgeschlagenen Funktionsnamen
  • Füge folgenden Code in die eben erstellte Funktion ein:
  void CInsertStringDlg::OnButton1()
  {
    CString str_help;
    int n_zeile, n_zeilenanzahl;

    // Kombinationsfeld auslesen
    GetDlgItemText(IDC_COMBO1, str_help);

    // Eingabefeld auslesen
    n_zeile = GetDlgItemInt(IDC_EDIT1);

    // Zeilenanzahl im Kombinationsfeld ermitteln
    n_zeilenanzahl = m_ctlComboBox1.GetCount();

    if(str_help == "")
    {
      // Wenn nichts in das Kombinationsfeld eingegebenen wurde, dann Meldug ausgeben und abbrechen
      MessageBox("Nichts in das Kombinationsfeld eingegeben", "Fehler", MB_ICONEXCLAMATION );
      return;
    }

    if(n_zeile >= n_zeilenanzahl)
    {
      // Soll in eine Zeile geschrieben werden, die > der vorhandenen Zeilenanzahl ist, setze die Zeilenangabe auf -1
      n_zeile=-1;
    }

    // String an angebene Position in Kombinationsfeld schreiben
    m_ctlComboBox1.InsertString(n_zeile, str_help);
  }


InsertString

Beschreibung:
In das Kombinationsfeld kann ein String eingegeben werden und im Eingabefeld die Zeile in die der String eingetragen werden soll. Wird nichts in das Kombinationsfeld eingegeben, erscheint ein Meldungsfenster und das Programm bricht ab. Wird keine Zeilennr. angegeben, in die der String eingefügt werden soll, wird er automatisch in die erste Zeile eingetragen. Wird eine Zeilennr. angegeben die grösser der gesamt Zeilenanzahl ist, wird der Eintrag an letzter Stelle im Kombinationsfeld eingetragen.

Das alles macht natürlich nur Sinn, wenn die automatische Sortierung in den Eigenschaften des Kombinationsfelds ausgestellt wurde. Ausserdem ist zu beachten das die Zeilen ab 0 gezählt werden. Die erste Zeile hat den Index 0, die zweite Zeile den Index 1 usw.


Downloads: InsertString.exe - Gesamtes Projekt

 

Zeilen in einem Kombinationsfeld markieren – SetCurSel()

Will man eine Zeile im Kombinationsfeld markieren, kann man die Funktion SetCurSel() verwenden. Man übergibt ihr den Index (Zeilennummer) der Zeile, die markiert werden soll. Beachte das die erste Zeile den Index 0 besitzt, die zweite Zeile den Index 1 usw.

Zur Demonstration der Funktion SetCurSel() wird im folgenden Beispiel bei Klick auf den Button die Zeile mit dem Index 2, also die dritte Zeile, angezeigt.

Beispiel:
  • Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: SetCurSel und entferne alle vorhandenen Elemente
  • Füge ein Textfeld für die Überschrift ein. Ändere den Titel in: Zeilen in einem Kombinationsfeld markieren – SetCurSel()
  • Füge ein Kombinationsfeld in die eben erstellte Anwendung ein und behalte die vorgegebene ID (IDC_COMBO1)
  • Klicke auf die Pfeilschaltfläche im Kombinationsfeld, um die Grösse anzupassen. Damit beim Aufklappen alle Einträge sichtbar werden, muss es etwas nach unten gezogen werden
  • Füge dem Kombinationsfeld in den Eigenschaften folgende Elemente hinzu: Rot, Grün, Gelb und Blau. Wie man das macht steht hier: Daten in das Kombinationsfeld einfügen
  • Füge einen Button ein, behalte die vorgegebene ID (IDC_BUTTON1) und ändere den Titel in Zeile einfügen
  • Füge eine Member-Variable für das Kombinationsfeld ein - Kategorie: Control, Variablentyp: CComboBox, Name: m_ctlComboBox1
  • Klicke doppelt auf den Button, um eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht einzufügen. Übernehme den vorgeschlagenen Funktionsnamen
  • Füge folgenden Code in die eben erstellte Funktion ein:
  void CSetCurSelDlg::OnButton1()
  {
    // Dritte Zeile markieren
    m_ctlComboBox1.SetCurSel(2);
  }


SetCurSel


Downloads: SetCurSel.exe - Gesamtes Projekt

 

Zeilennummer in einem Kombinationsfeld ermitteln - GetCurSel()

Um die Zeilennummer (den Index) einer ausgewählten Zeile im Kombinationsfeld zu ermitteln, wird die Funktion GetCurSel() eingesetzt. Sie gibt einen ganzzahligen Wert zurück, den Index.

Ein passendes dazu Beispiel gibt es hier: Zeileninhalt eines Kombinationsfeldes auslesen - GetLBText()

 

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