MFC의 CSplitterWnd의 사용법에 대해서 알아보겠습니다.
1단계-Data의 선언
AppWizard로 SDI 어플리케이션을 만듭니다.
Main Frame의 헤더 파일에 CSplitterWnd 객체와 splitter를 관리하기 위한 boolean 플래그를 추가합니다.
CSplitterWnd m_mainSplitter;
BOOL m_bInitSplitter;
m_mainSplitter는 윈도우 화면을 두개로 분할하는데 사용할 것입니다.
m_bInitSplitter는 화면 크기관리 전에 splitter가 설정되었는지 확인해줍니다.
이제 Main Frame의 생성자에서 m_bInitSplitter를 FALSE로 초기화 해줍니다.
2단계-splitter 만들기
splitter window는 main frame 윈도우의 client 영역이 초기화될때 만들어져야 합니다.
그래서 OnCrateClient 메세지 함수를 Main Frame 클래스에 추가하여 splitter를 만드는 코드를 아래와 같이 삽입합니다.
CRect cr;
GetClientRect( &cr );
if(!m_mainSplitter.CreateStatic( this, 1, 2 ) )
{
MessageBox(”분할 프레임 설정에 실패!”);
return FALSE;
}
CreateStatic()의 파라미터는 this는 부모윈도우를 가리키고 숫자는 행과 열을 나타냅니다.
client 사이즈는 잠시후에 사용할 것입니다.
3단계-view 만들기
각 분할 pane은 이제 view에 붙여야만 보입니다.
if( !m_mainSplitter.CreateView( 0, 0, RUNTIME(CSplitterWindowTutorialView), CSize(cr.Width()/2. cr.Height()), pContext)
{
MessageBox(”분할 프레임 설정에 실패”);
return FALSE;
}
if( !m_mainSplitter.CreateView(0, 1, RUNTIME_CLASS(CSplitterWindowTutorialView), CSize(cr.Width()/2, cr.Height()), pContext)
{
MessageBox(”분할 프레임 설정에 실패”);
return FALSE;
}
m_bInitSplitter = TRUE;
여기서 RUNTIME_CLASS를 사용하기 위해서 MainFrame.cpp에 view클래스의 헤더를 추가해줘야 합니다.
그리고 View클래스의 헤더 파일에는 Document클래스의 헤더파일을 추가해줘야 합니다.
4단계-리턴값 바꾸기
return CFrameWnd::OnCreateClient(lpcs, pContext);
를
return TRUE;
로 바꾸어 줍니다.
5단계-리사이즈 관리
splitter들의 사이즈를 관리하기위한 것은 SetRowInfo와 SetColumnInfo로 합니다.
WM_SIZE 메세지의 Handler를 추가해 아래와 같이 추가해줍니다.
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);
CRect cr;
GetWindowRect(&cr);
if(m_bInitSplitter && nType != SIZE_MINIMIZED)
{
m_mainSplitter.SetRowInfo(0, cy, 0);
m_mainSplitter.SetColumnInfo(0, cr.Width()/2, 50);
m_mainSplitter.SetColumnInfo(1, cr.Width()/2, 50);
m_mainSplitter.RecalLayout();
}
}
여기서 처음에 splitter가 초기화가 되었는지 boolean값으로 확인을 합니다.
by Redef( http://www.redef.pe.kr )
1단계-Data의 선언
AppWizard로 SDI 어플리케이션을 만듭니다.
Main Frame의 헤더 파일에 CSplitterWnd 객체와 splitter를 관리하기 위한 boolean 플래그를 추가합니다.
CSplitterWnd m_mainSplitter;
BOOL m_bInitSplitter;
m_mainSplitter는 윈도우 화면을 두개로 분할하는데 사용할 것입니다.
m_bInitSplitter는 화면 크기관리 전에 splitter가 설정되었는지 확인해줍니다.
이제 Main Frame의 생성자에서 m_bInitSplitter를 FALSE로 초기화 해줍니다.
2단계-splitter 만들기
splitter window는 main frame 윈도우의 client 영역이 초기화될때 만들어져야 합니다.
그래서 OnCrateClient 메세지 함수를 Main Frame 클래스에 추가하여 splitter를 만드는 코드를 아래와 같이 삽입합니다.
CRect cr;
GetClientRect( &cr );
if(!m_mainSplitter.CreateStatic( this, 1, 2 ) )
{
MessageBox(”분할 프레임 설정에 실패!”);
return FALSE;
}
CreateStatic()의 파라미터는 this는 부모윈도우를 가리키고 숫자는 행과 열을 나타냅니다.
client 사이즈는 잠시후에 사용할 것입니다.
3단계-view 만들기
각 분할 pane은 이제 view에 붙여야만 보입니다.
if( !m_mainSplitter.CreateView( 0, 0, RUNTIME(CSplitterWindowTutorialView), CSize(cr.Width()/2. cr.Height()), pContext)
{
MessageBox(”분할 프레임 설정에 실패”);
return FALSE;
}
if( !m_mainSplitter.CreateView(0, 1, RUNTIME_CLASS(CSplitterWindowTutorialView), CSize(cr.Width()/2, cr.Height()), pContext)
{
MessageBox(”분할 프레임 설정에 실패”);
return FALSE;
}
m_bInitSplitter = TRUE;
여기서 RUNTIME_CLASS를 사용하기 위해서 MainFrame.cpp에 view클래스의 헤더를 추가해줘야 합니다.
그리고 View클래스의 헤더 파일에는 Document클래스의 헤더파일을 추가해줘야 합니다.
4단계-리턴값 바꾸기
return CFrameWnd::OnCreateClient(lpcs, pContext);
를
return TRUE;
로 바꾸어 줍니다.
5단계-리사이즈 관리
splitter들의 사이즈를 관리하기위한 것은 SetRowInfo와 SetColumnInfo로 합니다.
WM_SIZE 메세지의 Handler를 추가해 아래와 같이 추가해줍니다.
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);
CRect cr;
GetWindowRect(&cr);
if(m_bInitSplitter && nType != SIZE_MINIMIZED)
{
m_mainSplitter.SetRowInfo(0, cy, 0);
m_mainSplitter.SetColumnInfo(0, cr.Width()/2, 50);
m_mainSplitter.SetColumnInfo(1, cr.Width()/2, 50);
m_mainSplitter.RecalLayout();
}
}
여기서 처음에 splitter가 초기화가 되었는지 boolean값으로 확인을 합니다.
by Redef( http://www.redef.pe.kr )
댓글을 달아 주세요