Sprache der Menüleiste ändern



  • moin

    ich hab nen programm mit ner typischen menüleiste datei -> beenden usw.
    diese will ich nun ins englische übersetzten und wärend der laufzeit anzeigen...

    ich hab das bisher so gemacht das ich mir eine kopie der hauptmenüleiste erzeugt habe und diese dann ins englische übersetzt hab...

    um diese anzuzeigen hab ich folgenden code benutzt:

    LCID id = MAKELCID( MAKELANGID( LANG_GERMAN, SUBLANG_GERMAN ), SORT_DEFAULT );
    		SetThreadLocale(id);
    		HMENU menu = GetMenu(((CPrinterClient2App *)AfxGetApp())->GetMainWnd()->GetSafeHwnd());
    		DestroyMenu( menu );
    		menu = CreateMenu();
    		CMenu menu2;
    		menu2.LoadMenu(IDR_MAINFRAME);
    		menu = menu2.GetSafeHmenu();
    		SetMenu( ((CPrinterClient2App *)AfxGetApp())->GetMainWnd()->GetSafeHwnd(), menu );
    

    das funktioniert auch nur bekomme ich hierbei beim bbendes des programms ein programmabsturtz... da mir da anscheindend keiner weiter helfen kann wollt ich fragen ob es noch andere möglichkeiten gibt die menüleiste zu übersetzen bzw die 2. menüleiste anzuzeigen...

    mfg LT


  • Mod

    Hatten wir das hier nicht schon?
    Also wieder die selben Fragen:
    1. Wo stürzst es ab.
    2. Zeig uns den Callstack.
    3. Hinweis: Die MFC verwaltet die Menüs in den Doc-Templates!



  • sorry aber was genau willst du von mir ??? ich hab meines erachtens genau die stelle im quellcode gepostet an der mein debugger sagt: hier passt was nicht ... nur leider hat keiner drauf reagiert ... wenn du was anderes von mir wissen willst dann erklär es mir ... sorry aber die aussage zeig uns den callstack hilft mir net weiter da ich net mal weis was nen callstack is ... sorry ...

    und dein hinweis is schön aber was soll ich damit anfangen ??? das is so als ob jemand zu nem hund sag hier hasso fass ... ohne das hasso weis warum und weshalb er sowas machen soll ..


  • Mod

    zu 2. Der Callstack ist ein Fenster im Debugger, der Dir anzeigt welche Funktionen zu dem Crash führten. Ansonsten hättest Du einfach mal Dein VS zu Callstack fragen können!

    zu 3. Es ist ein Hinweis, dass im CDocTemplate auch ein Menü-Handle drin ist. Wenn es sich um eine MDI Applikation handelt bringst Du die Software mit SetMenu ganz schön durcheinander... Siehe auch CFrameWnd::m_hMenuDefault Member!
    Nur mal am Rande: Zu zerstörst das aktuele Menü mit DestroyMenu obwohl das Handle in m_hMenuDefault noch verwendet wird.
    Verutlich knallt es, weil das Handle mehrfach zersört wird, oder noch bentzt wird, während Du es geschreddert hast.

    PS: Von einem Hund erwarte ich nicht die Intelligenz selber Schlüsse zu ziehen. Von einem Entwicler schon. (BTW: Ich habe lange Jahre selbst Hunde gehabt und trainiert). 🤡

    Noch was:
    A. Wo führst Du diesen Code denn bitte durch?
    B. Warum hast Du diesen überflüssigen Cast auf CPrinterClient2App in den Statements.
    C. Was soll

    menu = CreateMenu();
    

    wenn Du sowieso kurz danahc menu wieder mit einem anderen Wert fütterst?
    D. Ungeprüfter Code für SDI:

    void CMyMainFrame::ReplaceMenu(UINT nId)
    {
       // Clear old menu
       SetMenu(NULL);
       ::DestroyMenu(m_hMenuDefault);
    
       // Set new one
       CMenu menu;
       VERIFY(menu.LoadMenu(nId));
       SetMenu(&menu);
       m_hMenuDefault = menu.Detach();
    }
    


  • hi

    jo also bitte net falsch verstehn ich kam mir halt vor, als ob ich nicht ernst genommen werd ... sorry naja egal war halt etwas wenig info ... mit deinem letzten post kann ich deutlich mehr anfangen...

    aber 🙂

    wie ruf ich unter vc ++ 6.0 nen callstack fenster auf ?
    also ich seh ehrlich gesagt keins... auch in dem menü find ich nix zu ...
    warum ich die funktion in dem anderen thread gepostet hab naja wenn mein programm abstürzt kann ich das programm debuggen wenn ich das mache geht bei mir visual studio auf und zeigt mir genau die stelle an die ich gepostet hab ... da soll also (so dachte ich) der fehler sein ...

    zu deinem geposteten quellcode:
    ich hab das so angepasst:

    SetMenu(((CPrinterClient2App *)AfxGetApp())->GetMainWnd()->GetSafeHwnd(), NULL);
    		::DestroyMenu(m_hMenuDefault);
    
    		// Set new one
    		LCID id = MAKELCID( MAKELANGID( LANG_GERMAN, SUBLANG_GERMAN ), SORT_DEFAULT );
    		SetThreadLocale(id);
    		CMenu menu;
    		VERIFY(menu.LoadMenu(IDR_MAINFRAME));
    		SetMenu(((CPrinterClient2App *)AfxGetApp())->GetMainWnd()->GetSafeHwnd(), menu);
    		m_hMenuDefault = menu.Detach();
    

    aber da sind noch 2 fehler drin:
    m_hMenuDefault ist nicht deklariert
    menu.Detach() kann man nicht m_hMenuDefault zuweisen ...
    m_hMenuDefault sei ein int und menu.Detach() ein struct HMENU__ *

    also ich hab die chanceLang funktion (in dieser funktion steht dieser code) in die PrinterClient2.cpp drin stehn ... im meiner mainframe.cpp wird diese funktion aufgerufen ...


  • Mod

    zu Callstack:
    Ich habe kein VC6 mehr und bin darüber froh.
    Ansonsten hast Du eine MSDN wo Du nachschlagen kannst.
    IMHO hat auch VC6 ein Debug Menü wenn du debuggest und darin ein Menü-Fenster/Windows. Ansonsten evtl. Alt+7

    zu meinem Code:
    Mein Code ist eine Member Funktion des Mainframes. Warum sollte ich so etwas woanders verankern?

    zu Deinem Code:
    Du hast meine Frage nicht beantwortet wo Dein Code sitzt.
    Deine unsinnige Casterei ist auch noch drin.

    zu guter letzt:
    Verliere ich die Lust an diesem Thread...



  • schön das du das interesse verlierst ... habs hinbekommen ...


Anmelden zum Antworten