|
|
|
|
|
| Steuerelemente - Eingabefelder |
Hier stehen Informationen zum Umgang mit Eingabefelder (EditBox). Die zugehörige Klasse lautet: CEdit.
- Daten aus Eingabefelder lesen - GetDlgItemText()
- Daten aus Eingabefelder in Dateien speichern und laden
- Daten in Eingabefelder schreiben - SetDlgItemText()
- Eingabefeld auf 'nur Lesen' - SetReadOnly()
- Mehrzeiliges Eingabefeld mit automatischem Scrolling - LineScroll()
- Nachrichten für Eingabefelder
- Passwort-Modus im Eingabefeld - SetPasswordChar()
- Schriftart im Eingabefeld ändern - SetFont()
- Zeilenumbruch im Eingabefeld
Daten aus Eingabefelder kann man mit der Funktion GetDlgItemText() lesen. Die Funktion besitzt zwei Parameter. Als erstes gibt man die ID des Elements an, aus dem gelesen werden soll und als zweites Argument gibt man einen String an, in dem die ausgelesenen Daten gespeichert werden.
Beispiel:
Im folgendem Beispiel kann mit einem Klick auf den Button einen in das Eingabefeld eingegebenen Text auslesen.
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: GetDlgItemText und entferne alle vorhandenen Elemente
- Füge ein Textfeld für die Überschrift ein und ändere den Titel in: Daten aus Eingabefelder lesen - GetDlgItemText()
- Füge ein Eingabefeld ein und behalte die vorgegebene ID (IDC_EDIT1)
- Füge ein Textfeld ein, ändere die ID in IDC_STATIC1 und lösche den vorgegebenen Titel
- Füge einen Button ein, behalte die vorgeschlagene ID (IDC_BUTTON1) und ändere den Titel in: Daten lesen
- Füge eine Member-Variable für das Eingabefeld ein - Kategorie: Wert, Variablentyp: CString, Name: m_strEdit1
- Klicke doppelt auf den Button, um eine Nachrichtenbehandlungsroutine (Funktion) für die Nachricht BN_CLICKED einzufügen und übernehme den vorgegeschlagenen Funktionsnamen
- Füge folgenden Code in die eben erstellte Funktion ein:
void CGetDlgItemTextDlg::OnButton1()
{
// Text aus Eingabefeld lesen
GetDlgItemText(IDC_EDIT1, m_strEdit1);
// Gelesenen Text in Textfeld ausgeben
SetDlgItemText(IDC_STATIC1, m_strEdit1);
}
Downloads: GetDlgItemText.exe - Gesamtes Projekt
Wie man Daten aus einem Eingabefeld (auch mehrzeilig) in eine Datei speichern und laden kann steht hier: Daten in Dateien speichern und laden
Mit Hilfe der Funktion SetDlgItemText() kann man Daten in Eingabefelder schreiben. Die Funktion besitzt zwei Parameter. Als erstes gibt man die ID des Elements an, in das geschrieben werden soll und als zweites Argument gibt man einen String an, worin steht was in das Eingabefeld geschrieben werden soll.
Ein Beispiel wie man Daten aus Eingabefelder liest oder schreibt gibt es hier: Daten aus Eingabefelder lesen 
Man kann ein Eingabefeld ganz leicht mit einem Schreibschutz versehen. Man muss dies nur in den Eigenschaften des Eingabefelds unter Formate/Schreibgeschützt aktivieren.
Hier möchte ich aber noch zeigen, wie man an ein Eingabefeld während des Programmlaufs mit einem Schreibschutz versehen kann und dies auch wieder rückgängig machen kann. Dies erledigt die Funktion SetReadOnly(). Man braucht dies z.B wenn der Anwender Daten eingegeben hat die er danach nicht mehr ändern soll. Übergibt man TRUE wird der Schreibschutz gesetzt, übergibt man FALSE ist der Schreibschutz nicht gesetzt.
Beispiel:
Im folgenden Beispiel wird dies getestet. Klickt man auf den ersten Button kann man den Schreibschutz für das Eingabefeld setzen und bei Klick auf den zweiten Button wird der Schreibschutz wieder entfernt.
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: SetReadOnly und entferne alle vorhandenen Elemente
- Füge ein Textfeld für die Überschrift ein und ändere den Titel in: Eingabefeld auf 'nur Lesen' setzen - SetReadOnly()
- Füge ein Eingabefeld in die eben erstellte Anwendung ein und behalte die vorgegebene ID (IDC_EDIT1)
- Füge einen Button ein, ändere die ID in: IDC_SETZEN und den Titel in "Schreibschutz setzen"
- Füge noch einen Button ein, ändere die ID in: IDC_ENTFERNEN und den Titel in "Schreibschutz entfernen"
- Füge eine Member-Variable für das Eingabefeld ein - Kategorie: Control, Variablentyp: CEdit, Name: m_ctlEdit1
- Klicke nun doppelt auf jeden Button, um für jeden eine Nachrichtenbehandlungsroutine (Funktion) für die Nachricht BN_CLICKED zu erstellen und übernehme die vorgeschlagenen Funktionsnamen
- Füge folgenden Code in die zwei erstellten Funktionen ein:
void CSetReadOnlyDlg::OnSetzen()
{
// Schreibschutz setzen
m_ctlEdit1.SetReadOnly(TRUE);
}
void CSetReadOnlyDlg::OnEntfernen()
{
// Schreibschutz entfernen
m_ctlEdit1.SetReadOnly(FALSE);
}
Downloads: SetReadOnly.exe - Gesamtes Projekt
Um ein mehrzeiliges Eingabefeld zu erstellen, muss man diese Funktionalität nur in dessen Eigenschaften aktivieren. Allerdings werden die Zeilen nicht automatisch mitgescrollt. Man muss bei Zeilen die das Fassungsvermögen des Eingabefelds überschreiten selbst dorthin scrollen, um sie lesen zu können. Es gibt aber die Funktion LineScroll() die uns hilft das Scrolling zu automatisieren. Man übergibt dieser Funktion die Zeile in welche gescrollt werden soll, als ganzzahligen Wert. Um die Zeilenanzahl im Eingabefeld zu ermitteln eignet sich die Funktion GetLineCount().
Wir werden jetzt ein Programm entwerfen, welches zeigt wie man ein mehrzeiliges Eingabefeld erstellt und mit Hilfe der Funktionen GetLineCount() und LineScroll() das Scrolling automatisiert.
Beispiel:
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Mehrzeilig und entferne alle vorhandenen Elemente
- Füge ein Textfeld für die Überschrift ein und ändere den Titel in: Mehrzeiliges Eingabefeld mit automatischem Scrolling - LineScroll()
- Füge ein Eingabefeld in die eben erstellte Anwendung ein, vergrössere es etwas (siehe dazu untenstehendes Bild) und behalte die vorgegebene ID (IDC_EDIT1). Aktiviere in den Eigenschaften folgende Attribute: Mehrzeilig (Multiline), Horiz. Bildlauf (Horizontal Scroll), Vertik. Bildlauf (Vertical Scroll) und Return möglich (Want Return). In VC++ 6.0 sind alle im Register Formate zu finden
- Füge eine Member-Variable für das Eingabefeld ein - Kategorie: Wert, Variablentyp: CString, Name: m_strEdit1. Füge noch eine Member-Variable für das Eingabefeld ein - Kategorie: Control, Variablentyp: CEdit, Name: m_ctlEdit1
- Füge einen Button ein, ändere den Titel in: Text einfügen ein und behalte die vorgeschlagene ID (IDC_BUTTON1)
- Klicke doppelt auf den Button, um eine Nachrichtenbehandlungsroutine (Funktion) für die Nachricht BN_CLICKED zu erstellen und übernehme den vorgeschlagenen Funktionsnamen
- Füge folgenden Code in die eben erstellte Funktion ein:
void CMehrzeiligDlg::OnButton1()
{
// Eingabefeld auslesen
UpdateData(TRUE);
// Text "Neue Zeile eingefügt" an vorhandenen Text hängen
m_strEdit1 = m_strEdit1 + "\r\nNeue Zeile eingefügt";
// Eingabefeld aktualisieren
UpdateData(FALSE);
// Anzahl der Zeilen im Eingabefeld auslesen
int zeile = m_ctlEdit1.GetLineCount();
// In aktuelle Zeile scrollen
m_ctlEdit1.LineScroll(zeile);
}
- Füge jetzt noch folgenden Code in die OnInitDialog() Funktion ein, um das Eingabefeld zu initialisieren:
BOOL CMehrzeiligDlg::OnInitDialog()
{
...
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
m_strEdit1 = "Erste Zeile!";
UpdateData(FALSE);
return TRUE;
}
Beschreibung:
Sowie auf den Button geklickt wird, wird als erstes das Eingabefeld ausgelesen und in der zugehörigen Variable gespeichert. Das ist wichtig falls der Benutzer etwas in das Eingabefeld eingegeben hat. Dann wird in einer neuen Zeile, das bewirkt \r\n, der Text eingefügt. Danach wird der Inhalt der Variablen in das Eingabefeld geschrieben. Jetzt wird ausgelesen wie viele Zeilen im Eingabefeld vorhanden sind und die letzte Zeile angezeigt. So kommt das automatische Scrolling zustande.
Downloads: Mehrzeilig.exe - Gesamtes Projekt
Man kann Nachrichtenbehandlungsroutinen (Funktionen) verschiedener Nachrichten für das Eingabefeld erstellen. Das Eingabefeld reagiert dann auf diesen Zustand. Hat man z.B eine Funktion für die Nachricht EN_KILLFOCUS eingefügt, wird diese Funktion immer dann aufgerufen, wenn das Eingabefeld den Fokus verliert.
Es folgt eine Übersicht der auswählbaren Nachrichten und darunter Beispiele zu den wichtigsten Nachrichten:
| Nachricht |
Beschreibung |
| EN_CHANGE |
Textänderung nachdem gezeichnet wurde |
| EN_ERRSPACE |
Nicht genügend Speicherplatz (out of memory) |
| EN_HSCROLL |
Horizontale Bildlaufleiste wurde angeklickt |
| EN_KILLFOCUS |
Eingabefocus verloren |
| EN_MAXTEXT |
Eingefügter Text zu lang, wurde abgeschnitten |
| EN_SETFOCUS |
Eingabefocus erhalten |
| EN_UPDATE |
Textänderung bevor gezeichnet wurde |
| EN_VSCROLL |
Vertikale Bildlaufleiste wurde angeklickt |
Beispiel:
Im folgenden Beispiel werden die Nachrichten EN_SETFOCUS, EN_KILLFOCUS und EN_CHANGE demonstriert.
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Nachrichten und entferne alle vorhandenen Elemente
- Füge ein Textfeld für die Überschrift ein und ändere den Titel in: Nachrichten für Eingabefelder
- Füge ein Eingabefeld in die eben erstellte Anwendung ein und behalte die vorgegebene ID (IDC_EDIT1)
- Füge ein Textfeld ein, ändere die ID in IDC_STATIC1 und lösche den vorgegebenen Titel
- Füge eine Member-Variable für das Eingabefeld ein - Kategorie: Wert, Variablentyp: CString, Name: m_strEdit1
- Füge für das Eingabefeld Nachrichtenbehandlungsroutinen (Funktionen) für die Nachrichten EN_SETFOCUS, EN_KILLFOCUS und EN_CHANGE ein. Behalte die vorgeschlagenen Namen für die Funktionen
- Füge folgenden Code in die drei erstellten Member-Funktionen ein:
void CNachrichtenDlg::OnSetfocusEdit1()
{
SetDlgItemText(IDC_EDIT1, "Focus erhalten");
}
void CNachrichtenDlg::OnKillfocusEdit1()
{
MessageBox("Das Eingabefeld hat den Focus verloren!");
}
void CNachrichtenDlg::OnChangeEdit1()
{
// Wert aus Eingabefeld in Variable übertragen
UpdateData(TRUE);
// Daten aus Eingabefeld im Textfeld ausgeben
SetDlgItemText(IDC_STATIC1, m_strEdit1);
}
Beschreibung:
Nachdem das Eingabefeld angeklickt wurde, bekommt es den Focus (Nachricht: EN_SETFOCUS) und wird im Textfeld mit der Meldung "Focus erhalten" bestätigt. Wenn man jetzt den Text im Eingabefeld änderst, dann sieht man dies direkt im Textfeld (Nachricht: EN_CHANGE). Wenn man das Programm beenden möchte verliert das Eingabefeld den Focus (Nachricht: EN_KILLFOCUS) und gibt eine Meldung aus.
Downloads: Nachrichten.exe - Gesamtes Projekt
Man kann aus einem Eingabefeld ganz leicht ein Passwortfeld machen. Man muss dies nur in den Eigenschaften des Eingabefelds aktivieren.
Ich will hier aber noch zeigen, wie man den Passwort-Modus während des Programmlaufs aktiviert bzw. deaktiviert. Mit Hilfe der Funktion SetPasswordChar() kann man aus einem Eingabefeld ein Passwortfeld machen. Man übergibt der Funktion ein Zeichen (char) welches im Eingabefeld angezeigt werden soll. Übergibt man der Funktion den Wert: 0, sieht man die vorhandenen Zeichen im Eingabefeld wieder normal. Der Passwort-Modus funktioniert leider nicht für mehrzeilige Eingabefelder.
Beispiel:
Wir werden jetzt eine Anwendung erstellen, die demonstriert wie man aus einem Eingabefeld während der Laufzeit ein Passwortfeld macht.
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Passwortfeld und entferne alle vorhandenen Elemente. Schau dir die unten stehenden Abbildung an, um zu sehen wie die Steuerelemente angeordnet werden
- Füge ein Eingabefeld in die eben erstellte Anwendung ein und behalte die vorgegebene ID (IDC_EDIT1). Aktiviere in den Eigenschaften das Attribut: Kennwort (Password)
- Füge eine Member-Variable für das Eingabefeld ein - Kategorie: Control, Variablentyp: CEdit, Name: m_ctlEdit1
- Füge zwei Buttons ein und ändere die Titel in Passwort verschlüsseln und Passwort anzeigen
- Klicke doppelt auf jeden Button, um für jeden eine Nachrichtenbehandlungsroutine (Funktion) für die Nachricht BN_CLICKED
zu erstellen. Übernehme die vorgegebenen Funktionsnamen
- Füge folgenden Code in die eben erstellten Funktionen ein:
void CPasswortfeldDlg::OnButton1()
{
// Alle eingegebenen Zeichen in * umwandeln
m_ctlEdit1.SetPasswordChar('*');
// Eingabefeld aktualisieren
m_ctlEdit1.RedrawWindow();
}
void CPasswortfeldDlg::OnButton2()
{
// Passwort anzeigen
m_ctlEdit1.SetPasswordChar(0);
// Eingabefeld aktualisieren
m_ctlEdit1.RedrawWindow();
}
- Füge jetzt noch folgenden Code in die OnInitDialog() Funktion ein, um das Eingabefeld zu initialisieren:
BOOL CPasswortfeldDlg::OnInitDialog()
{
...
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
m_ctlEdit1.SetWindowText("Ich bin ein Passwort!");
return TRUE;
}
Beschreibung:
Durch die Initialisierung wird bereits ein Text im Passwort-Modus vorgegeben. Wenn jetzt per Button der Passwort-Modus an bzw aus ausgeschaltet wird, muss auch immer das Eingabefeld aktualisiert werden, was die Funktion RedrawWindow() übernimmt.
Downloads: Passwortfeld.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
Beispiel:
Das folgende Beispiel zeigt wie man Text mit Zeilenumbruch in ein Eingabefeld einfügen kann.
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Zeilenumbruch und entferne alle vorhandenen Elemente
- Füge ein Textfeld für die Überschrift ein und ändere den Titel in: Zeilenumbruch im Eingabefeld
- Füge ein Eingabefeld ein und vergrössere es etwas. Aktiviere in den Eigenschaften das Attribut: Mehrzeilig (Multiline)
- Füge eine Member-Variable für das Eingabefeld ein - Kategorie: Wert, Variablentyp: CString, Name: m_strEdit1
- Füge noch einen Button ein, ändere den Titel in: Text einfügen und behalte die vorgegebene ID (IDC_BUTTON1)
- Klicke doppelt auf den Button um eine Nachrichtenbehandlungsroutine (Funktion) für die Nachricht BN_CLICKED einzufügen und übernehme den vorgeschlagenen Funktionsnamen
- Füge folgenden Code in die eben erstellte Funktion ein:
void CZeilenumbruchDlg::OnButton1()
{
// Text in Eingabefeld-Variable schreiben
m_strEdit1="Dieser\r\nText\r\nwird\r\numgebrochen";
// Text im Eingabefeld anzeigen
UpdateData(FALSE);
}
Beschreibung:
Mit einem Klick auf den Button wird der umgebrochene Text sichtbar. Immer wenn man ein Zeilenumbruch braucht schreibt man einfach an die gewünschte Stelle \r\n und schon wird der folgende Text in eine neue Zeile geschrieben.
Downloads: Zeilenumbruch.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 | |