|
|
|
|
|
| Steuerelemente - Drehfelder |
Hier stehen Informationen zum Umgang mit Drehfelder (Spinbutton). Die zugehörige Klasse lautet: CSpinButtonCtrl.
- Beispiel mit Drehfelder
- Wert für das Drehfeld festlegen - SetPos()
- Wertebereich für das Drehfeld festlegen - SetRange()
Im folgenden Beispiel wird eine Anwendung erstellt, die zeigt wie man mit Drehfelder umgeht. Erstellt werden zwei Drehfelder incl. zugehörige Eingabefelder. In ihnen wird der aktuelle Wert des jeweiligen Drehfelds angezeigt und kann hier auch geändert werden. Das erste Drehfeld arbeitet mit ganzen Zahlen, das zweite mit Kommazahlen
Beispiel:
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Drehfelder und entferne alle vorhandenen Elemente. Schau dir die unten stehenden Abbildung an, um zu sehen wie die Steuerelemente angeordnet werden
- Füge zwei Drehfelder ein und behalte die vorgegebenen IDs (IDC_SPIN1, IDC_SPIN2)
- Füge zwei Eingabefelder ein und behalte auch hier die vorgeschlagenen IDs (IDC_EDIT1, IDC_EDIT2)
- Füge jeweils eine Member-Variable für die Drehfelder ein - Kategorie: Control, Variablentyp: CSpinButtonCtrl, Name: m_ctlSpin1, m_ctlSpin2
- Füge für beide Eingabefelder jeweils eine Nachrichtenbehandlungsroutine für die Nachricht EN_UPDATE ein und übernehme die vorgeschlagenen Funktionsnamen
- Füge für die Dialogklasse (CDrehfelderDlg) eine eine Nachrichtenbehandlungsroutine für die Nachricht WM_VSCROLL ein und übernehme den vorgeschlagenen Funktionsnamen
- Füge folgenden Code in die eben erstellten Funktionen ein:
void CDrehfelderDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// Welches Drehfeld hat die Nachricht ausgelöst?
if(pScrollBar->GetDlgCtrlID()==IDC_SPIN1)
{
CString str_Spinwert;
// Neuer Wert aus Spinbuttons lesen und ins Eingabefeld schreiben
str_Spinwert.Format("%d", nPos);
SetDlgItemText(IDC_EDIT1, str_Spinwert);
}
if(pScrollBar->GetDlgCtrlID() == IDC_SPIN2)
{
CString str_Spinwert;
double d_Spinwert;
// int in double wandeln
d_Spinwert = double ( nPos ) / 10.0 ;
// Neuer Wert aus Spinbuttons lesen und ins Eingabefeld schreiben
str_Spinwert.Format("%2.1f", d_Spinwert);
SetDlgItemText(IDC_EDIT2, str_Spinwert);
}
}
void CDrehfelderDlg::OnUpdateEdit1()
{
// -- Drehfeld mit ganzen Zahlen --
CString str_Spinwert;
int n_Spinwert;
// Eingegebener Wert aus Eingabefeld lesen
GetDlgItemText(IDC_EDIT1, str_Spinwert);
// String in int wandeln
n_Spinwert = atoi(str_Spinwert);
// Eingegebener Wert korrekt?
if(n_Spinwert<0 || n_Spinwert>100)
{
MessageBox("Nur Zahlen von 0 - 100 erlaubt! Wert wird auf 50 zurück gesetzt");
n_Spinwert = 50;
SetDlgItemText(IDC_EDIT1, "50");
}
// Neuen Wert ans Drehfeld schicken
m_ctlSpin1.SetPos (n_Spinwert);
}
void CDrehfelderDlg::OnUpdateEdit2()
{
// -- Drehfeld mit Kommazahlen --
double d_Spinwert;
CString str_Spinwert;
int n_Spinwert;
// Eingegebenen Wert aus Eingabefeld lesen
GetDlgItemText(IDC_EDIT2, str_Spinwert);
// String in double wandeln
d_Spinwert = atof (str_Spinwert);
// double in int wandeln
n_Spinwert = int (10.0 * d_Spinwert);
// Eingegebener Wert korrekt?
if(n_Spinwert<0 || n_Spinwert>100)
{
MessageBox("Nur Zahlen von 0.0 - 10.0 erlaubt! Wert wird auf 5.0 zurück gesetzt");
n_Spinwert = 50;
SetDlgItemText(IDC_EDIT2, "5.0");
}
// Neuen Wert ans Drehfeld schicken
m_ctlSpin2.SetPos (n_Spinwert);
}
- Lege noch die Wertebereiche für die Drehfelder fest und initialisiere diese. Das ganzzahlige Drehfeld soll von 0-100 gehen und das Kommazahlen Drehfeld von 0.0 - 10.0. Füge dazu diesen Code in der OnInitDialog() Funktion ein:
BOOL CDrehfelderDlg::OnInitDialog()
{
...
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
// Spinbutton 1 Bereich von 0-100 festlegen
m_ctlSpin1.SetRange(0,100);
//Startposition soll 0 sein
m_ctlSpin1.SetPos(0);
//Startposition ins Eingabefeld schreiben
SetDlgItemText(IDC_EDIT1,"0");
// Spinbutton 2 Bereich von 0.0-10.0 festlegen
m_ctlSpin2.SetRange(0,100);
//Startposition soll 5.0 sein
m_ctlSpin2.SetPos(50);
//Startposition ins Eingabefeld schreiben
SetDlgItemText(IDC_EDIT2,"5.0");
return TRUE;
}
Beschreibung:
Als erstes werden die Drehfelder in der OnInitDialog() initialisiert, d.h. Wertebereiche und Startpositionen festgelegt. Sobald der Benutzer auf eines der Drehfelder klickt, wird die Nachricht WM_VSCROLL ausgelöst und die zugehörige Funktion aufgerufen. Darin wird als erstes ermittelt welches Drehfeld die Nachricht ausgelöst hat und dann wird der neue Wert in das zugehörige Eingabefeld geschrieben.
Falls der Benutzer direkt etwas in das Eingabefeld eingibt, haben wir Funktionen für die Nachricht EN_UPDATE eingefügt. Der eingegebene Wert wird erstmal in int oder double gewandelt und wird dann auf richtige Eingabe geprüft, also ob der eingegebene Wert im zulässigen Wertebereich liegt. Danach wird der neue Wert in das jeweilige Drehfeld geschrieben.
Downloads: Drehfelder.exe - Gesamtes Projekt
Mit Hilfe der Funktion SetPos() kann man den Wert eines Drehfelds setzen. Man kann diese Funktion z.B. verwenden, um in der OnInitDialog() den Startwert für ein Drehfeld festzulegen. Als Argument erwartet die Funktion einen ganzzahligen Wert.
Beispiel:
Es folgt der Code wie er im Beispiel mit Drehfelder verwendet wurde. Dort werden zwei Drehfelder initialisiert. Das erste Drehfeld benutzt ganze Zahlen und bekommt einen Wertebereich von 0 - 100. Der Startwert des Drehfeldes wird mit SetPos() auf 0 gesetzt. Das zweite Drehfeld benutzt Kommazahlen und bekommt einen Wertebereich von 0.0 - 10.0. Der Startwert des Drehfeldes wird mit SetPos() auf 5.0 gesetzt.
BOOL CDrehfelderDlg::OnInitDialog()
{
...
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
// Spinbutton 1 Bereich von 0-100 festlegen
m_ctlSpin1.SetRange(0,100);
//Startposition soll 0 sein
m_ctlSpin1.SetPos(0);
//Startposition ins Eingabefeld schreiben
SetDlgItemText(IDC_EDIT1,"0");
// Spinbutton 2 Bereich von 0.0-10.0 festlegen
m_ctlSpin2.SetRange(0,100);
//Startposition soll 5.0 sein
m_ctlSpin2.SetPos(50);
//Startposition ins Eingabefeld schreiben
SetDlgItemText(IDC_EDIT2,"5.0");
return TRUE;
}
Mit Hilfe der Funktion SetScrollRange() kann man den Wertebereich für das Drehfeld festlegen. Das erste zu übergebende Argument ist der Startwert (ganze Zahl) und das zweite zu übergebende Argument der Endwert (ganze Zahl). Übergibt man der Funktion z.B. die Werte 0, 100, dann beginnt das Drehfeld bei 0 und endet bei 100.
Beispiel:
Es folgt der Code wie er im Beispiel mit Drehfelder verwendet wurde. Dort werden zwei Drehfelder initialisiert. Das erste Drehfeld benutzt ganze Zahlen und bekommt mit Hilfe der Funktion SetRange() einen Wertebereich von 0 - 100. Der Startwert des Drehfeldes wird auf 0 gesetzt. Das zweite Drehfeld benutzt Kommazahlen und bekommt mit Hilfe der Funktion SetRange()
einen Wertebereich von 0.0 - 10.0. Der Startwert des Drehfeldes wird auf 5.0 gesetzt.
BOOL CDrehfelderDlg::OnInitDialog()
{
...
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
// Spinbutton 1 Bereich von 0-100 festlegen
m_ctlSpin1.SetRange(0,100);
//Startposition soll 0 sein
m_ctlSpin1.SetPos(0);
//Startposition ins Eingabefeld schreiben
SetDlgItemText(IDC_EDIT1,"0");
// Spinbutton 2 Bereich von 0.0-10.0 festlegen
m_ctlSpin2.SetRange(0,100);
//Startposition soll 5.0 sein
m_ctlSpin2.SetPos(50);
//Startposition ins Eingabefeld schreiben
SetDlgItemText(IDC_EDIT2,"5.0");
return TRUE;
} |
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 | |