¼¼ ¹æÇâ ºÐÇÒ À©µµ¿ì

1) Á¤Àû ºÐÇÒ À©µµ¿ì

 ÇϳªÀÇ Á¤Àû ºÐÇÒ Ã¢À» ´Ù¸¥ Á¤Àû ºÐÇÒ Ã¢ÀÇ ±¸È¹µé ÁßÀÇ Çϳª ¾È¿¡ ³¢¿ö ³Ö¾î¼­ ¼¼ ¹æÇâ ºÐÇÒ Ã¢À» ¸¸µé ¼ö ÀÖ´Ù. ´ÙÀ½ÀÇ OnCreateClient() ÇÔ¼ö´Â µÎ °³ÀÇ ±¸È¹ÀÌ ¼öÁ÷À¸·Î ³ª´©¾îÁ® ÀÖ°í, ±× ¿ÞÂÊ ¿­ÀÌ ´Ù½Ã ¼öÆòÀ¸·Î µÎ °³ÀÇ ±¸È¹À¸·Î ³ª´©¾îÁø ¼¼ ¹æÇâ ºÐÇÒ Ã¢À» ¸¸µç´Ù. MainFrm.h¿¡¼­´Â ±½Àº ±Û¾¾ ºÎºÐÀÌ °íÄ£ ºÎºÐÀÌ°í, MainFrm.cpp ÀÇ OnCreateClient()ÇÔ¼ö´Â Àüü¸¦ ±×´ë·Î ŸÀÌÇÎÇØ¾ß ÇÑ´Ù. ±×¸®°í ¿©±â¼­ ¾²ÀÏ ViewµéÀº ¹Ì¸® ¸¸µé¾î ³õ¾Æ¾ß ÇÑ´Ù.

´ÙÀ½Àº OnCreateClient() ÇÔ¼ö¾È¿¡¼­ ¾î¶² ÀÏÀÌ ¹ß»ýÇϴ°¡¿¡ ´ëÇÑ °³¿äÀÌ´Ù.

 1. CreateStaticÀ» ÀÌ¿ëÇÏ¿© ù ¹ø° ºÐÇÒ Ã¢(m_wndSplitter)À» ÇÁ·¹ÀÓ Ã¢¿¡ ¸¸µç´Ù.
   m_wndSplitter´Â ÇϳªÀÇ Çà°ú µÎ °³ÀÇ ¿­À» °¡Áø´Ù.

 2. IdFromRowCol() ÇÔ¼öÀÇ ¸®ÅÏ°ªÀ¸·Î ¿ÞÂÊ paneÀÇ ID¸¦ ¹Þ¾Æ m_IDpane¿¡ ÀúÀåÇÑ´Ù.

 3. µÎ ¹ø° ºÐÇÒâ m_wndSplitter2¸¦ m_wndSplitterÀÇ ¿ÞÂÊ ±¸È¹¿¡ ¸¸µç´Ù.
    m_wndSplitter2´Â ÇÁ·¹ÀÓ Ã¢ÀÇ ÀÚ½Ä À©µµ¿ì°¡ ¾Æ´Ï¶ó m_wndSplitterÀÇ ÀÚ½Ä À©µµ¿ìÀ̹ǷΠ   CreateStatic() ÇÔ¼öÀÇ Ã¹ ¹ø° ÀÎÀÚ·Î m_WndSplitterÀÇ ÁÖ¼Ò°ªÀ» ¹Þ¾Ò´Ù.

 4. °¢ pane¿¡ ¾²ÀÏ ºä¸¦ ¸¸µç´Ù. CreateViewÀÇ Ã¹ ¹ø°¿Í µÎ ¹ø° ÀÎÀÚ´Â ºäÀÇ À§Ä¡, ¼¼¹ø° ÀÎÀÚ´Â ¹Ì¸® ¸¸µé¾î µÎ¾ú´ø ºä¸¦ °¢°¢ÀÇ pane¿¡ µî·ÏÇÏ´Â ¿ªÇÒ, ³× ¹ø° ÀÎÀڴ paneÀÇ Å©±â¸¦ ÁöÁ¤ÇÑ´Ù. ¿©±â¼­´Â Å©±â°¡ ¹Ù²î±â ¶§¹®¿¡ ³× ¹ø° ÀÎÀÚ¸¦ ¾î¶² ¼ýÀÚ·Î ÇÏµç »ó°üÀÌ ¾ø´Ù.  

 5. SetColumnInfo()¿Í SetRowInfo()¸¦ ½á¼­ °¢ paneÀÇ Å©±â¸¦ ÁöÁ¤ÇÑ´Ù.

 6. È°¼ºÃ¢À» ÁöÁ¤ÇÑ´Ù. ÀÌ ºÎºÐÀ» ¾ø¾îµµ »ó°ü¾ø´Ù.

