[MFC] CSplitterWnd에서 일반 객체로 로드하기


Study/C , C++ , MFC  2013. 2. 22. 09:00

안녕하세요. 명월입니다.

 

이번 포스팅에서는 자주 사용하지는 않지만 그래도 가끔은 이것 때문에 많이 애먹는 사항에 대해서 알아보도록하겠니다. (제목 때문에 한 10분 고민했네요...ㅜㅜ)

 

제목이랑 서문이 거창했는데 먼저 CSplitterWnd 에 대해 간략히 알아보도록 하겠습니다.

 

CSplitterWnd 는 프레임을 쪼개는(?) 클래스로서 화면 분할 할 때 사용되는 클래스 입니다.

 

그런데 이 클래스의 선언 즉, Create 함수에는 RUNTIME_CLASS 가 걸려있습니다.

보통은 Splitter를 초기화 할 때 사용하니 문제는 없습니다. 아니 오히려 편하지요.

그러나 이 RUNTIMECLASS 가 독이 될 때가 있습니다.

즉 Splitter 안의 객체가 화면 전환(?) 할때 문제입니다.

 

화면 전환을 하면 다시 초기화를 해야 하는 건 맞지만 만약 이전으로 돌아가게 되면 기존의 자료는 없어지고 다시 초기화 해야 하는 문제가 발생하지요.

 

그럼 RUNTIMECLASS를 피해서 선언을 해야 하는데 Splitter 자체 내에는 함수가 없습니다.

먼저 객체를 선언하고 리소스를 맞쳐버리면 되겠습니다.

 

그럼 알아보도록 하겠습니다

CEdit* TestEdit = new CEdit();
TestEdit->Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),&m_gSplitter,0);
TestEdit->SetDlgCtrlID(m_gSplitter.IdFromRowCol(0,0));
m_gSplitter.SetRowInfo(0,300,0);
CButton* TestButton = new CButton();
TestButton->Create(NULL,WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),&m_gSplitter,0);
TestButton->SetDlgCtrlID(m_gSplitter.IdFromRowCol(1,0));
return CFrameWnd::OnCreateClient(lpcs, pContext);

위 소스대로 보면 RUNTIMECLASS를 사용하지 않고 외부에서 선언을 하고 직접 Splitter 안에 들어가는 모습입니다. ( 심지어 Edit, Button 도 들어가네요 ㅎㅎ)

 

의외로 이런 걸 모르시는 분들이 많아서 포스팅 했습니다.

SplitterEX.zip