Solved

Aligning splitter windows

Posted on 1998-05-28
10
453 Views
Last Modified: 2013-11-19
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
Comment
Question by:chowdry
  • 5
  • 3
  • 2
10 Comments
 
LVL 1

Expert Comment

by:Andy_Keys
ID: 1315723
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
 

Author Comment

by:chowdry
ID: 1315724
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
 

Author Comment

by:chowdry
ID: 1315725
Edited text of question
0
Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

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.

 

Author Comment

by:chowdry
ID: 1315726
Adjusted points to 25
0
 
LVL 1

Expert Comment

by:Andy_Keys
ID: 1315727
Have you tried creating them both with the same size say (10,10)
0
 

Author Comment

by:chowdry
ID: 1315728
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
 
LVL 1

Expert Comment

by:speedup
ID: 1315729
Adjust points to 50, and I will help.
0
 

Author Comment

by:chowdry
ID: 1315730
hi speedy,

Iam waiting for u'r answer.

regards
P R A T H A P
0
 
LVL 1

Expert Comment

by:Andy_Keys
ID: 1315731
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
 
LVL 1

Accepted Solution

by:
speedup earned 50 total points
ID: 1315732
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

Networking for the Cloud Era

Join Microsoft and Riverbed for a discussion and demonstration of enhancements to SteelConnect:
-One-click orchestration and cloud connectivity in Azure environments
-Tight integration of SD-WAN and WAN optimization capabilities
-Scalability and resiliency equal to a data center

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction: The undo support, implementing a stack. Continuing from the eigth article about sudoku.   We need a mechanism to keep track of the digits entered so as to implement an undo mechanism.  This should be a ‘Last In First Out’ collec…
Exception Handling is in the core of any application that is able to dignify its name. In this article, I'll guide you through the process of writing a DRY (Don't Repeat Yourself) Exception Handling mechanism, using Aspect Oriented Programming.
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.

820 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question