Auto-Radiobuttons (BS_AUTORADIO) sind als Standard in fast jedem Dialog zu finden. Das diese netten kleinen Buttons ein Programm dazubringen können sich aufzuhängen, ohne das unbedingt eigener Code im Spiel ist, kann man sich kaum vorstellen.
Aber es kann passieren.
Ein Regular in der Gruppe nntp://microsoft.public.de.vc berichtete dieses Problem mehrfach in der Gruppe. Letzten Endes trugen aber alle Ideen und Vorschläge zu keiner Lösung bei.
In einem Thread wurde dann ein Beispielprogramm veröffentlicht, bei dem mit einem simplen Klick auf einen Radiobutton das Programm in einer Endlosschleife gerät und sich aufhängt.
Die Ursache ist trivial. Eine Gruppe von Auto-Radio Buttons war nicht durch ein Control mit dem Stil WS_GROUP abgeschlossen worden. Solch einen Design Fehler im Dialog hat schon jeder mal gemacht und viele werden die folgende Ausgabe im Debug Fenster kennen: „Warning: skipping non-radio button in group.“
In diesem Fall kam nach der Gruppe Radio Buttons ein Tab-Control, dass den Stil WS_EX_CONTROLPARENT hat. Dieser Stil erlaubt es Dialoge und Controls zu schachteln. Gleichfalls führt dieser Stil dazu, das versucht wird die Gruppe von Radio-Buttons in den untergeordneten Feldern weiter zu führen. Leider waren in den entsprechenden Fenstern auch keine Controls mehr mit dem Stil WS_GROUP und irgendwie hat sich die Windows UI-API dann letzten Endes aufgehängt.
Behoben werden konnte dieser Stil einfach;
- Entweder man führt ein (evtl. sogar unsichtbares) Static Control ein, direkt nach der Gruppe. Static-Controls werden automatisch mit dem WS_GROUP Stil versehen.
- Oder man änderte die Z-Order, so dass auf die Radio-Button Gruppe ein anderes Control mit WS_GROUP Eigenschaften folgt.
- Oder eines der Controls im Unterdialog hat den WS_GROUP Stil, was aber oft genug nicht dem eigentlich gewollten Design entspricht, dass sich die Gruppe in den Unterdialog fortsetzt.
Auch so simplen Warnungen in der Debugausgabe wie „Warning: skipping non-radio button in group.“ sollte man gezielt nachgehen. Manchmal haben heftige Probleme trivialste Ursachen ❗
Anmerkung: Das Beispielprogramm ist zwar noch VC6, aber das Problem liegt im Design der geschachtelten Fenster und der nicht abgeschlossenen Radio-Button Gruppe.