본문 바로가기
C & C++/MFC 컨트롤

[Dialog] 스플리터 윈도우 크기조절

by izen8 2011. 3. 27.
반응형
///////////////////////////////////////////////////////////////////////////////////////////////////

1. 스플리터 윈도우크기 조절

스플리터 윈도우는(분할창, CSplitterWnd) 탐색기와 같은 프로그램 에서 유용하게 사용하는 기능입니다.

프로그램 실행시, 실행도중 각각의 윈도우의 크기를 조절하는 방법을 알아봅니다.

 


 

코드

- MainFrame 에서는 다음과 같은 방법으로 조절합니다.

 

    m_wndSplitter.SetColumnInfo( 0, size, min_size );

    m_wndSplitter.RecalcLayout();

 

 

- View 에서는 다음과 같은 방법으로 조절합니다.

 

    GetParentSplitter( this, FALSE )->SetColumnInfo( 0, size, min_size );

    GetParentSplitter( this, FALSE )->RecalcLayout();

예제

2. 핵심 코드를 추가한다.

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

    …

    // 분할창의크기를조절한다.

    m_wndSplitter.SetColumnInfo( 0, 500, 10 );

    m_wndSplitter.RecalcLayout();

 

    AfxMessageBox( "좌우창을클릭하면분할창의크기가변경됩니다." );

 

    return 0;

}

 

void C_tttView::OnLButtonDown(UINT nFlags, CPoint point)

{

    // 분할창의크기를조절한다.

    GetParentSplitter( this, FALSE )->SetColumnInfo( 0, 300, 10 );

    GetParentSplitter( this, FALSE )->RecalcLayout();

 

    CListView::OnLButtonDown(nFlags, point);

}

 

void C_tttView::OnLButtonDown(UINT nFlags, CPoint point)

{

    // 분할창의크기를조절한다.

    GetParentSplitter( this, FALSE )->SetColumnInfo( 0, 300, 10 );

    GetParentSplitter( this, FALSE )->RecalcLayout();

 

    CListView::OnLButtonDown(nFlags, point);

}

////////////////////////////////////////////////////////////////////////////////
2. 스플리터 윈도우 크기 고정

스플리터 윈도우의 크기를 위치를 고정하는 방법을 설명한다.

스플릿바의 행동양식을 살펴보면 스플리터 윈도우의 크기를 고정하는 방법을 찾을 수 있다.

스플릿바는 WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK 메시지가 넘어 올 때 크기를 조정하도록 설계되어 있다.

그러므로 마우스가 스플릿바 위에 오면 마우스 커서가 변하게 되고 스플릿바 위에서 마우스를 누르면 그때부터 크기를 변경할 수 있게 되는 것이다.

그리고 눌렀던 마우스를 놓으면 크기 변경을 완료하게 된다 따라서 이 네 가지 메시지가 넘어올 때 아무 일도 하지 않도록 하면 됩니다. 즉, 메시지 핸들러를 아무 일도 하지 않도록 작성해 주면 처음 정해진 크기로 고정된다. 마우스가 스플릿바 위로 가도 커서가 변하지 않는 것은 물론이고 스플릿바 위를 클릭해도 크기가 조정되지 않는다.


코드

// 헤더 파일
class CFixedSplitterWnd : public CSplitterWnd {
//. . .
protected:
   //{{AFX_MSG(CFixedSplitterWnd)
   afx_msg void OnMouseMove(UINT nFlags, CPoint point);
   afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
   afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
   afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
  //}}AFX_MSG
   DECLARE_MESSAGE_MAP()
};

//  소스 파일
//. . .
BEGIN_MESSAGE_MAP(CFixedSplitterWnd, CSplitterWnd)
   //{{AFX_MSG_MAP(CFixedSplitterWnd)
   ON_WM_MOUSEMOVE()
   ON_WM_LBUTTONDOWN()
   ON_WM_LBUTTONUP()
   ON_WM_LBUTTONDBLCLK()
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()
//////////////////////////////////////////////////////////////////////
//CFixedSplitterWnd message handlers
void CFixedSplitterWnd::OnMouseMove(UINT nFlags, CPoint point) {
   // TODO:
   // 기본적으로 정의된 함수는 CSplitterWnd::OnMOuseMove(nFlag, point)이다.
   CWnd::OnMouseMove(nFlags, point); // 아무 일도 하지 않는다.
}

void CFixedSplitterWnd::OnLButtonDown(UINT nFlags, CPoint point) {
   // TODO:
   CWnd::OnLButtonDown(nFlags, point);
}

void CFixedSplitterWnd::OnLButtonUp(UINT nFlags, CPoint point) {
   // TODO:
   CWnd::OnLButtonUp(nFlags, point);
}

void CFixedSplitterWnd::OnLButtonDblClk(UINT nFlags, CPoint point) {
   // TODO:
   CWnd::OnLButtonDblClk(nFlags, point);
}

반응형

댓글