Visual C++ 6 에서 새롭게 지원된 MFC App Wizard 옵션은 바로 다큐먼트 뷰 구조를 사용하지 않고 SDI나 MDI를 할 수 있다는 것입니다.
다큐먼트 뷰 구조가 아닐때 스플릿 윈도우를 만드는 방법을 간단히 알아보도록 합니다.
Doc/View 구조 없는 SDI에서 스플릿 윈도우 만들기
다음과 같이 메인 프레임에 스플릿 윈도우 변수를 마련한다.
class CMainFrame : public CFrameWnd
{
public:
CMainFrame();
protected:
DECLARE_DYNAMIC(CMainFrame)
CSplitterWnd m_wndSplitter;
그리고 클래스 위자드를 불러서 OnCreateClient라는 함수를 오버라이드한다.
그후 자신이 올리려는 뷰를 RUNTIME_CLASS를 써서 올리면된다.
이때 문제는 CChildView라는 녀석은 (Non Doc/View에서) CWnd이기 때문에
동적 생성이 안되어 여기에 넣기도 뭐하고 하므로 코드를 삭제해야 한다.
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
// create splitter window
if (!m_wndSplitter.CreateStatic(this, 1, 2))
return FALSE;
if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftMainView), CSize(100, 100), pContext) ||
!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CMainHtmlView), CSize(100, 100), pContext))
{
m_wndSplitter.DestroyWindow();
AfxMessageBox("FALSE wndSpliter");
return FALSE;
}
return CFrameWnd::OnCreateClient(lpcs, pContext);
//return TRUE;
}
CChildView 코드를 삭제하자.
CMainFrame.h에서 삭제
protected: // control bar embedded members
CStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;
CReBar m_wndReBar;
CDialogBar m_wndDlgBar;
//CChildView m_wndView;
CMainFrame.cpp에서 삭제를 해주면 된다.
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// create a view to occupy the client area of the frame
/*if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
{
TRACE0("Failed to create view window\n");
return -1;
}
*/
그리고 그외에 m_wndView 를 쓰는 곳의 코드를 삭제하면 된다.
void CMainFrame::OnSetFocus(CWnd* pOldWnd)
{
// forward focus to the view window
// m_wndView.SetFocus();
}
BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
// let the view have first crack at the command
// if (m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
// return TRUE;
// otherwise, do default handling
return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}