Status für CheckBox merken
-
Hi, nur ganz kurz. Ich habe eine DialogBox mit einer CheckBox. Funktioniert auch alles, allerdings sind gesetzte Häkchen nach nochmaligem Öffnen des Dialogs verschwunden. Wie kann ich denn den Status auch bei nochmaligem Öffnen beibehalten?
thnx & greetz
-
Das mußt Du selbst bei Nachricht WM_INITDIALOG setzen!
z.B. so:
if ( b_einstellung_aktiv != 0 ) //Deine Variable mit der Einstellung für CheckBox. { CheckDlgButton( hwnd_dialog, IDC_CHECKBOX, BST_CHECKED ); }Martin
-
Super, es klappt! Vielen Dank Martin...ich hatte genau das gemacht, wie du, allerdings hab ich als versucht beim Aufruf des Dialogs (aus dem Menu) direkt den Wert zu setzen und nicht in der WM_InitDialog... war ja aber auch klar eigentlich...
Noch ne Frage: Bei den Radiobuttons geht das ganze ja sicher ähnlich, oder?
Hast Du eine Ahnung wie man bestimmte RadioButtons gruppieren kann?greetz & thnx!

-
Ich gehe davon aus, Du baust Dir den Dialog mit dem Resourcen-Editor von Deiner Entwicklungsumgebung zusammen (z.B. Microsoft Visual C oder Borland C++ Builder).
RadioButtons kannst Du ganz einfach gruppieren, indem Du sie in eine GROUPBOX legst. So ist es auch optisch hervorgehoben, welche Radiobuttens denn zusammengehören.
In MSDN "About Dialog Boxes" http://msdn2.microsoft.com/en-us/library/ms632588.aspx sind Links zu gut beschriebenen Erklärungen zu finden ("About Dialog Boxes", "Dialog Box Programming Considerations", "Using Dialog Boxes")
Martin
-
hi, leider muss ich nochmal meinen code posten, denn irgendwie läufts doch nicht ganz rund. habe jetzt 2 checkboxen und leider beeinflusst der status der ersten immer den der zweiten...
keine ahnung warum... sicher ist das nicht gut programmiert was ich da hab, aber denke es sollte laufen.//Checkbox States HWND hCb1=NULL; bool cb1=TRUE; int state1; HWND hCb2=NULL; bool cb2=TRUE; int state2; //Auszug aus dem DlgProc switch(uMsg) { case WM_INITDIALOG: if(cb1==TRUE) CheckDlgButton(hWnd, IDC_CHECK1, BST_CHECKED); else if(cb1==FALSE) CheckDlgButton(hWnd, IDC_CHECK1, BST_UNCHECKED); if(cb2==TRUE) CheckDlgButton(hWnd, IDC_CHECK2, BST_CHECKED); else if(cb2==FALSE) CheckDlgButton(hWnd, IDC_CHECK2, BST_UNCHECKED); return TRUE; case WM_COMMAND: switch(LOWORD (wParam)) { case IDC_CHECK1: //First get handle of checkbox by casting lParam to HWND hCb1 = (HWND)lParam; state1 = SendMessage(hCb1,BM_GETCHECK,0,0); if(state1 == BST_CHECKED) { //do something cb1=TRUE; } else if(state1 == BST_UNCHECKED) { //do something cb1=FALSE; } case IDC_CHECK2: //First get handle of checkbox by casting lParam to HWND hCb2 = (HWND)lParam; state2 = SendMessage(hCb2,BM_GETCHECK,0,0); if(state2 == BST_CHECKED) { //do something cb2=TRUE; } else if(state2 == BST_UNCHECKED) { //do something cb2=FALSE; } break;Hat jemand eine vielleicht andere/geschicktere Lösung um sich die states zu merken, bzw eine idee, warum wenn der erste state angewählt wird, der zweite automatisch auch an ist?
thnx & greetz
-
Ganz klar, da fehlt ein break!
case WM_COMMAND:
switch(LOWORD (wParam))
{
case IDC_CHECK1:
//First get handle of checkbox by casting lParam to HWND
hCb1 = (HWND)lParam;
state1 = SendMessage(hCb1,BM_GETCHECK,0,0);if(state1 == BST_CHECKED)
{
//do something
cb1=TRUE;
}else if(state1 == BST_UNCHECKED)
{
//do something
cb1=FALSE;
}
break;

case IDC_CHECK2:
//First get handle of checkbox by casting lParam to HWND
hCb2 = (HWND)lParam;
state2 = SendMessage(hCb2,BM_GETCHECK,0,0);if(state2 == BST_CHECKED)
{
//do something
cb2=TRUE;
}
else if(state2 == BST_UNCHECKED)
{
//do something
cb2=FALSE;
}
break;HTH!
Martin
-
Unabhängig vom eigentlichen Problem mit dem fehlenden break; könntest Du Deine if-Abfragen ein wenig eleganter lösen.
Du machst für das ein und dasselbe Problem zwei gegenteilige if-Abfragen, z.B.:
eugler schrieb:
if(cb1==TRUE)
CheckDlgButton(hWnd, IDC_CHECK1, BST_CHECKED);
else if(cb1==FALSE)
CheckDlgButton(hWnd, IDC_CHECK1, BST_UNCHECKED);Ich würde eher so schreiben (eine einzige if-Abfrage genügt):
if (cb1==TRUE) { CheckDlgButton(hWnd, IDC_CHECK1, BST_CHECKED); } else { CheckDlgButton(hWnd, IDC_CHECK1, BST_UNCHECKED); }Ich persönlich setze jede noch so kleine Anweisung in Verzweigungen (if-Abfragen, do-/while-/for-Schleifen usw.) in geschweifte Klammern { und } ein. Das hilft Dir bei Fehlersuche ungemein!
Just my 5 Cents
Martin
-
jawohl... ganz klar das break... vielen dank! das mit den if-anweisungen werde ich auch versuchen mir zu herzen zu nehmen

greetz & thnx
-
Martin, dir ist wohl entgangen das wir Kaffee süchtigen Programmierer faul sind, oder wozu wurden eben die Abkürzungen (Einzeiler ohne {}, +=, *= && statt AND, etc.) eingeführt
