¼¼ ¹æÇâ ºÐÇÒ À©µµ¿ì
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);
}