In meinen Anwendungen nutzt ich häufig third Party Control wie Controls von Infragistics, usw...
Die Third Party Controls Subclasse ich eigentlcih immer, um möglichst viel einfluss auf deren Verhalten nehmen zu können. Weiterhin liegen auf meinen Forms praktisch nur Container (User Defined Controls).
Nun ,insbeonsdere wenn Toolstrips in Spiel kommen, passiert es , dass Forms sich nur noch dadurch aktivieren lassen, indem man auf Ihre Titelleiste clickt. Einen Click sonst wo auf die Form gibt der Form keinen Focus.
Witziger weise funktioniere naber die Controls. Also ich kann z.bsp. TreeNodes expanden, Buttons clicken usw.... Aber die Form bekommt nicht den Focus und sie kommt nicht nach vorne.
Eine schnelle idee war einfach der Form zu sagen -> Wenn Click dann komm nach vorne.
Funktioniert ja aber nicht weil ich nicht weiß ob und wenn ja welche controls auf der Form liegen. Diesesn Code in sämtliche controls zu hängen ist meinem Empfinden nach mehr als grausam, also suchte ich nach einem passenden event / Methode und bin dabei auf die virtuelle WndProc Methode gestoßen .
Dort kommen nachrichten des Betriebssystems an die form an. Nun habe ich diese Methode überschrieben und festgestellt dass immer wenn ein Form aktiviert werden sollte immer die gleichen Messages feuern.
Nun prüfe ich einfach die eingehende Message und wenn es sich um eine Aktivierung handelt hole ich die Form manuell nach vorne (Source Code s. weiter unten)
Interessant ist auch, dass scih andere dinge ebenfalls damit realisieren lassen. Z.bsp. aktionen wenn man über die Titelleiste der Form fährt etc...
Hier ein Beispielhafter (noch unausgearbetiet Source Code der Forms nach vorne holt)
Insbesondere bei der Message muss ich nochmal schauen, dass ich die wirklcih passende message (glaueb 33 passt nicht 100%) abfrage
protected override void WndProc(ref Message m)
{
//Erstmal das Standardverhalten ausführen lassen
base.WndProc(ref
m);
//Eingehende Message Prüfen
switch (m.Msg)
{
//Form soll nach vorne geholt werden
case 33:
// Focus setzen und sicherheitshalebr vorholen
this.Focus();
this.BringToFront();
break;
default:
//Sonstige Messages
break;
}
}
Würde mich sehr freuen wenn ihr mir Feedback gibt ob ihr auch solche Probleme kennt und wie eure Lösungen waren.