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 😉


  • Mod

    Warum machst Du das nicht über Satelite-DLLs mit AfxSetResourceHandle?
    http://www.mpdvc.de/artikel/MultilingualeProgramme.htm

    Das 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.htm

    Das 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=12

    danke, mfg


  • Mod

    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


Log in to reply