2 ToolBars positionieren



  • 2 Toolbar und nach dem Erstellen sind beide unter einander und links ausgerichtet, das scheint mir so default zu sein. Wie kann ich dem 2ten Toolbar verklickern das er sich hinter dem Ersten Tollbar einreihen soll? 😕



  • in dem du diese Funktion nimmst: (hab ich nicht geschrieben, ich weiß nur auch nich mehr von wem sie war):

    [code]void CMainFrame::DockControlBarLeftOf(CToolBar* Bar,CToolBar* LeftOf)
    {
    	CRect rect;
    	DWORD dw;
    	UINT n;
    
    	// get MFC to adjust the dimensions of all docked ToolBars
    	// so that GetWindowRect will be accurate
    	RecalcLayout();
    	LeftOf->GetWindowRect(&rect);
    	rect.OffsetRect(1,0);
    	dw=LeftOf->GetBarStyle();
    	n = 0;
    	n = (dw&CBRS_ALIGN_TOP) ? AFX_IDW_DOCKBAR_TOP : n;
    	n = (dw&CBRS_ALIGN_BOTTOM && n==0) ? AFX_IDW_DOCKBAR_BOTTOM : n;
    	n = (dw&CBRS_ALIGN_LEFT && n==0) ? AFX_IDW_DOCKBAR_LEFT : n;
    	n = (dw&CBRS_ALIGN_RIGHT && n==0) ? AFX_IDW_DOCKBAR_RIGHT : n;
    
    	// When we take the default parameters on rect, DockControlBar will dock
    	// each Toolbar on a seperate line.  By calculating a rectangle, we in effect
    	// are simulating a Toolbar being dragged to that location and docked.
    	DockControlBar(Bar,n,&rect);
    }[/code]
    

  • Administrator

    Anstatt DockControlBar die folgende Funktion benutzen:

    void CMainFrame::DockControlBarLeftOf(CControlBar* pBar, CControlBar* pLeftOfBar)
    {
    	CRect rect;
    	DWORD dw;
    	UINT n;
    
    	// get MFC to adjust the dimensions of all docked ToolBars
    	// so that GetWindowRect will be accurate
    	RecalcLayout(TRUE);
    
    	pLeftOfBar->GetWindowRect(&rect);
    	rect.OffsetRect(1,0);
    	dw=pLeftOfBar->GetBarStyle();
    	n = 0;
    	n = (dw&CBRS_ALIGN_TOP) ? AFX_IDW_DOCKBAR_TOP : n;
    	n = (dw&CBRS_ALIGN_BOTTOM && n==0) ? AFX_IDW_DOCKBAR_BOTTOM : n;
    	n = (dw&CBRS_ALIGN_LEFT && n==0) ? AFX_IDW_DOCKBAR_LEFT : n;
    	n = (dw&CBRS_ALIGN_RIGHT && n==0) ? AFX_IDW_DOCKBAR_RIGHT : n;
    
    	// When we take the default parameters on rect, DockControlBar will dock
    	// each Toolbar on a seperate line. By calculating a rectangle, we
    	// are simulating a Toolbar being dragged to that location and docked.
    	DockControlBar(pBar,n,&rect);
    }
    

    Also die erste Bar andocken. Und die Zweite dann mit dieser Funktion andocken.

    Edit: Die Funktion scheint bekannt zu sein ^^ ... Weiss leider auch nicht mehr woher ich sie habe, aber dachte von www.codeguru.com aus einem Artikel.

    Grüssli



  • 2ter Toolbar:

    BOOL CMainFrame::CreateElementBar()
    {
    	if (!m_wndToolBarElemente.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
    		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    		!m_wndToolBarElemente.LoadToolBar(IDR_ELEMENTE))
    	{
    		TRACE0("Symbolleiste konnte nicht erstellt werden\n");
    		return -1;      // Fehler bei Erstellung
    	}
    
    	return TRUE;
    }
    

    Standardtoolbar + Laden des 2ten Toolbars.

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    
    	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    		return -1;
    
    	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
    		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    	{
    		TRACE0("Symbolleiste konnte nicht erstellt werden\n");
    		return -1;      // Fehler bei Erstellung
    	}
    
    	if(!CreateElementBar()){
    		TRACE0("Symbolleiste konnte nicht erstellt werden\n");
    		return -1;
    	}
    
    	if (!m_wndStatusBar.Create(this) ||
    		!m_wndStatusBar.SetIndicators(indicators,
    		  sizeof(indicators)/sizeof(UINT)))
    	{
    		TRACE0("Statusleiste konnte nicht erstellt werden\n");
    		return -1;      // Fehler bei Erstellung
    	}
    
    	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    	m_wndToolBarElemente.EnableDocking(CBRS_ALIGN_ANY);
    
    	EnableDocking(CBRS_ALIGN_ANY);
    
    	//DockControlBar(&m_wndToolBar);
    	//DockControlBar(&m_wndToolBarElemente);
    
    	DockControlBarLeftOf(&m_wndToolBarElemente,&m_wndToolBar);
    
    	return 0;
    }
    

    Resultat beide Toolbars werden links ausgerichtet(der 2te Toolbar ist aber nicht exakt links ausgerichtet der is um 1 mm nach rechts verschoben ) untereinander dargestellt, wie es die Defaulteinstellungen hergeben. Der einzige unterschied ist nun das die Toolbars nicht mehr hintereinander dockbar sind, wie es vorher ging. Er schreibt bei der Funktion DockControlBarLeftOf im Comment das das an den Parametern von rect liegt, aber was kommt da rein? 😕


  • Administrator

    Dravere schrieb:

    Also die erste Bar andocken. Und die Zweite dann mit dieser Funktion andocken. Dabei ist es egal ob du zuerst die Linke oder rechte andockst, musst halt dann nur korrekt an die Funktion übergeben.

    Lies was ich gesagt habe. Dann wird dir vielleicht auffallen, dass du die erste Bar nicht andockst ^^

    Grüssli



  • ups, jo danke.

    Es geht zwar nun aber ich versteh trotzdem nicht so ganz wieso?

    Warum muss einer der Bars vorher gedockt werden damit das ganze greift?

    Der Bar wird doch erstellt

    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
    		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    	{
    

    und später dann gedockt

    DockControlBar(&m_wndToolBar);
    DockControlBarLeftOf(&m_wndToolBarElemente,&m_wndToolBar);
    

    DockControlBar liefert ja nichts zurück, wieso wird das also explizit gebraucht?


  • Administrator

    Damit das Rechteck deiner ersten Bar definiert wird. Denn an diesem Rechteckt orientiert sich die Funktion und setzt dann deine gewünschte Bar daneben. Die funktion dockt nicht beide Bars an, sondern nur die Rechte.

    Das Andocken hat übrigens nichts mit dem erstellen zu tun ^^

    Grüssli


Anmelden zum Antworten