// MainFrm.hÀÇ ÀϺκÐ
class CMainFrame : public CFrameWnd
{
protected: // create from serialization only
        CMainFrame();
        DECLARE_DYNCREATE(CMainFrame)

// Attributes
protected:
        
public:
    CSplitterWnd m_wndSplitter, m_wndSplitter2;

// Operations
private :
        int m_IDpane;

....................

==========================================================

// MainFrm.cpp ÀÇ ÇÑ ºÎºÐ
BOOL CMainFrame::OnCreateClient( LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext)
{   
        // ¼öÁ÷¼±À» ³ª´«´Ù.
        if(!m_wndSplitter.CreateStatic(this, 1, 2)) {
                TRACE0("Fail to left vertical splitter...");
                return FALSE;
        }
        
        m_IDpane = m_wndSplitter.IdFromRowCol(0, 0);
        
        // ¼öÆò¼±À» ³ª´«´Ù.
        if(!m_wndSplitter2.CreateStatic(&m_wndSplitter, 2, 1, WS_CHILD|WS_VISIBLE, m_IDpane)) {
                TRACE0("Fail to left horizontal splitter...");
                return FALSE;
        } // À§ÀÇ Äڵ带 ÅëÇØ 3µîºÐ ÇßÀ½

        // ¿À¸¥ÂÊ ÀÔ·ÂâÀÇ ºä¸¦ ¸¸µë (formview)
        if(!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CInput), CSize(0, 0), pContext)) {
                TRACE0("Fail to create Input Form View...");
                return FALSE;
        }
        
        // Main View (link Ãâ·Â ºä) ¸¦ ¸¸µë(¿ÞÂÊ »ó´Ü)
        if(!m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CPistonView), CSize(800, 200), pContext)) {
                TRACE0("Fail to create MainView...");
                return FALSE;
        }
        
        // Graph Ãâ·Â ºä¸¦ ¸¸µë(¿ÞÂÊ ÇÏ´Ü)
        if(!m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(CGraphView),
                   CSize(800, 10), pContext)) {
                TRACE0("Fail to create GraphView...");
                return FALSE;
        }
        
        // ¼öÁ÷ ºÐÇÒ À©µµ¿ìÀÇ Å©±â
        m_wndSplitter.SetColumnInfo( 0, 550, 20 );
        // ¿ÞÂÊ ¼öÆò ºÐÇÒ À©µµ¿ìÀÇ Å©±â
        m_wndSplitter2.SetRowInfo( 0, 150, 10 );
        
        // È°¼ºÃ¢ ÁöÁ¤
        SetActiveView((CView *)m_wndSplitter2.GetPane(0, 0));
        return TRUE; // Àý´ë·Î parentÀÇ Äڵ带 ½ÇÇàÇÏÁö ¸» °Í
}

 

2) µ¿Àû ºÐÇÒ À©µµ¿ì

- µ¿ÀûºÐÇÒÀÇ ¹®Á¦Á¡

 À§ÀÇ Á¤ÀûºÐÇÒÀÇ ¿¹¿¡¼­ µÎ ¹ø° CreateStatic() ´ë½Å¿¡ Create() ÇÔ¼ö¸¦ »ç¿ëÇϸé Á¤ÀûºÐÇÒ Ã¢ ³»¿¡¼­ µ¿ÀûºÐÇÒ Ã¢À» ³ªÅ¸³¾ ¼ö ÀÖ´Ù.
 ±×·±µ¥, µ¿Àû ºÐÇÒÀÌ ÀϾ ¶§ View°¡ óÀ½ ÀÚ½ÅÀÇ Document¿¡ ¾×¼¼½ºÇÏ·Á°í ÇÏ¸é ¾×¼¼½º ¿À·ù°¡ ¹ß»ýÇÒ ¼ö°¡ ÀÖ´Ù.
 ±× ÀÌÀ¯´Â ÇÁ·¹ÀÓ ¿öÅ©¿¡ ÀÖ´Ù. µ¿ÀûºÐÇÒÀ» ³ª´­ ¶§ CSplitterWnd¿¡ ÀÖ´Â ÄÚµå´Â »õ·Î¿î ±¸È¹¿¡ ´ëÇØ ÇϳªÀÇ View¸¦ ¸¸µé±âÀ§ÇØ NULL pContext Æ÷ÀÎÅ͸¦ °¡Áö°í CreateView¸¦ È£ÃâÇÑ´Ù. pContext°¡ NULLÀ̱⠶§¹®¿¡ CreateView´Â È°¼º View(ÀÔ·Â Æ÷Ä¿½º¸¦ °¡Áø View)¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ À§ÇØ ÇÁ·¹ÀÓâÀ» °Ë»öÇÏ°í, »õ·Î¿î View¸¦ À§ÇÑ ¸ðµ¨·Î ±× View¸¦ »ç¿ëÇÑ´Ù. ±×·±µ¥ ºÐÇÒÀÌ ÀϾ ¶§ ÇÁ·¹ÀÓ¿öÅ©´Â ¸ðµ¨ÀÌ µÇ´Â View°¡ µ¿ÀûºÐÇÒÀÇ ÀÚ½ÄâÀÌ ¾Æ´Ï¶ó´Â °ÍÀ» ¾Ë°Ô µÇ°í, Document¿¡ ¿¬°áµÇÁö ¾ÊÀº "ºó" View¸¦ ¸¸µé°Ô µÈ´Ù. View°¡ óÀ½À¸·Î Document¿¡ ¾×¼¼½ºÇÏ·Á°í ÇÒ ¶§ ¾×¼¼½º ¿À·ù°¡ ¹ß»ýÇÏ°Ô µÉ °ÍÀÌ´Ù.

