MainFrame, Mehrere Docs & Views, ein Update und der verlorene Focus
-
Hallo,
ich hab da ein Problem und komme einfach nicht weiter.
In meiner MDI-Anwendung hab ich u.U. mehrere View auf, die zu unterschiedlichen Documents gehören. Desweiteren hab ich einen Updatebutton in der Toolbar des Hauptrahmens.
Wenn ich nun diesen Button betätige aktuallisiert er zwar alles, aber mein Programm verliert dabei kurzfristig seinen Focus (Sprich: wird "durchlässig" für Mausklicks). Soll heißen das darunterliegende Fenster wird aktiv.Hatte jemand schonmal solch ein Problem?
Hoffe auf Hilfe...

-
ich denk mal, dass du über cdoctemplate das template für das fenster, welches den focus haben soll, holen und angeben musst
-
Hm...ähm...
Ich hab mich auch blöde ausgedrückt...
Ich suche eine Möglichkeit mit der ich feststellen kann wann mein Hauptrahmen den Focus verliert an eine andere Anwendung.
Die Nachrichten "WM_KILLFOCUS" und "WM_SETFOCUS" scheinen nur beim Aktivieren meiner Anwendung zugreifen.
Danke trotzdem schonmal...
-
wie siehts denn nachdem updaten aus? liegt deine anwendung noch oben und verliert erst den focus, wenn du einen mausklick drauf machst? die beschreibung ist mir noch nicht ganz klar..bitte nochmal versuchen
-
Hi,
es ist so...da ich halt mehrere Views/Docs aktuallisieren muß setze ich ersteinmal ein SetRedraw(FALSE). Dann gehe ich meine Docs durch und nache für jedes ein UpdateAllViews(). Zum Schluss noch ein SetRedraw(TRUE) und ein Finales RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_ALLCHILDREN) und die Anwendung ist wieder okay.
Sollte jemand beim durchackern der Docs aber in den Bereich meiner Anwendung klicken, so wird das dahinterliegende Fenster (Welches auch immer gerade da ist) aktiviert aber nicht neugezeichnet!

Ich wollte dieses Phänomen nun abfangen, sprich wenn der Benutzer innerhalb meines Anwendungsfenster klickt soll halt meine Anwendung auch Aktiv bleiben!
Besser?

-
also: mit redraw hab ich noch nix zu tun gehabt, aber nach der beschreibung in der msdn würde ich sicherlich den ersten parameter in der redrawwindow-function nicht auf NULL setzen, sondern den handle für dein window vergeben.
-
Hallo,
Danke für deine Mühen, aber ich hab die Lösung gefunden...

Man(n) sollte halt ein LockWindowUpdate() und UnlockWindowUpdate() verwenden um eine Aktualisierung zu verhindern und nicht ein SetRedraw(FALSE) bzw. SetRedraw(TRUE)...

Danke nochmals!
-
(komme von http://www.c-plusplus.net/forum/viewtopic.php?t=54434)
Mit den Folgeproblemen von LockWIndowUpate hab ich nur schlechte Erfahrungen gemacht, da laß ich seit einer Weile lieber die Finger von.
Wenn ein Top-Level-Fenster einer anderen Anwendung aktiviert wird, bekommst du WM_ACTIVATEAPP (wparam=false:du wurdest deaktiviert). Ansonsten WM_ACTIVATE innerhalb der Anwendung.
außerdem noch WM_MDIACTIVATE:
- an MDI Parent: anderes MDI-Child aktivieren. Dabei gehen WM_MDIACTIVATE messages als "benachrichtigung" jeweils an das deaktivierte und das aktivierte.Vielleicht hilft dir das ja.
-
Hm...welche Folgeprobleme?
Ich hab das ungefähr so gemacht:
try { LockWindowUpdate(); // Meine Docs durchgehen und UpdatesAllViews() ausführen ... } catch(...) { // Leer -> Sicherstellung das Unlock ausgeführt wird...;-) } UnlockWindowUpdate();Funktioniert tadellos....

-
Bei 'ner (recht alten) Anwendung wurden beim Unlock *alle* Fenster *aller* Anwendungen geupdated (upgedatet? upgedated?) Irgendwann hab' ich's mal wieder versucht, und mußte das neu zeichnen manuell auslösen. War auch nicht so toll - seitdem laß ich die Finger von.