Statusbar-Texte ändern
-
Hallo zusammen!
Hier mein Problem:
Ich würde gerne jene Statusbar-Texte zur Laufzeit ändern, welche angezeigt werden, sobald sich der Mauszeiger über ein Menü- bzw. Toolbar-Element bewegt. Also zB. "Open existing document" sobald sich der Mauszeiger über dem Öffnen Menü- bzw. Toolbar-Button befindet.
Ziel des ganzen ist es, diese Status-Texte mehrsprachig zu gestallten, wobei das laden der mehrsprachigen Texte kein Problem darstellt (Tooltips, Menü-Elemente und sonstige Dialog-Elemente sind bereits mehrsprachig realisiert).
Die konkrete Frage ist nun, wo ich das anzeigen der Status-Bar-Texte abfangen und meine eigenen Texte einfügen kann (Also welche Window-Message wird dabei gesendet)?
Die Tooltip-Texte der Toolbar zB. setze ich indem ich in der WindowProc WM_NOTIFY abfange und prüfe, ob der lParam == TTN_NEEDTEXT ist.
Ist dies der Fall führe ich folgenden Code aus, um die der Sprache entsprechenden Texte anzuzeigen:static CHAR szBuf[256]; LPTOOLTIPTEXT lpToolTipText; switch (message) { case WM_NOTIFY: { switch (((LPNMHDR) lParam)->code) { case TTN_NEEDTEXT: lpToolTipText = (LPTOOLTIPTEXT) lParam; switch (lpToolTipText->hdr.idFrom) { case ID_FILE_NEW: theApp.AppMyLoadString(IDTM_FILE_NEW, szBuf, sizeof(szBuf)); // Sprachabhängigen Text laden break; case ID_FILE_OPEN: //... //... } lpToolTipText->lpszText = szBuf; break; } //... } } }
Gibt es für die Statusbar-Texte auch ein Event wie TTN_NEEDTEXT, welches ich abfangen kann?
danke, mfg
mike
ps.: Ich hoffe ihr könnt meiner Schilderung folgen
-
Warum machst Du das nicht über Satelite-DLLs mit AfxSetResourceHandle?
http://www.mpdvc.de/artikel/MultilingualeProgramme.htmDas ist das einfachste und macht fast alles automatisch richtig
Ansonsten schau Dir mal WM_SETMESSAGESTRING String an. Diese Nachricht wird in der MFC verwendet die Anzeige im Statusbar zu ändern.
-
Martin Richter schrieb:
Warum machst Du das nicht über Satelite-DLLs mit AfxSetResourceHandle?
http://www.mpdvc.de/artikel/MultilingualeProgramme.htmDas ist das einfachste und macht fast alles automatisch richtig
Kommt Momentan leider nicht mehr in Frage, da so ziemlich alles fertig ist und ich diesbezüglich keine Änderungen mehr vornehmen möchte
Martin Richter schrieb:
Ansonsten schau Dir mal WM_SETMESSAGESTRING String an. Diese Nachricht wird in der MFC verwendet die Anzeige im Statusbar zu ändern.
Ok, das abfangen funktioniert soweit, allerdings kann ich den neuen Text nicht zuweisen, bzw. wird dieser einfach ignoriert:
switch (message) { case WM_SETMESSAGESTRING: { switch (wParam) { case ID_FILE_NEW: theApp.AppMyLoadString(IDTM_FILE_NEW, szBuf, sizeof(szBuf)); m_wndStatusBar.SetPaneText(0, szBuf); // Wie weise ich den Text nun richtig zu? break; } break; } //... }
In szBuf steht jedenfalls der richtige Text allerdings wird dieser von SetPaneText "ignoriert"...
mfg
-
Hab nun die Lösung selbst gefunden und gebe sie natürlich der Vollständigkeit halber hier Preis
Mein Problem war, dass man zwar ohne Probleme in das 1. Pane der StatusBar mit SetPaneText etwas schreiben kann, dieser Text allerdings sofort danach wieder von den Framework-Eigenen Routinen überschrieben wird (WM_SETTEXT wird gesandt, allerdings nur im Pane 1).
Die Lösung war einfach eine eigene Klasse von CStatusBar abzuleiten und OnSetText zu überschreiben.
Die Detaillierte Beschreibung und Lösung findet ihr hier:
http://support.microsoft.com/?scid=kb%3Ben-us%3B110505&x=10&y=12danke, mfg
-
Das ist IMHO der falsche Ansatz. Du hättest einfach die Parameter von WM_SETMESSAGESTRING manipulieren können und diese geänderten Parameter weiterleiten könne. Ichhabe nicht gesagt, dass Du den Text in die CStatusBar selbst setzen sollst.
Die Schnittstelle ist WM_SETMESSAGESTRING, diese wird zentral an das Frame gesendet, also ist hier IMHO der zentrale Ansatz.
-
Ok, danke für den Wink mit dem Zaunpfahl
Da bin ich mal wieder (wie so oft) den umständlicheren Weg gegangen und hab die (eigentlich recht offensichtliche) bessere Variante nicht gesehen.
Das ganze sieht nun so aus und funktioniert soweit:
LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { LPTOOLTIPTEXT lpToolTipText; CString text; if (message == WM_SETMESSAGESTRING) { text = GetStatusBarText(wParam); // Sprachabhängigen Text über ID (in wParam) holen if (text != "") // Wird zur ID kein Text gefunden wird der gesendete Text nicht unterdrückt { wParam = 0; // wParam und lParam dürfen nicht gleichzeitig gesetzt sein (siehe MSDN TN024, WM_SETMESSAGESTRING) lParam = (LPARAM)text.GetBuffer(); // Text für Statusbar zuweisen } } else if ((message == WM_NOTIFY) && (((LPNMHDR)lParam)->code == TTN_NEEDTEXT)) { // Sprachabhängige Tooltips über ID holen und zuweisen lpToolTipText = (LPTOOLTIPTEXT)lParam; lpToolTipText->lpszText = GetTooltipText(lpToolTipText->hdr.idFrom); } return CMDIFrameWnd::WindowProc(message, wParam, lParam); }
Somit kann man natürlich das ableiten von CStatusBar weglassen...
Für weitere Anregungen bin ich natürlich weiter offen!
Danke, mfg