- ÇØ°áÃ¥
  
 CSplitterWnd ´ë½Å¿¡ ¿©±â¿¡¼­ ÆÄ»ýµÈ CNestedSplitterWnd¸¦ »ç¿ëÇÑ´Ù. µÎ Ŭ·¡½º »çÀÌÀÇ À¯ÀÏÇÑ Â÷ÀÌ´Â »õ·Î¿î ±¸È¹À» ¸¸µé±âÀ§ÇØ ¼öÆòºÐÇÒ Ç¥½ÃÁÙÀ» ²ø¾î´ç±æ ¶§ µÚÀÇ Å¬·¡½º´Â ÇÁ·¹ÀÓ¿öÅ©¿¡ À§ÇØ È£ÃâµÇ´Â °¡»ó SplitRowÇÔ¼ö¸¦ ÀçÁ¤ÀÇ ÇÑ´Ù. SplitRow¸¦ ÀçÁ¤ÀÇÇÏ´Â ¹öÀüÀº ºÐÇÒÀÌ ÀϾ±â Àü¿¡ µ¿ÀûºÐÇÒ Ã¢ÀÇ À§ÂÊ ±¸È¹¿¡ ÀÖ´Â View¸¦ È°¼º View·Î ¸¸µç´Ù. ±×·¡¼­ È°¼º View°¡ Á¤ÀûºÐÇÒâÀÇ ÀÚ½ÄâÀÌ µÉ ¶§ ³ªÅ¸³ª´Â µ¿Àûº¸±ââÀÇ »ý¼º¹®Á¦¸¦ ±³¹¦ÇÏ°Ô ÇÇÇÏ°Ô µÈ´Ù. ´ÙÀ½Àº CNestedSplitterWnd.h¿Í cpp ÆÄÀÏÀÌ´Ù.

// CNestedSplitterWnd.h
//////////////////////////////////////////
#if !defined(AFX_NESTEDSPLITTERWND_H__7E87511F_3C94_11D3_A2B1_CBBA7F687FCA__INCLUDED_)
#define AFX_NESTEDSPLITTERWND_H__7E87511F_3C94_11D3_A2B1_CBBA7F687FCA__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
// NestedSplitterWnd.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CNestedSplitterWnd window

class CNestedSplitterWnd : public CSplitterWnd
{
// Construction
public:
        CNestedSplitterWnd();

// Attributes
public:

// Operations
public:

// Overrides
        // ClassWizard generated virtual function overrides
        //{{AFX_VIRTUAL(CNestedSplitterWnd)
        //}}AFX_VIRTUAL

// Implementation
public:
        virtual ~CNestedSplitterWnd();

        // Generated message map functions
protected:
        virtual BOOL SplitRow(int cyBefore);
        //{{AFX_MSG(CNestedSplitterWnd)
                // NOTE - the ClassWizard will add and remove member functions here.
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
};

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

//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_NESTEDSPLITTERWND_H__7E87511F_3C94_11D3_A2B1_CBBA7F687FCA__INCLUDED_)

================================================================================================

// NestedSplitterWnd.cpp : implementation file
//////////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Split.h"
#include "NestedSplitterWnd.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CNestedSplitterWnd

CNestedSplitterWnd::CNestedSplitterWnd()
{
}

CNestedSplitterWnd::~CNestedSplitterWnd()
{
}


BEGIN_MESSAGE_MAP(CNestedSplitterWnd, CSplitterWnd)
        //{{AFX_MSG_MAP(CNestedSplitterWnd)
                // NOTE - the ClassWizard will add and remove mapping macros here.
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CNestedSplitterWnd message handlers

BOOL CNestedSplitterWnd::SplitRow(int cyBefore)
{
        GetParentFrame()->SetActiveView((CView *)GetPane(0,0));
        return CSplitterWnd::SplitRow(cyBefore);
}