Aligning splitter windows

Hi experts :-)

I have a splitter window made of CScrollView & CEditView.  But the windows are not equally splitted. I want the windows to be splitted equally even when it's resized. i.e, maximize and restore.

Also I would  like to align(center) the buttons in cformview.

regards
P R A T H A P




chowdryAsked:
Who is Participating?
 
speedupCommented:
Hi, chowdry.
Here's code for you.

#include <afxpriv.h>

//Add member to CMainFrame
      CMySplitterWnd m_wndSplitter;      
      BOOL m_bInit;// initialized to be FALSE
//Add OnCreateClient()
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
      CRect rect;
      GetClientRect(&rect);
      if (!m_wndSplitter.CreateStatic(this,
            1, 2))          // TODO: adjust the number of rows, columns
      {
            TRACE0("Failed to create split bar ");
            return FALSE;    // failed to create
      }
      m_wndSplitter.CreateView( 0, 0,
            RUNTIME_CLASS( CMyEditView ),
            CSize( rect.Width() / 2, rect.Height() ),
            pContext );
      m_wndSplitter.CreateView( 0, 1,
            RUNTIME_CLASS( CMyScrollView ),
            CSize( rect.Width() / 2, rect.Height() ),
            pContext );
      m_bInit = TRUE;
      return TRUE;
}

//Add function to handle WM_SIZE
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
      CFrameWnd::OnSize(nType, cx, cy);
      if( m_bInit )
      {
            CMyEditView *pEditView = (CMyEditView *)m_wndSplitter.GetPane(
                  0, 0 );
            CMyScrollView *pScrollView = (CMyScrollView *)m_wndSplitter.GetPane(
                  0, 1 );
            CRect rect;
            GetClientRect( &rect );
            int x, y, w, h;
            x = GetSystemMetrics(SM_CXEDGE);
            y = GetSystemMetrics(SM_CYEDGE);
            w = ( rect.Width() - 3 * x ) / 2;
            h =  rect.Height() - GetSystemMetrics( SM_CYCAPTION )
                  - 2 * y;
            AFX_SIZEPARENTPARAMS layout;
            layout.hDWP = ::BeginDeferWindowPos(2);
            AfxRepositionWindow( &layout, pEditView->m_hWnd,
                  CRect( x, y, w + x, h ) );
            AfxRepositionWindow( &layout, pScrollView->m_hWnd,
                  CRect( x + w, y, cx - x, h ) );
            ::EndDeferWindowPos(layout.hDWP);
      }
}


NOTE:
1. You can adjust the sizes of views by the same way in OnSize()
2. In this way, you can't see the splitter bar.But I think you needn't to change views' size
by hand, right? If you really need to adjust size by hand, you can follow the following code.

//Derive CMySplitterWnd from CSplitterWnd
//And next
CMySplitterWnd m_wndSplitter;
//Add function
void CMySplitterWnd::DrawSplitter(const CRect & rect)
{
      CPaintDC dc(this);
      OnDrawSplitter(&dc, splitBox, rect);
}

//rewrite OnSize() like this
.
.
AfxRepositionWindow( &layout, pEditView->m_hWnd,
      CRect( ?, ?, ?, ? ) );
AfxRepositionWindow( &layout, pScrollView->m_hWnd,
      CRect( ?, ?, ?, ? ) );
.
CRect rectSplitter( ?,  ?, ?, ?);
m_wndSplitter.DrawSplitter( rectSplitter );


If there's some problem, contact me directly at chenbo@supresoft.com

Good Luck


0
 
Andy_KeysCommented:
There is no easy way of achieving this.  I would look at adding some code to reposition the splitter when the frame has been resized then do a recalclayout to force the rest to resize.
0
 
chowdryAuthor Commented:
hi experts :-)

I had tried the following two ways.  still it didn't help me.

1st method
---------------
oncreateclient()
{
CRect rect;
      GetClientRect( &rect );
      
      BOOL rtn = msplitwnd.CreateStatic(this, 2, 1);
      rtn |= msplitwnd.CreateView(0, 0, RUNTIME_CLASS(CSecondView), CSize(rect.right/2, rect.bottom/2 ), pContext);
      rtn |= msplitwnd.CreateView(1, 0, RUNTIME_CLASS(CSplitwndView), CSize(100, 100), pContext);

}

2nd method
oncreate()
{
      m_wndToolBar.GetWindowRect( &toolrect );
      ScreenToClient( toolrect );

      m_wndStatusBar.GetWindowRect( &statusrect );
      ScreenToClient( statusrect );

      rect.bottom = rect.bottom ( toolrect.bottom + statusrect.bottom );

      msplitwnd.SetRowInfo( 0 , rect.bottom , 0 );
      msplitwnd.RecalcLayout();

}

regards
P R A T H A P
0
Cloud Class® Course: Amazon Web Services - Basic

Are you thinking about creating an Amazon Web Services account for your business? Not sure where to start? In this course you’ll get an overview of the history of AWS and take a tour of their user interface.

 
chowdryAuthor Commented:
Edited text of question
0
 
chowdryAuthor Commented:
Adjusted points to 25
0
 
Andy_KeysCommented:
Have you tried creating them both with the same size say (10,10)
0
 
chowdryAuthor Commented:
yes, first I had tried with CSize(100, 100).  Since the windows(panes) are not equally distributed (or) splitted, I had tried the other methods.
0
 
speedupCommented:
Adjust points to 50, and I will help.
0
 
chowdryAuthor Commented:
hi speedy,

Iam waiting for u'r answer.

regards
P R A T H A P
0
 
Andy_KeysCommented:
I've just had to do something simliar and setting both size to Rect.W1dth()/2 during creation worked?  ie both my tree and my list view were initially the same size! heres the code I used (which does look much like you were doing anyway!
      m_HorizontalSplitter.CreateStatic( m_pFrameWnd,1,2);
      m_HorizontalSplitter.CreateView(      0,0,
                                                            RUNTIME_CLASS( ExclTreeView ),
                                                            CSize(FrameRect.Width()/2,10),
                                                            NULL);
      m_HorizontalSplitter.CreateView(      0,1,
                                                            RUNTIME_CLASS( ExclListView ),
                                                            CSize(FrameRect.Width()/2,10),
                                                            NULL);

      m_pFrameWnd->RecalcLayout();

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.