15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Dock two toolbars side-by-side

Casey E Mullen -- mullenc@battelle.org
Wednesday, August 14, 1996

     Environment: VC++ 4.0 Windows 95
     
     I can use CFrameWnd::DockControlBar with AFX_IDW_DOCKBAR_TOP to dock 
     my toolbar at the top, but when I have more than one, they stack up 
     vertically rather than side-by-side, wasting a lot of valuable real 
     estate.
     
     Has anyone already dealt with the issue of making two toolbars dock 
     side-by-side at the top of the screen?
     
     Thanks,
     Casey Mullen




Roy G. Browning -- ctf@sccsi.com
Thursday, August 15, 1996

[Mini-digest: 8 responses]

At 06:22 PM 8/14/96 -0500, you wrote:
>     Environment: VC++ 4.0 Windows 95
>     I can use CFrameWnd::DockControlBar with AFX_IDW_DOCKBAR_TOP to dock 
>     my toolbar at the top, but when I have more than one, they stack up 
>     vertically rather than side-by-side, wasting a lot of valuable real 
>     estate.
>     Has anyone already dealt with the issue of making two toolbars dock 
>     side-by-side at the top of the screen?
>     Casey Mullen

Casey;

The code below was taken directly from the "DOCKTOOL" example supplied with
Visual C++.

It works for me,

Roy Browning

////////////////////////////////////////////////////////////////////////////////

void
CMainFrame::DockControlBarLeftOf( CToolBar * barToDock, CToolBar * leftOf )
{
    UINT n;

    // get MFC to adjust the dimensions of all docked ToolBars
    // so that GetWindowRect will be accurate
    RecalcLayout();
	
    CRect rect;
    leftOf->GetWindowRect( &rect );
    rect.OffsetRect( 1,0 );
	
    DWORD dw = leftOf->GetBarStyle();
    n = ( dw & CBRS_ALIGN_TOP )     ? AFX_IDW_DOCKBAR_TOP       :
        ( dw & CBRS_ALIGN_BOTTOM )  ? AFX_IDW_DOCKBAR_BOTTOM    :
	( dw & CBRS_ALIGN_LEFT )    ? AFX_IDW_DOCKBAR_LEFT      :
	( dw & CBRS_ALIGN_RIGHT )   ? AFX_IDW_DOCKBAR_RIGHT     : 0;

    // When we take the default parameters on rect, DockControlBar will dock
    // each Toolbar on a seperate line.  y calculating a rectangle, we in effect
    // are simulating a Toolbar being dragged to that location and docked.
    DockControlBar( barToDock, n, &rect );
}

////////////////////////////////////////

C o n t r o l l i n g  the  F u t u r e
    Software Design & Development

             www.CtF.net

            800-CTF-0032

    Roy Browning - ctf@msn.com

///////////////////////////////////////


-----From: Don.Irvine@net-tel.co.uk

Look at the DOCKTOOL sample. Specically the function DockControlBarLeftOf in
mainfrm.cpp.

Don
-----From: "Cunningham Graham, IK 23" 

I use the following code however I am also using Mark Conways dockable
window dll so it could be different but taking a quick look at the docs
and it should be ok.

//want to dock the cust list and the search bar side by side
	CRect rcList, rcDlg;
	m_wndSearchBar.GetWindowRect(&rcDlg);
	m_CustomerListBar.GetWindowRect(&rcList);

	rcDlg.BottomRight() = rcDlg.TopLeft() + rcList.Size();
	DockControlBar(&m_wndSearchBar);
	DockControlBar(&m_CustomerListBar, AFX_IDW_DOCKBAR_TOP, &rcDlg);


Graham Cunningham
00 41 31 338 0633

-----From: "Manolis Chr.Papadopoulos" 

It was discussed here some time ago. Refer to DOCKTOOL example in the VC =
CD.

As stated in a former message, there are some problems which are focused =
on the LoadBarState() function. Just read the source code thoroughly and =
you will find everything you need.

Former messages can be found in ftp://advn.com/pub/mfc. You can search =
there two.

Manolis Papadopoulos

-----From: Jim Leavitt 

Check out the docktool sample on your vc++ cd, everything you're 
looking for is there.
Jim Leavitt


-----From: Mark Anderson 

There is an example in DOCKTOOL sample app, but I'll include the code 
here for fun :)

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);
}

And I call it in OnCreate like this
        // This sets up the toolbar to be dockable
        m_wndFileToolBar.EnableDocking(CBRS_ALIGN_ANY);
        m_wndViewToolBar.EnableDocking(CBRS_ALIGN_ANY);
        m_wndDesignToolBar.EnableDocking(CBRS_ALIGN_ANY);
        EnableDocking(CBRS_ALIGN_ANY);
        DockControlBar(&m_wndFileToolBar, AFX_IDW_DOCKBAR_TOP);
        DockControlBarLeftOf(&m_wndViewToolBar, &m_wndFileToolBar);
        DockControlBarLeftOf(&m_wndDesignToolBar, &m_wndViewToolBar);

I think I may rename this DockControlBarRightOf, because it docks with 
the supplied supplementary toolbar (previously created) on the left of 
the new toolbar, so your new toolbar is right of the old toolbar :)

        Mark Anderson 
        fizban@bart.et.byu.edu       378-4538      CTB 75H       

	May the Force be with you. -- Obi Wan Kenobi

-----From: "Frank Clark" 

The following should get it done.... I believe this (or some form of it) 
originally came from
one of the samples which ship with VC++.

Frank_Clark@msn.com

In OnCreate:

	// Allow docking on any side of main window
	EnableDocking(CBRS_ALIGN_ANY);

	// Dock Bars to default positions
	DockControlBar(&m_wndToolBar, AFX_IDW_DOCKBAR_TOP);
	DockControlBarLeftOf(&m_wndAsmToolBar, &m_wndToolBar);
	#ifdef TPFSYS
	DockControlBarLeftOf(&m_wndDebugBar, &m_wndAsmToolBar);
	#endif

	// Load user preferences for all Control Bars
	LoadBarState(_T("General"));			 

---------------------------
void CMainFrame::DockControlBarLeftOf(CControlBar* Bar,CControlBar* 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);
}
-----From: John Lundy 

Casey,

        I have had to deal with this very issue before. The only way I could
get the toolbars placed like I wanted them was to override RecalcLayout in
my frame window. Here is a code snippet that shows what I did.


void CMainFrame::RecalcLayout(BOOL bNotify) 
{
	// Call the default function first!
        CFrameWnd::RecalcLayout(bNotify);

// m_wndToolBar[] is an array of toolbar handles
// m_ToolRect[] is an array of rectangles where the toolbars "should" be

        for (i=0 ; i < NumberOfToolbars ; i++)
        {
                m_wndToolBar[i].MoveWindow(&m_ToolRect, bNotify);
        }
}


        Hope this will help you out.

John Lundy
====================================================
John Lundy, Windows (16/32 bit) Software Developer
At Home Entertainment
Specializing in GUI, Multimedia and Game Development
====================================================




| Вернуться в корень Архива |