Win32-Programmierung mit VC++ und der Win-Api
2.5 - Check & Radioboxen
Jetzt behandeln wir Check- und Radioboxen. Die machen sich besonders gut in Einstellungsmenüs / Setupdialogen. Wie auch immer, wo Sie verwendet werden überlass ich Euch - Ich zeige halt nur wie sie zu benutzen sind.
Auf gehts: Ich habe mir mal das Win32-Konstrukt geladen um eine “saubere” Arbeitsfläche zu haben. Ihr könnt aber auch euer Programm, das Ihr bis jetzt geschrieben habt, weiter verwenden. Ist Euch überlassen…
Im Ressourceneditor, genauer bei den Steuerelementen, sind unsere gesuchten Elemente zu finden. Wir klicken uns zunächst ein Paar Radio-, dann Checkboxen auf den Dialog:
Diese versehen wir wie gewohnt mit einigen Handles:
Das gleiche machen wir mit einer der Checkboxen. Ich habs mit der Check1 gemacht und Ihr das gleichnamige Handle verpasst. Ein Bild dazu spar ich mir.
Schauen wir uns nun mal den Quellcode an:
...
case WM_COMMAND:
{
switch( LOWORD( wParam ) )
{
case IDC_RADIO1:
{
MessageBox(hwnd, "Die Radiobox wurde betätigt! Ich weiß aber nicht ob nun an oder aus :-(", "Wichtig!", MB_ICONINFORMATION);
}
break;
case IDC_CHECK1:
{
MessageBox(hwnd, "Die Checkbox wurde betätigt! Ich weiß aber nicht ob nun an oder aus :-(", "Wichtig!", MB_ICONINFORMATION);
}
break;
case IDC_INIT:
{
Init(hwnd);
}
break;
}
}
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
...
Wie zu sehen poppt bei Betätigung einer der neuen Objekte eine Messagebox auf. Wie Messageboxen funzen hatten wir schon kennengelernt. Bis jetzt können wir nur abfragen, ob wir mit der Maus in eines unserer Boxen reingeklickt haben. Jetzt sollten wir logischerweise noch abfragen, ob wir nun ein Dot/Häkchen reingemacht, oder rausgemacht haben. - Entschuldigt meinen Ausdruck…
Dazu basteln wir uns noch schnell einen Button rein. Der bekommt von mir den Handle BUTTON1. Um nun aber den Status abfragen zu können, muss der Source geändert werden:
...
case WM_COMMAND:
{
switch( LOWORD( wParam ) )
{
case IDC_BUTTON1:
{
if(SendMessage(GetDlgItem(hwnd, IDC_CHECK1), BM_GETSTATE, 0, 0))
MessageBox(hwnd, "Die Checkbox wurde betätigt! Ein Häkchen ist drin!", "Wichtig!", MB_ICONINFORMATION);
if(!SendMessage(GetDlgItem(hwnd, IDC_CHECK1), BM_GETSTATE, 0, 0))
MessageBox(hwnd, "Die Checkbox wurde betätigt! Kein Häkchen drin!", "Wichtig!", MB_ICONINFORMATION);
}
break;
case IDC_INIT:
{
Init(hwnd);
}
break;
...
Alles klar?
if(!SendMessage(GetDlgItem(hwnd, IDC_CHECK1), BM_GETSTATE, 0, 0))
Bei betätigen des Buttons BUTTON1 wird abgefragt, ob der Rückgabewert der if-Bedingung Wahr oder Falsch ist. Die Argumente sind zuerst mal GetDlgItem, also bekomm die programminterne ID der Checkbox. BM_GETSTATE bedeutet, gib mir den Status. Die beiden Nullen interessieren uns nicht. Das wars schon mit dem abfragen der Checkboxes. Und mit den Radioboxes ist es genauso, nur dass hier halt nur eine gleichzeitig “aktiv” sein kann. Wir haben nun kennengelernt, wie man einen Status abfragen kann. Jetzt werden wir lernen, wie wir den Status einer Checkbox setzen.
Dazu werden wir einen 2. Button benötigen. Ich geb' ihm den Handle BUTTON2. Bei Betätigung dieses Buttons soll in die Checkbox2 entweder ein Häkchen, oder es soll rausgenommen werden.
...
switch( LOWORD( wParam ) )
{
case IDC_BUTTON1:
{
if(SendMessage(GetDlgItem(hwnd, IDC_CHECK1), BM_GETSTATE, 0, 0))
MessageBox(hwnd, "Die Checkbox wurde betätigt! Ein Häkchen ist drin!", "Wichtig!", MB_ICONINFORMATION);
if(!SendMessage(GetDlgItem(hwnd, IDC_CHECK1), BM_GETSTATE, 0, 0))
MessageBox(hwnd, "Die Checkbox wurde betätigt! Kein Häkchen drin!", "Wichtig!", MB_ICONINFORMATION);
}
break;
case IDC_BUTTON2:
{
if(SendMessage(GetDlgItem(hwnd, IDC_CHECK2), BM_GETSTATE, 0, 0))
{
SendMessage(GetDlgItem(hwnd, IDC_CHECK2), BM_SETCHECK, BST_UNCHECKED, 0);
break;
}
if(!SendMessage(GetDlgItem(hwnd, IDC_CHECK2), BM_GETSTATE, 0, 0))
{
SendMessage(GetDlgItem(hwnd, IDC_CHECK2), BM_SETCHECK, BST_CHECKED, 0);
break;
}
}
break;
...
Wenn BUTTON2 betätigt wurde, wird abgefragt, ob in der Checkbox2 (CHECK2) ein Haken drin ist. Wenn ja, dann machs raus. Wenn in CHECK2 aber kein Haken sein sollte, dann mach halt eins rein!
SendMessage(GetDlgItem(hwnd, IDC_CHECK2), BM_SETCHECK, BST_CHECKED, 0);
Hier haben wir nun anstatt BM_GETSTATE BM_SETCHECK benutzt und anstatt einiger Nullen noch BST_CHECKED für “ein Häkchen drin” oder BST_UNCHECKED für “kein Häkchen drin” verwendet.
- BM_GETSTATE - Status abfragen
- BM_SETCHECK - Status setzen
- BST_CHECKED - Haken rein
- BST_UNCHECKED - Haken raus
Falls es widererwarten nicht gefunzt haben sollte, dann gibts hier den Code: check-radiobox.zip - 41KB