Toolbar aktualisieren manuell auslösen
-
Moin!
Ich habe eine SDI mit zwei Toolbars, die per WM_UPDATE_UI aktuell gehalten werden.
Nun habe ich das Phänomen festgestellt, dass das Aktualisieren zwar klappt, wenn ich mit der Maus auf Speichern klicke - aber nicht, wenn ich es per Tastatur auslöse.
Dann muss ich erst nochmal irgendwo klicken, damit die Toolbars aktualisiert werden.Ich habe es schon mit
AfxGetMainWnd()->Invalidate();und
m_wndToolBar.Invalidate(); m_wndToolBar2.Invalidate();versucht. Beides hat keinen Effekt.

Was muss ich da aufrufen?
-
Toolbars werden in der Idfle Phase aktualisiert. Also im Allgemeinen nach dem die letzte Windows Nachricht gezogen wurde. Wenn man ein Idle-Update erzwingen will genügt es IMHO einfach eine WM_NULL Nachricht zu posten (wichtig nicht senden) oder irgendwo einen aktiven Timer zu haben.
-
Also, ich habe jetzt mal im Speichern-Handler im Mainframe das hier ans Ende gepackt:
PostMessage(WM_NULL);Hilft nicht.

PS: Ein Timer hilft auch nicht.
Es hilft aber, das Fenster kurz in den Hintergrund zu schicken und dann wieder hervor zu holen, dann ist alles prima.
-
Weitere Tests mit ShowWindow, UpdateWindow und diversen Messages haben nichts geholfen.
Die Titelzeile hat übrigens auch ein Aktualisierungsproblem, aber das hatte ich bisher für unkritisch befunden.

-
Aber dann hast Du ein anderes Problem. Wenn Invalidate nicht hilft und auch der Aufruf der ON_UPDATE Handler dann stimmt irgendwas ncht in Deiner Windows Hirarchie.
Ein PostMessage WM_NULL oder ein Timer an das Mainframe erzwingt den Aufruf aller ON_UPDATE Handler!
Ein Invalidate muss ein Neuzeichnen erzwingen, allerings wird hier kein ON_UPDATE Handler aufgerufen!
-
Oh, die Antwort hatte ich neulich nicht mehr gesehen.

Aber, wie kann ich denn suchen, WAS da nicht stimmt?Ich habe das Problem nämlich immer noch und es ist extrem störend.

PS: Vielleicht liegt da ja auch das Tastenfresserproblem unter Win98.

-
Ah, ich hab es: Mein Workaround zum Tastenfresser war schuld.

Jetzt geht immerhin das aktualisieren wieder, leider müssen die Win98 User (ca.90%) weiterhin auf die Tastaturbedienung verzichten.
-
hast du mal zusätzlich zu dem Invalidate() auch UpdateWindow aufgerufen?
-
Ich glaube, auch das hätte nicht geholfen, da ich in CMainFrame::PreTranslateMessage vergessen hatte, die Basisklasse aufzurufen.
