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, CFrameWndExBeim 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
-
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
-
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.
-
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