어쩌다보니..
CDockablePane을 반으로 나눌일이 생겼다.. . . . . .
CFrameWnd를 나눌 때에 Splitter라는 편리한 클래스가 있는데
CDockablePane에는 먹히지가 않는다..
그래서, Splitter 클래스를 재정의 하는 편법?으로 나눠보고자 한다.
1. CSpitterWndEx 상속받기
헤더에 아래와 같이 정의해주고
class CPaneSplitter : public CSplitterWndEx
{
public :
BOOL AddWindow(int row, int col, CWnd* pWin,CString clsName,DWORD dwStyle,DWORD dwStyleEx, SIZE sizeInit);
};
소스파일에 구현해준다.
BOOL CPaneSplitter::AddWindow(int row, int col, CWnd* pWnd , CString clsName , DWORD dwStyle,DWORD dwStyleEx, SIZE sizeInit)
{
m_pColInfo[col].nIdealSize = sizeInit.cx;
m_pRowInfo[row].nIdealSize = sizeInit.cy;
CRect rect(CPoint(0,0), sizeInit);
if(!pWnd->CreateEx(dwStyleEx,clsName,NULL,dwStyle,rect,this,IdFromRowCol(row, col)))
return FALSE;
return TRUE;
}
2. CDockablePane에서 사용
헤더에서 변수선언해주고
CPaneSplitter m_wndSplitter;
CTreeCtrl m_wndTree;
CListCtrl m_wndList;
소스에 다음과 같이 적어준다.
1) OnCreate(LPCREATESTRUCT lpCreateStruct) 함수 안에 아래 내용 추가
DWORD dwStyle = WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT
| TVS_HASBUTTONS |TVS_EDITLABELS;
DWORD dwStyleEx = 0;
m_wndSplitter.CreateStatic(this,2,1); //가로로 한번 나눈것!
if(!m_wndSplitter.AddWindow(0,0,&m_wndTree,WC_TREEVIEW,dwStyle,dwStyleEx,CSize(100,100)))
return -1;
dwStyle = WS_CHILD | WS_VISIBLE | LVS_ICON | LVS_SHAREIMAGELISTS;
dwStyleEx = 0;
if(!m_wndSplitter.AddWindow(1,0,&m_wndList,WC_LISTVIEW,dwStyle,dwStyleEx,CSize(100,100)))
return -1;
2) OnSize(UINT nType, int cx, int cy) 함수 안에 아래 내용 추가
m_wndSplitter.SetRowInfo(0,(cy)/6, 25); //정확하게 절반으로 나누려면 2, 숫자는 조절가능하다.
m_wndSplitter.SetWindowPos(NULL,rect.left, rect.top , rect.Width() , rect.Height() , SWP_NOZORDER | SWP_NOACTIVATE);
이렇게 하면 CDockablePane을 뚝 자를 수 있다.
단점은
ListCtrl, TreeCtrl 등의 Ctrl만 사용가능하다.. View집어넣으려고 몇시간 삽질했으나 실패했다.
아마 에러가 나는 이유는 AddWindow 함수 내부에서 CreateEx를 하고, 별도의 생성자로 또 Create을 해서 충돌이 나는듯 하다..라고 추측..만 한다-_-.............. (멍청하다 ㅠ)
좀 더 해보고 다시 올려야겠다. ㅜㅠ
그나저나 나도 블로그에 코드 이쁘게 올리는 스크립트나 찾아봐야지. 이렇게 올리니까 뭔가 가독성 최악인듯 ㅜ
댓글남기기