Size of splitter windows.
Syed -- sxs296@psu.edu
Monday, November 04, 1996
Environment : Visual C++ 4.0, Win 95
Hi there,
I try to create three panes from two splitter windows in a CMainFrame and
set up the size of the panes relative to the size of the application as below :-
+------------------------------------+
| | |
| | |
| 1 | 3 |
| | |
| | |
| | |
+-------+ +
+---2---+----------------------------+
<-.33--><---------.66---------------->
So, in CMainFrame::OnCreateClient,
CRect rcRect;
GetClientRect(&rcRect);
if (!m_wndSplitter1.CreateStatic(this, 1, 2) ||
!m_wndSplitter1.CreateView(0,1, RUNTIME_CLASS(CFileView),
CSize((rcRect.Width()*2)/3, rcRect.Height()), pContext) ||
!m_wndSplitter2.CreateStatic(&m_wndSplitter1, 2, 1) ||
!m_wndSplitter2.CreateView(0,0, RUNTIME_CLASS(CDirectoryTree),
CSize(rcRect.Width()/3, rcRect.Height()-10), pContext) ||
!m_wndSplitter2.CreateView(1,0, RUNTIME_CLASS(CDirectoryTree),
CSize(rcRect.Width()/3, 10), pContext))
return FALSE;
return TRUE;
*CFileView & CDirectoryTree are derived from CListView and CTreeView
respectively.*
However the problem is all the panes are not sized correctly. The #3 pane
occupies all of the client area leaving #1 & #2 panes with the dimension of
only 1 pixel x 1 pixel. What goes wrong.? I didn't include the line
CFrameWnd::OnCreateClient because the result would be very strange.
Alex Sevugan -- asevugan@csci.csc.com
Wednesday, November 06, 1996
[Mini-digest: 3 responses]
Hi,
Use the SetColumnInfo function for m_wndSplitter1 Splitter Window to
set
the required width for for Pane 1 and Pane 2. Do this immediately after
creating the splitter windows and before returning from OnCreateClient
function.
Syed wrote:
>
> Environment : Visual C++ 4.0, Win 95
>
> Hi there,
> I try to create three panes from two splitter windows in a CMainFrame and
> set up the size of the panes relative to the size of the application as below :-
> +------------------------------------+
> | | |
> | | |
> | 1 | 3 |
> | | |
> | | |
> | | |
> +-------+ +
> +---2---+----------------------------+
> <-.33--><---------.66---------------->
>
> So, in CMainFrame::OnCreateClient,
> CRect rcRect;
> GetClientRect(&rcRect);
> if (!m_wndSplitter1.CreateStatic(this, 1, 2) ||
> !m_wndSplitter1.CreateView(0,1, RUNTIME_CLASS(CFileView),
> CSize((rcRect.Width()*2)/3, rcRect.Height()), pContext) ||
> !m_wndSplitter2.CreateStatic(&m_wndSplitter1, 2, 1) ||
> !m_wndSplitter2.CreateView(0,0, RUNTIME_CLASS(CDirectoryTree),
> CSize(rcRect.Width()/3, rcRect.Height()-10), pContext) ||
> !m_wndSplitter2.CreateView(1,0, RUNTIME_CLASS(CDirectoryTree),
> CSize(rcRect.Width()/3, 10), pContext))
> return FALSE;
> return TRUE;
>
> *CFileView & CDirectoryTree are derived from CListView and CTreeView
> respectively.*
>
> However the problem is all the panes are not sized correctly. The #3 pane
> occupies all of the client area leaving #1 & #2 panes with the dimension of
> only 1 pixel x 1 pixel. What goes wrong.? I didn't include the line
> CFrameWnd::OnCreateClient because the result would be very strange.
--
-----------------------------------------------
Alaks Sevugan CSC CIS
Technical Consultant 115 North Neil Street
(217) 351-8250 (2161) Champaign, Illinois
asevugan@csci.csc.com 61820
-----------------------------------------------
-----From: "Stephen R. Husak"
I just did this :
look into:
SetRowInfo and SetColumnInfo...
My code is:
{ BOOL bResult = TRUE; // result of the creates of the splitters
RECT rect; // screen coordinates of the window
INT nHeight; // height of the window
INT nWidth; // width of the window
GetWindowRect(&rect);
nHeight = rect.bottom - rect.top - (2 * GetSystemMetrics(SM_CYSIZEFRAME))
- GetSystemMetrics(SM_CYCAPTION) - GetSystemMetrics(SM_CYMENU);
nWidth = rect.right - rect.left - (2 * GetSystemMetrics(SM_CYSIZEFRAME));
// create horizontal splitter and set initial row height for other
splitter area
if (m_wndHorizSplitter.CreateStatic(this, 2, 1) == 0)
bResult = FALSE;
// calculate size of upper portion (a little bit greater than half of
total height)
m_wndHorizSplitter.SetRowInfo(0, ((nHeight * 5) / 8), 0);
// create the command edit view - fits into bottom 3/7 of screen
if (m_wndHorizSplitter.CreateView(1, 0, RUNTIME_CLASS(CCommandEditView),
CSize(nWidth, ((nHeight * 3) / 8)), pContext) == 0)
bResult = FALSE;
// create the horizontal splitter
if (m_wndVertSplitter.CreateStatic(&m_wndHorizSplitter, 1, 2,
WS_CHILD | WS_VISIBLE | WS_BORDER,
m_wndHorizSplitter.IdFromRowCol(0,0)) == 0)
bResult = FALSE;
// create the tree and list views respectively - tree is 1/4 of the width
if (m_wndVertSplitter.CreateView(0, 0, RUNTIME_CLASS(CCodewalkTreeView),
CSize(((nWidth * 1) / 4), ((nHeight * 5) / 8)), pContext) == 0)
bResult = FALSE;
// list view fills in rest of area
if (m_wndVertSplitter.CreateView(0, 1, RUNTIME_CLASS(CCodewalkListView),
CSize(((nWidth * 3) / 4), ((nHeight * 5) / 8)), pContext) == 0)
bResult = FALSE;
// return the result of this creation
return bResult;
}
------------------------
Stephen R. Husak
Sr. Software Engineer
Siemens Medical Systems
-----From: Srinivas Vanga
Don't try to set the size of views while creating them with CreateView() method.
Once after creating the view, set splitter pane's size parameters using SetRowInfo()
and SetColumnInfo().
Example:
m_wndSplitter.CreateView(0,0, RUNTIME_CLASS(CDirectoryTree),
CSize(0,0), pContext);
m_wndSplitter.SetRowInfo();
m_wndSplitter.SetColumnInfo();
| Вернуться в корень Архива
|