// [!output CHILD_FRAME_IMPL] : [!output CHILD_FRAME_CLASS] 클래스의 구현 // #include "stdafx.h" #include "[!output APP_HEADER]" #include "[!output CHILD_FRAME_HEADER]" [!if PROJECT_STYLE_EXPLORER] #include "[!output TREE_VIEW_HEADER]" #include "[!output VIEW_HEADER]" [!endif] #ifdef _DEBUG #define new DEBUG_NEW #endif // [!output CHILD_FRAME_CLASS] IMPLEMENT_DYNCREATE([!output CHILD_FRAME_CLASS], [!output CHILD_FRAME_BASE_CLASS]) BEGIN_MESSAGE_MAP([!output CHILD_FRAME_CLASS], [!output CHILD_FRAME_BASE_CLASS]) [!if !DOCVIEW] ON_COMMAND(ID_FILE_CLOSE, &[!output CHILD_FRAME_CLASS]::OnFileClose) ON_WM_SETFOCUS() ON_WM_CREATE() [!endif] [!if PROJECT_STYLE_EXPLORER] [!if LIST_VIEW] ON_UPDATE_COMMAND_UI_RANGE(AFX_ID_VIEW_MINIMUM, AFX_ID_VIEW_MAXIMUM, &[!output CHILD_FRAME_CLASS]::OnUpdateViewStyles) ON_COMMAND_RANGE(AFX_ID_VIEW_MINIMUM, AFX_ID_VIEW_MAXIMUM, &[!output CHILD_FRAME_CLASS]::OnViewStyle) [!endif] [!endif] END_MESSAGE_MAP() // [!output CHILD_FRAME_CLASS] 생성/소멸 [!output CHILD_FRAME_CLASS]::[!output CHILD_FRAME_CLASS]() { [!if ACCESSIBILITY] EnableActiveAccessibility(); [!endif] // TODO: 여기에 멤버 초기화 코드를 추가합니다. } [!output CHILD_FRAME_CLASS]::~[!output CHILD_FRAME_CLASS]() { } [!if APP_TYPE_MDI && SPLITTER] BOOL [!output CHILD_FRAME_CLASS]::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext) { [!if PROJECT_STYLE_EXPLORER] // 분할 창을 만듭니다. if (!m_wndSplitter.CreateStatic(this, 1, 2)) return FALSE; if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS([!output TREE_VIEW_CLASS]), CSize(100, 100), pContext) || !m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS([!output VIEW_CLASS]), CSize(100, 100), pContext)) { m_wndSplitter.DestroyWindow(); return FALSE; } return TRUE; [!else] [!if HTML_VIEW || HTML_EDITVIEW] return m_wndSplitter.Create(this, 2, 2, // TODO: 행 및 열의 개수를 조정합니다. CSize(10, 10), // TODO: 최소 창 크기를 조정합니다. pContext, WS_CHILD | WS_VISIBLE | SPLS_DYNAMIC_SPLIT); [!else] return m_wndSplitter.Create(this, 2, 2, // TODO: 행 및 열의 개수를 조정합니다. CSize(10, 10), // TODO: 최소 창 크기를 조정합니다. pContext); [!endif] [!endif] } [!else] [!if PROJECT_STYLE_EXPLORER] BOOL [!output CHILD_FRAME_CLASS]::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext) { // 분할 창을 만듭니다. if (!m_wndSplitter.CreateStatic(this, 1, 2)) return FALSE; if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS([!output TREE_VIEW_CLASS]), CSize(100, 100), pContext) || !m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS([!output VIEW_CLASS]), CSize(100, 100), pContext)) { m_wndSplitter.DestroyWindow(); return FALSE; } return TRUE; } [!endif] [!endif] BOOL [!output CHILD_FRAME_CLASS]::PreCreateWindow(CREATESTRUCT& cs) { // TODO: CREATESTRUCT cs를 수정하여 여기에서 Window 클래스 또는 스타일을 수정합니다. if( ![!output CHILD_FRAME_BASE_CLASS]::PreCreateWindow(cs) ) return FALSE; [!if !CHILD_FRAME_DEFAULT_STYLES] cs.style = WS_CHILD | WS_VISIBLE | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | FWS_ADDTOTITLE[!output CHILD_FRAME_STYLE_FLAGS]; [!endif] [!if !DOCVIEW] cs.dwExStyle &= ~WS_EX_CLIENTEDGE; cs.lpszClass = AfxRegisterWndClass(0); [!endif] return TRUE; } // [!output CHILD_FRAME_CLASS] 진단 #ifdef _DEBUG void [!output CHILD_FRAME_CLASS]::AssertValid() const { [!output CHILD_FRAME_BASE_CLASS]::AssertValid(); } #endif //_DEBUG // [!output CHILD_FRAME_CLASS] 메시지 처리기 [!if PROJECT_STYLE_EXPLORER] [!if LIST_VIEW] [!output VIEW_CLASS]* [!output CHILD_FRAME_CLASS]::GetRightPane() { CWnd* pWnd = m_wndSplitter.GetPane(0, 1); [!output VIEW_CLASS]* pView = DYNAMIC_DOWNCAST([!output VIEW_CLASS], pWnd); return pView; } void [!output CHILD_FRAME_CLASS]::OnUpdateViewStyles(CCmdUI* pCmdUI) { if (!pCmdUI) return; // TODO: 이 코드를 사용자 지정하거나 확장하여 [보기] 메뉴에서의 선택을 처리합니다. [!output VIEW_CLASS]* pView = GetRightPane(); // 오른쪽 창이 만들어지지 않았거나 뷰가 아닌 경우 해당 범위에 있는 명령을 비활성화합니다. if (pView == NULL) pCmdUI->Enable(FALSE); else { DWORD dwStyle = pView->GetStyle() & LVS_TYPEMASK; // 명령이 ID_VIEW_LINEUP이면 // LVS_ICON 또는 LVS_SMALLICON 모드인 경우에만 이 명령을 활성화합니다. if (pCmdUI->m_nID == ID_VIEW_LINEUP) { if (dwStyle == LVS_ICON || dwStyle == LVS_SMALLICON) pCmdUI->Enable(); else pCmdUI->Enable(FALSE); } else { // 그렇지 않으면 점을 사용하여 뷰의 스타일을 반영합니다. pCmdUI->Enable(); BOOL bChecked = FALSE; switch (pCmdUI->m_nID) { case ID_VIEW_DETAILS: bChecked = (dwStyle == LVS_REPORT); break; case ID_VIEW_SMALLICON: bChecked = (dwStyle == LVS_SMALLICON); break; case ID_VIEW_LARGEICON: bChecked = (dwStyle == LVS_ICON); break; case ID_VIEW_LIST: bChecked = (dwStyle == LVS_LIST); break; default: bChecked = FALSE; break; } pCmdUI->SetRadio(bChecked ? 1 : 0); } } } void [!output CHILD_FRAME_CLASS]::OnViewStyle(UINT nCommandID) { // TODO: 이 코드를 사용자 지정하거나 확장하여 [보기] 메뉴에서의 선택을 처리합니다. [!output VIEW_CLASS]* pView = GetRightPane(); // 오른쪽 창이 만들어졌고 [!output VIEW_CLASS]이면 메뉴 명령을 처리합니다. if (pView != NULL) { int nStyle = -1; switch (nCommandID) { case ID_VIEW_LINEUP: { // list 컨트롤을 모눈에 맞춥니다. CListCtrl& refListCtrl = pView->GetListCtrl(); refListCtrl.Arrange(LVA_SNAPTOGRID); } break; // 다른 명령에서 list 컨트롤의 스타일을 변경합니다. case ID_VIEW_DETAILS: nStyle = LVS_REPORT; break; case ID_VIEW_SMALLICON: nStyle = LVS_SMALLICON; break; case ID_VIEW_LARGEICON: nStyle = LVS_ICON; break; case ID_VIEW_LIST: nStyle = LVS_LIST; break; } // 스타일을 변경합니다. 창이 자동으로 다시 그려집니다. if (nStyle != -1) pView->ModifyStyle(LVS_TYPEMASK, nStyle); } } [!endif] [!endif] [!if !DOCVIEW] void [!output CHILD_FRAME_CLASS]::OnFileClose() { // 프레임을 닫으려면 WM_CLOSE를 보내면 됩니다. // 시스템 메뉴에서 닫기를 선택하는 것과 동일합니다. SendMessage(WM_CLOSE); } int [!output CHILD_FRAME_CLASS]::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1) return -1; // 프레임의 클라이언트 영역을 차지하는 뷰를 만듭니다. if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL)) { TRACE0("뷰 창을 만들지 못했습니다.\n"); return -1; } return 0; } void [!output CHILD_FRAME_CLASS]::OnSetFocus(CWnd* pOldWnd) { CMDIChildWnd::OnSetFocus(pOldWnd); m_wndView.SetFocus(); } BOOL [!output CHILD_FRAME_CLASS]::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) { // 뷰에서 첫째 크랙이 해당 명령에 나타나도록 합니다. if (m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) return TRUE; // 그렇지 않으면 기본 처리합니다. return CMDIChildWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); } [!endif]