Radiobutton SetCheck-Problem



  • Hallo,

    ich habe da ein Problem mit einer Gruppe Radiobutton.
    IDC_RADIO3 aktiviert ein neues Fenster, welches, wenn
    es geschlossen wird, in WindowProc SetCheck aufruft,
    um RADIO1 zu aktivieren und RADIO3 zu deaktivieren:

    ((CButton*)GetDlgItem(IDC_RADIO3))->SetCheck(0); 
    ((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(1);
    

    Funktioniert so auch, aber mit ungewünschtem Nebeneffekt.
    Denn sobald

    GetDlgItem(IDC_RADIO3))->SetCheck(0);
    

    gerufen wird, scheint wieder

    void MyProg::OnBnClickedRadio3()
    

    gerufen zu werden. Und voila, ist das soeben geschlossene Fenster
    wieder offen :p

    Kann ich irgendwie anders, ohne OnBnClickedRadio3 versehentlich wieder
    zu aktivieren, den Checkedstatus von Radio3 entfernen und auf Radio1 setzen?

    Hinweis: Ich behandle das momentan in WindowProc, da dort auf eine
    WM für das Schließen des Fensters reagiert wird, welches über Radio3 geöffnet wurde.



  • Ich teste es gleich, aber ist es nicht so, dass gar nicht

    void MyProg::OnBnClickedRadio3()
    

    gerufen wird, sondern sowas wie
    der Fokus auf OnBnClickedRadio3 😕



  • Du hast 2 Radiaobuttons.
    Wenn du auf einen Klickst willst du den anderen deaktivieren?
    Wozu?
    Das macht MFC automatisch.



  • Genau das passiert scheinbar nicht. Ich habe Radio3 angeklickt.
    Nach dem Schließen des Dialoges, der dadurch aufging, kehre ich
    in das Fenster der Radiobutton zurück.

    Nun ist noch immer Radio3 aktiv, was nicht sein soll.
    Daher habe ich beim Beenden des vorherigen Fensters eine
    WM an das Fenster mit den Radios geschickt. Wenn diese WM
    also gerufen wird passiert das hier:

    ((CButton*)GetDlgItem(IDC_RADIO3))->SetCheck(0); 
    ((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(1);
    

    Würde ich nur Radio1 auf SetCheck(true) setzen, hätte ich
    plötzlich zwei Radiobutton aktiv!! Daher muss ich einen
    checked setzen und den anderen unchecked.

    Dann sieht zwar alles toll aus, aber aus irgendwelchen Gründen
    scheint er den Code aus void MyProg::OnBnClickedRadio3() wieder abzuarbeiten.
    Zumindest ruft er mir plötzlich wieder das Fenster auf, das zu Radio3
    gehört.


  • Mod

    Kann ich nicht nachvollziehen.
    Bei mir wird durch SetCheck/BM_SETCHECK keine WM_COMMAND Nachricht ausgelöst.

    Setze mal bitte einen Breakpoint und schau Dir mal an, wer diese Nachricht auslöst (Callstack ansehen).



  • Hallo,

    ich habe jetzt eben kurz nachvollzogen, dass alles wie gewollt
    funktioniert, aber nur, wenn ich in WindowProc im Case für
    meine selbst definierte WM eine MessageBox einbaue..wtf
    ich verstehe nicht wie das abgearbeitet wird 😕

    LRESULT MyDia::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch (message)                  
    	{
    	case UPDAVX: //WM_APP + 118
    //mach was teil1....
    	break;
    	case ACTBTN: //WM_APP + 119
    
    		GetDlgItem(IDC_BUTTON4)->EnableWindow(true);
    		((CButton*)GetDlgItem(IDC_RADIO3))->SetCheck(0); //uncheck
    		((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(1); //check
    		OnBnClickedRadio1(); //tatsächlich aufrufen...
    
    		MessageBox("Frickeltest"); //nur wenn diese MB drin ist, läuft alles sauber durch
    		//ansonsten wird plötzlich OnBnClickedRadio3() gerufen...
    
    		break;
    
    	}
    
    	return CDialog::WindowProc(message, wParam, lParam);
    }
    

  • Mod

    Ich verstehe den Sinn und Zweck Deiner WndProc nicht.
    Warum baust Du das nicht normal überdie Messagemap mit ON_MESSGE ein?
    Nochmal: Grundsätzlich wird durch SetCheck kein WM_COMMAND Handler ausgelöst.
    Wenn da ein Handler ausgelöst wird, dann wird dies an Deiner etwas merkwürdigen Art leigen Nachrichten zu senden und weiterzuleiten.

    Schau einfach in Deinen Callstack rein wer die Nachricht auslöst. Du wirst sehen, Du bist es selbst.


Anmelden zum Antworten