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 😉


Anmelden zum Antworten