[gelöst] CMFCToolBar in Registry



  • Hallo,
    ich versuche gerade eine MDI-Anwendung mit dem MFC-Feature Pack zu erstellen. Die mit dem Assistenten erstellte Anwendung funktioniert auch sehr gut. Offenbar werden auch alle Positionen der Menubar und Toolbar usw. in der Registry gespeichert. Wo das geschieht, kann ich aber nicht erkennen. Probleme gibts dann, wenn ich zB eine weitere Toolbar hinzufüge. Diese versuche ich in OnClose() mittels toolbar.SaveState(...) zu speichern und in OnCreate() mit LoadState() wieder richtig zu platzieren. Das funktioniert aber nicht. Nun ist offenbar die Position meiner neuen Toolbar ausschlaggebend für die Docking-Position, auch für die Standard-Toolbar.
    Mir ist auch aufgefallen, dass die vom Assi erstellte Toolbar ("Standard") plötzlich immer auch den Namen meiner 2. Toolbar ("Toolbar2") hat.
    Kurz: Wie speichere und lade ich den Docking-State weiterer Bars ?


  • Mod

    Lösche mal erst die alten Einträge in der Registry für Deine Anwendnung.
    Das Problem ist oft einfach schon dass IDs umbenannt werden oder ähnliches.

    In der Entwicklungsphase ist es ratsam immer mal wieder diese Positionen zu löschen.
    Ich merke mir die Programmversion in der Registry die zuletzt verwendet wurde. Das Programm schaut nach was in der Registry drin ist und wenn das in meinen Augen nicht mehr kompatibel ist lösche ich die alten Positionen.
    Das Problem ist, dass evtl. sonst auch neue Bars nicht erscheinen.

    Über Customize und zurücksetzen der Bars geht das auch.



  • Hallo Martin,
    hilft leider nicht. Offenbar mache ich was falsch. Hier mal der Code:

    void CMainFrame::OnClose(){
    	m_wndToolBar1.SaveState(_T("Vom lokalen Anwendungs-Assistenten generierte Anwendungen"),1001,IDR_TOOLBAR1);
    	m_wndToolBar2.SaveState(_T("Vom lokalen Anwendungs-Assistenten generierte Anwendungen"),1002,IDR_TOOLBAR2);
    	CMDIFrameWndEx::OnClose();
    }
    
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){
    ...
    	if (!m_wndToolBar1.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    		!m_wndToolBar1.LoadToolBar(theApp.m_bHiColorIcons ? IDR_TOOLBAR1 : IDR_TOOLBAR1))
    	{
    		TRACE0("Fehler beim Erstellen der Symbolleiste.\n");
    		return -1;      // Fehler beim Erstellen
    	}
    	CString strToolBarName1("Toolbar1");
    	m_wndToolBar1.SetWindowText(strToolBarName1);
    
    	if (!m_wndToolBar2.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    		!m_wndToolBar2.LoadToolBar(theApp.m_bHiColorIcons ? IDR_TOOLBAR2 : IDR_TOOLBAR2))
    	{
    		TRACE0("Fehler beim Erstellen der Symbolleiste.\n");
    		return -1;      // Fehler beim Erstellen
    	}
    	CString strToolBarName2("Toolbar2");
    	m_wndToolBar2.SetWindowText(strToolBarName2);
    ...
    	m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
    	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    	m_wndToolBar1.EnableDocking(CBRS_ALIGN_ANY);
    	m_wndToolBar2.EnableDocking(CBRS_ALIGN_ANY);
    	EnableDocking(CBRS_ALIGN_ANY);
    	DockPane(&m_wndMenuBar);
    	DockPane(&m_wndToolBar);
    	DockPaneLeftOf(&m_wndToolBar1,&m_wndToolBar);
    	DockPaneLeftOf(&m_wndToolBar2,&m_wndToolBar1);
    ...
    	m_wndToolBar1.LoadState(_T("Vom lokalen Anwendungs-Assistenten generierte Anwendungen"),1001,IDR_TOOLBAR1);
    	m_wndToolBar2.LoadState(_T("Vom lokalen Anwendungs-Assistenten generierte Anwendungen"),1002,IDR_TOOLBAR2);
    ...
    }
    

    Vielleicht liegts an den Parametern für LoadState,SaveState ?
    Der 2. soll sein: controlID ? (nicht klar, was gemeint ist.)
    Der 3.: resource ID (Das ist klar)
    Problem ist nach wie vor, dass beim 2. Start der Anwendung alle 3 Toolbars den gleichen Namen haben ("Toolbar2") und sie gemeinsam dort gedockt werden, wo sich zuletzt Toolbar2 befand.



  • Hab nun beim durchlesen meiner Fragen meinen Fehler gefunden. Statt

    m_wndToolBar1.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
    

    gebe ich der Toolbar nun die ControlID als Parameter mit:

    m_wndToolBar1.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC,CRect(1, 1, 1, 1),1001);
    

    Dann klappt das auch mit dem speichern in der Registry

    m_wndToolBar1.SaveState(_T("Vom lokalen Anwendungs-Assistenten generierte Anwendungen"),1001,IDR_TOOLBAR1);
    

    Der Tip von Martin ist aber auch zu beachten.

    Edit: Hab nun rausgefunden, das man sich SaveState() und LoadState() dann sogar sparen kann.


  • Mod

    Ja!

    Unbedingt zu beachten: Alle Controlabasr die man erzeugt benötigen eigene eindeutige IDs. Normalerweise hat man dieses Problem gar nicht, wenn man auch den entsprechenden Code sofort einbaut, der dieses Bars ein und ausblendet.
    Dann merkt man schnell was man falsch gemacht hat.


Anmelden zum Antworten