[!if RIBBON_TOOLBAR] // 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面 // (“Fluent UI”)。该示例仅供参考, // 用以补充《Microsoft 基础类参考》和 // MFC C++ 库软件随附的相关电子文档。 // 复制、使用或分发 Fluent UI 的许可条款是单独提供的。 // 若要了解有关 Fluent UI 许可计划的详细信息,请访问 // https://go.microsoft.com/fwlink/?LinkId=238214. // // 版权所有(C) Microsoft Corporation // 保留所有权利。 [!endif] // $childframeimpl$: $childframeclass$ 类的实现 // #include "pch.h" #include "framework.h" #include "$appheader$" #include "$childframeheader$" [!if PROJECT_STYLE_EXPLORER] #include "$treeviewheader$" #include "$viewheader$" [!endif] #ifdef _DEBUG #define new DEBUG_NEW #endif // $childframeclass$ IMPLEMENT_DYNCREATE($childframeclass$, $childframebaseclass$) BEGIN_MESSAGE_MAP($childframeclass$, $childframebaseclass$) [!if !DOCVIEW] ON_COMMAND(ID_FILE_CLOSE, &$childframeclass$::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, &$childframeclass$::OnUpdateViewStyles) ON_COMMAND_RANGE(AFX_ID_VIEW_MINIMUM, AFX_ID_VIEW_MAXIMUM, &$childframeclass$::OnViewStyle) [!endif] [!endif] [!if PRINTING] [!if RIBBON_TOOLBAR] ON_COMMAND(ID_FILE_PRINT, &$childframeclass$::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, &$childframeclass$::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, &$childframeclass$::OnFilePrintPreview) ON_UPDATE_COMMAND_UI(ID_FILE_PRINT_PREVIEW, &$childframeclass$::OnUpdateFilePrintPreview) [!endif] [!endif] END_MESSAGE_MAP() // $childframeclass$ 构造/析构 $childframeclass$::$childframeclass$() noexcept { [!if ACCESSIBILITY] EnableActiveAccessibility(); [!endif] // TODO: 在此添加成员初始化代码 } $childframeclass$::~$childframeclass$() { } [!if APP_TYPE_MDI && SPLITTER] BOOL $childframeclass$::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($treeviewclass$), CSize(100, 100), pContext) || !m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS($viewclass$), 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 $childframeclass$::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext) { // 创建拆分器窗口 if (!m_wndSplitter.CreateStatic(this, 1, 2)) return FALSE; if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS($treeviewclass$), CSize(100, 100), pContext) || !m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS($viewclass$), CSize(100, 100), pContext)) { m_wndSplitter.DestroyWindow(); return FALSE; } return TRUE; } [!endif] [!endif] BOOL $childframeclass$::PreCreateWindow(CREATESTRUCT& cs) { // TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或样式 if( !$childframebaseclass$::PreCreateWindow(cs) ) return FALSE; [!if !CHILD_FRAME_DEFAULT_STYLES] cs.style = WS_CHILD | WS_VISIBLE | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | FWS_ADDTOTITLE$childframestyleflags$; [!endif] [!if !DOCVIEW] cs.dwExStyle &= ~WS_EX_CLIENTEDGE; cs.lpszClass = AfxRegisterWndClass(0); [!endif] return TRUE; } // $childframeclass$ 诊断 #ifdef _DEBUG void $childframeclass$::AssertValid() const { $childframebaseclass$::AssertValid(); } void $childframeclass$::Dump(CDumpContext& dc) const { $childframebaseclass$::Dump(dc); } #endif //_DEBUG // $childframeclass$ 消息处理程序 [!if PROJECT_STYLE_EXPLORER] [!if LIST_VIEW] $viewclass$* $childframeclass$::GetRightPane() { CWnd* pWnd = m_wndSplitter.GetPane(0, 1); $viewclass$* pView = DYNAMIC_DOWNCAST($viewclass$, pWnd); return pView; } void $childframeclass$::OnUpdateViewStyles(CCmdUI* pCmdUI) { if (!pCmdUI) return; // TODO: 自定义或扩展此代码以处理“视图”菜单上的选项。 $viewclass$* pView = GetRightPane(); // 如果右窗格尚未创建或者不是视图,则禁用此范围内的命令 if (pView == nullptr) 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 $childframeclass$::OnViewStyle(UINT nCommandID) { // TODO: 自定义或扩展此代码以处理“视图”菜单上的选项。 $viewclass$* pView = GetRightPane(); // 如果右窗格已创建并且是 $viewclass$,则处理菜单命令... if (pView != nullptr) { int nStyle = -1; switch (nCommandID) { case ID_VIEW_LINEUP: { // 要求列表控件与网格对齐 CListCtrl& refListCtrl = pView->GetListCtrl(); refListCtrl.Arrange(LVA_SNAPTOGRID); } break; // 其他命令更改列表控件上的样式 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 $childframeclass$::OnFileClose() { // 若要关闭框架,只需发送 WM_CLOSE, // 这相当于从系统菜单中选择关闭。 SendMessage(WM_CLOSE); } int $childframeclass$::OnCreate(LPCREATESTRUCT lpCreateStruct) { if ($childframebaseclass$::OnCreate(lpCreateStruct) == -1) return -1; // 创建一个视图以占用框架的工作区 if (!m_wndView.Create(nullptr, nullptr, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, nullptr)) { TRACE0("未能创建视图窗口\n"); return -1; } return 0; } void $childframeclass$::OnSetFocus(CWnd* pOldWnd) { $childframebaseclass$::OnSetFocus(pOldWnd); m_wndView.SetFocus(); } BOOL $childframeclass$::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) { // 让视图第一次尝试该命令 if (m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) return TRUE; // 否则,执行默认处理 return $childframebaseclass$::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); } [!endif] [!if PRINTING] [!if RIBBON_TOOLBAR] void $childframeclass$::OnFilePrint() { if (m_dockManager.IsPrintPreviewValid()) { PostMessage(WM_COMMAND, AFX_ID_PREVIEW_PRINT); } } void $childframeclass$::OnFilePrintPreview() { if (m_dockManager.IsPrintPreviewValid()) { PostMessage(WM_COMMAND, AFX_ID_PREVIEW_CLOSE); // 强制关闭“打印预览”模式 } } void $childframeclass$::OnUpdateFilePrintPreview(CCmdUI* pCmdUI) { pCmdUI->SetCheck(m_dockManager.IsPrintPreviewValid()); } [!endif] [!endif]