Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 477
  • Last Modified:

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




0
chowdry
Asked:
chowdry
  • 5
  • 3
  • 2
1 Solution
 
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
 
chowdryAuthor Commented:
Edited text of question
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
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
 
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

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 5
  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now