Toolbar wird nach Portierung von CToolBar nach CMFCToolBar nicht mehr angezeigt



  • Hallo,

    ich habe mein Projekt von Visual Studio 2005 auf 2010 portiert.
    Bei unverändertem Quellcode lief alles sofort.

    Dann habe ich das Toolbar-Objekt statt von CToolBar nun von CMFCToolBar abgeleitet.
    Natürlich habe ich auch die anderen Anpassungen gemacht:
    #include <afxcontrolbars.h>, CWinAppEx, CFrameWndEx

    Beim Zusammenbau der Toolbar bin ich anhand eines Beispiels aus dem Netz vorgegangen
    und habe die kleinen Änderungen dazu auch bei mir eingesetzt.
    Die Anwendung compiliert und startet auch.

    Leider wird aber die Toolbar nicht angezeigt.

    Zunächst war auch die Statusbar verschwunden.
    Diese habe ich dann auch von einer CStatusBar zu einer CMFCStatusBar gemacht.
    Nun läuft die Statusbar wieder aber eben immer noch keine Toolbar!

    Auch beim Debuggen verhält sich meine Anwendung so wie das Beispiel, das funktioniert.

    Was kann ich vergessen haben? Ich find keine Unterschiede!

    Hier der Ausschnitt aus meiner OnCreate(..)

    DWORD dwCtrlStyle = TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | CBRS_SIZE_DYNAMIC;
    	DWORD dwStyle = AFX_DEFAULT_TOOLBAR_STYLE;
    	const CRect r1(1, 1, 1, 1);
    
    	m_wndCommandBar.m_wndParent = this;
    	if(!m_wndCommandBar.CreateEx(this, dwCtrlStyle, dwStyle, r1, IDR_MAINFRAME) || 
           !m_wndCommandBar.LoadToolBar(IDR_MAINFRAME)) 
    	{
    		TRACE0("Failed to create CommandBar\n");
    		return -1;      // fail to create
    	}
    
    	CSize szImage, szButton;
    	szImage = m_wndCommandBar.GetImageSize();
    	szButton.cx = szImage.cx + 6;
    	szButton.cy = szImage.cy + 6;
    	m_wndCommandBar.SetMenuSizes(szButton, szImage);
    
    //	m_wndCommandBar.UpdateButton(0); // mit und ohne probiert
    //	m_wndCommandBar.EnableCustomizeButton(TRUE, 0, _T("xxx")); // mit und ohne probiert
    	m_wndCommandBar.EnableDocking(CBRS_ALIGN_ANY);
    	m_wndCommandBar.SetHeight(COMMAND_HEIGHT);
    	DockPane(&m_wndCommandBar);
    	EnableToolTips(TRUE); // mit und ohne probiert
    	m_wndCommandBar.ShowPane(TRUE,FALSE,TRUE); // mit und ohne probiert
    

    In der InitInstance() habe ich es mit und ohne folgende Erweiterung versucht:
    Das war in dem Beispiel-Projekt auch drin.

    InitContextMenuManager();
    	InitShellManager();
    	InitKeyboardManager();
    	InitTooltipManager();
    	CMFCToolTipInfo ttParams;
    	ttParams.m_bVislManagerTheme = TRUE;
    	theApp.GetTooltipManager()->
    			  SetTooltipParams(AFX_TOOLTIP_TYPE_ALL,
    			  RUNTIME_CLASS(CMFCToolTipCtrl), &ttParams);
    

    Mir läuft langsam die Zeit davon.
    Hat jemand eine Idee, was ich falsch machen könnte?

    Grüsse
    Helmut



  • Leider funktiniert das nicht korrekt,

    auch der Handler für das Event muss umgestaltet werden

    Hier beide Versionen

    BOOL CPatControlDlg::OnNeedText(UINT id, NMHDR* pNMHDR, LRESULT* pResult)
    {
    	/*
    	//CMFCToolBar
    	UINT_PTR nId = pNMHDR->idFrom - 1;
    	CMFCToolBarButton *pBtn = m_ToolBar.GetButton(nId);
    	if(pBtn)
    	{
    		TCHAR szBuff[64];
    		LoadString(AfxGetResourceHandle(), pBtn->m_nID, szBuff, sizeof(szBuff) / sizeof(TCHAR));
    		TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
    		pTTT->lpszText = szBuff;
    		pTTT->hinst = AfxGetResourceHandle();
    	}*/
    
    	//CToolBar
    	if(m_ShowToolTip)
    	{
    		NMTOOLBAR* pNMToolBar = (NMTOOLBAR*)pNMHDR;
    		TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
    		UINT_PTR nId = pNMHDR->idFrom;
    		TCHAR szBuff[128]; LoadString(AfxGetResourceHandle(), nId, szBuff, sizeof(szBuff) / sizeof(TCHAR));
    		pTTT->lpszText = szBuff;
    		pTTT->hinst = AfxGetResourceHandle();
    	}
    
    	return TRUE;
    }
    

    Außerdem musst Du die App nicht von CWinApp sondern von CWinAppEx herleiten

    Am Ende sieht's besser aus, aber man erhält aus den tiefen der MFC
    ein Memory Leak, auch kann das ganze abschmieren, ich habe
    das aus unseren Anwendungen entfernen müssen leider..

    https://www.youtube.com/watch?v=wsZwLxmTdaQ

    Grüße
    Karsten


  • Mod

    Was passiert denn? Debug Ausgabe?
    Wo gibt es einen Fehler.

    Einfach mal Debuggen.

    @Achromat:
    Natürlich muss er, wenn er MFC-Next nutzen will.



  • Hallo Karsten, hallo Martin,

    vielen Dank zunächst mal für Eure Unterstützung!

    CWinAppEx, CFrameWndEx hab ich natürlich drin. Könnte sonst nicht übersetzen.

    Und, es passiert eben kein Fehler. Läuft anstandslos durch und beendet auch,
    wie beschrieben, mit Memory-Leaks. Von denen dachte ich allerdings,
    ich würde sie auch wieder weg bekommen.

    Ich habs im Debugger auch mit einem Beispiel verglichen "ToolBarDemo" aus CodeProject.
    Es verhält sich exakt gleich.
    Nur wird bei mir leider keine Toolbar angezeigt.
    Ach .... In dieser ToolBarDemo gibts keine Memory Leaks.

    Merkwürdig war das Verhalten der Statusbar.
    Ich hatte zunächst die alte belassen. Die wurde aber auch nicht angezeigt.
    Hab sie dann gegen die neue ausgetauscht (CMFCStatusBar), dann war sie wieder da.

    Aber ich muss mir noch die andere Sache, die Karsten genannt hat, mit diesen Events, ansehen.

    Grüsse
    Helmut


  • Mod

    Mach mal die Registry Einstellungen für Dein Programm weg. (HKCU)



  • Habe mal alles, was ich unter der Bezeichnung meines Programms gefunen habe,
    aus HKEY_CURRENT_USER/Software gelöscht. Das sind hauptsächlich Einstellungen,
    die über das Programm gespeichert werden und die ich damit auch bewusst anlege.
    Dann gab es da auich noch an anderer Stelle etwas, das mit "ControlBars-Summary"
    endete. Das hab ich auch gelöscht. Mehr hab ich nicht gefunden.

    Leider war es ohne Erfolg.

    @Karsten:
    Zu dem, was Du unter "OnNeedText(..)" zusammengefast hast, gibt es bei mir nichts
    Analoges.


  • Mod

    Erzeuge mal eine Version mit dem Wizard und vergleiche die Stellen, mit dem Main-Toolbar.



  • Danke Martin, werd ich machen.

    Hat aber leider nichs gebracht, ausser dass nun gar nichts mehr geht.



  • Nun kann ich doch wieder mein Problem selbst lösen.
    Vielleicht nutzt es ja irgend jemanden ausser mir auch noch.
    Und wie immer ist es nur der Zufall, der zuhilfe kommt.

    Ich bin in meiner alten Version auf folgende drei Zeilen gestossen,
    die in der neuen Version, wegen den Portierungsanweisungen aus dem Netz,
    verloren gingen und habe damit rumgespielt.

    EnableDocking(CBRS_ALIGN_ANY);
    	m_wndCommandBar.EnableDocking(CBRS_ALIGN_ANY);
    	DockControlBar(&m_wndCommandBar);
    

    Dann habe ich in meinem Quellcode von ganz oben folgende Ergänzung gemacht.

    EnableDocking(CBRS_ALIGN_ANY);
    	m_wndCommandBar.EnableDocking(CBRS_ALIGN_ANY);
    	DockPane(&m_wndCommandBar);
    

    Bzw. den Teil ab "// m_wndCommandBar.UpdateButton(0);" bis zum Schluss
    damit ausgetauscht.

    Es fehlte also nur das

    EnableDocking(CBRS_ALIGN_ANY);
    

    Aber trotzdem vielen Dank nochmals für die Hilfe.
    Leider ist man immer auf den Zufall angewiesen, da man sich die Dinge,
    mangels Dokumentation, einfach nicht mehr logisch herleiten kann.

    Grüsse
    Helmut



  • Hi,

    ja das ist es, man redet mit anderen über die Probleme, dabei eröffnen sich
    verborgene Welten.

    Was ist jetzt mit dem Memory Leak ?

    Das ist nämlich noch da, solange Du Dialogbasierend bist, ohne den gesamten MFC -new Wust..

    Gruß
    Karsten



  • Hi Karsten,

    ich habe heute noch nicht weiter daran gearbeitet.
    Es ist allerdings eine SDI-Anwendung.

    Die Beispiele aus dem Netz hinterlassen keine Memory-Leaks.
    Ich muss auch noch nachsehen, ob die das "EnableDocking(CBRS_ALIGN_ANY);"
    weglassen konnten oder ob das an einer anderen Stelle versteckt ist.

    Alte und neue Toolbar reagieren auch völlig anders auf die eigentlich
    analogen Operationen.

    Die Ebene, auf der ich mich da bewege hat nix mit Logik zu tun
    aber auch gar nix. Alles Willkür!

    Grüsse
    Helmut



  • Nun stehe ich vor dem nächsten Problem.
    Die Anwendung stürzt nun beim Beenden ab, weil der DockManager die Parent-Klasse
    nicht findet. Genauer gesagt, das "RemovePaneFromDockManager(..)" geht schief.

    Alle Frames und Apps habe ich von den entsprechenden -Ex Klassen abgeleitet,
    aber mein Parent ist beim Beenden plötzlich nur noch eine Wnd-Klasse.
    Beim Erzeugen der Toolbar ist noch alles in Ordnung.

    Zuvor hatte ich tatsächliche das fehlende "EnableDocking(CBRS_ALIGN_ANY);"
    übersehen, da es in meinen Beispielen zu finden ist und in meiner alten
    Anwendung.

    Da nun die Anwendung immer abstürzt, kann ich nicht einmal herausfinden,
    ob ich noch Mem-Leaks habe.

    Grüsse
    Helmut



  • Hi,
    wie schon anfangs gesagt, wenn du nicht das komplette Frameset von BCG einsetzt
    endet die Sache am Ende mit einem instabilen Zustand, ehe man das nun alles erforscht , kopiere gleich deine ganze alte SDI Applikation in das neue Gerußt.

    Es haben schon viele versucht diese "neuere" Toolbar zu verwenden, und haben es dann sein gelassen.

    Ich habe diese Toolbar in einer Dialogbasierenden Anwendung gehalten, und es gab stress damit.

    Die alte Toolbar ist gut, oder verwende ein neues Gerußt.

    Hab Spaß mit dem was geht ^^
    Gruß
    Karsten


Anmelden zum Antworten