[!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] // $mainframeimpl$: $mainframeclass$ 类的实现 // #include "pch.h" #include "framework.h" #include "$appheader$" #include "$mainframeheader$" [!if PROJECT_STYLE_EXPLORER] [!if APP_TYPE_SDI || APP_TYPE_MTLD] #include "$treeviewheader$" #include "$viewheader$" [!endif] [!endif] #ifdef _DEBUG #define new DEBUG_NEW #endif // $mainframeclass$ [!if APP_TYPE_MDI || !DOCVIEW] IMPLEMENT_DYNAMIC($mainframeclass$, $mainframebaseclass$) [!else] IMPLEMENT_DYNCREATE($mainframeclass$, $mainframebaseclass$) [!endif] [!if TOOLBAR_CUST_USER] const int iMaxUserToolbars = 10; const UINT uiFirstUserToolBarId = AFX_IDW_CONTROLBAR_FIRST + 40; const UINT uiLastUserToolBarId = uiFirstUserToolBarId + iMaxUserToolbars - 1; [!endif] BEGIN_MESSAGE_MAP($mainframeclass$, $mainframebaseclass$) [!if DOCKING_TOOLBAR || TOOLBAR_STYLE_REBAR || MENUBAR_TOOLBAR || RIBBON_TOOLBAR || STATUS_BAR] ON_WM_CREATE() [!else] [!if APP_TYPE_SDI && !DOCVIEW] ON_WM_CREATE() [!endif] [!endif] [!if APP_TYPE_SDI] [!if !DOCVIEW] ON_WM_SETFOCUS() [!endif] [!endif] [!if APP_TYPE_MTLD] ON_COMMAND(ID_FILE_CLOSE, &$mainframeclass$::OnFileClose) [!if !DOCVIEW] ON_WM_CLOSE() [!endif] [!endif] [!if PROJECT_STYLE_EXPLORER] [!if APP_TYPE_SDI || APP_TYPE_MTLD] [!if LIST_VIEW] ON_UPDATE_COMMAND_UI_RANGE(AFX_ID_VIEW_MINIMUM, AFX_ID_VIEW_MAXIMUM, &$mainframeclass$::OnUpdateViewStyles) ON_COMMAND_RANGE(AFX_ID_VIEW_MINIMUM, AFX_ID_VIEW_MAXIMUM, &$mainframeclass$::OnViewStyle) [!endif] [!endif] [!endif] [!if MENUBAR_TOOLBAR || RIBBON_TOOLBAR] [!if APP_TYPE_MDI] ON_COMMAND(ID_WINDOW_MANAGER, &$mainframeclass$::OnWindowManager) [!endif] [!endif] [!if MENUBAR_TOOLBAR] ON_COMMAND(ID_VIEW_CUSTOMIZE, &$mainframeclass$::OnViewCustomize) ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &$mainframeclass$::OnToolbarCreateNew) [!endif] [!if ENABLE_VISUAL_STYLE_SWITCHING] ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &$mainframeclass$::OnApplicationLook) ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &$mainframeclass$::OnUpdateApplicationLook) [!endif] [!if ADV_DOCKING_CAPTION] ON_COMMAND(ID_VIEW_CAPTION_BAR, &$mainframeclass$::OnViewCaptionBar) ON_UPDATE_COMMAND_UI(ID_VIEW_CAPTION_BAR, &$mainframeclass$::OnUpdateViewCaptionBar) ON_COMMAND(ID_TOOLS_OPTIONS, &$mainframeclass$::OnOptions) [!endif] [!if PANE_MENUS_ACTIVATE] [!if ADV_DOCKING_EXPLORER] ON_COMMAND(ID_VIEW_FILEVIEW, &$mainframeclass$::OnViewFileView) ON_UPDATE_COMMAND_UI(ID_VIEW_FILEVIEW, &$mainframeclass$::OnUpdateViewFileView) ON_COMMAND(ID_VIEW_CLASSVIEW, &$mainframeclass$::OnViewClassView) ON_UPDATE_COMMAND_UI(ID_VIEW_CLASSVIEW, &$mainframeclass$::OnUpdateViewClassView) [!endif] [!if ADV_DOCKING_OUTPUT] ON_COMMAND(ID_VIEW_OUTPUTWND, &$mainframeclass$::OnViewOutputWindow) ON_UPDATE_COMMAND_UI(ID_VIEW_OUTPUTWND, &$mainframeclass$::OnUpdateViewOutputWindow) [!endif] [!if ADV_DOCKING_PROPERTIES] ON_COMMAND(ID_VIEW_PROPERTIESWND, &$mainframeclass$::OnViewPropertiesWindow) ON_UPDATE_COMMAND_UI(ID_VIEW_PROPERTIESWND, &$mainframeclass$::OnUpdateViewPropertiesWindow) [!endif] [!endif] [!if PRINTING] [!if RIBBON_TOOLBAR] [!if APP_TYPE_SDI || APP_TYPE_MTLD] ON_COMMAND(ID_FILE_PRINT, &$mainframeclass$::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, &$mainframeclass$::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, &$mainframeclass$::OnFilePrintPreview) ON_UPDATE_COMMAND_UI(ID_FILE_PRINT_PREVIEW, &$mainframeclass$::OnUpdateFilePrintPreview) [!endif] [!endif] [!endif] [!if ADV_DOCKING_OUTPUT] ON_WM_SETTINGCHANGE() [!endif] END_MESSAGE_MAP() [!if STATUS_BAR] [!if !RIBBON_TOOLBAR] static UINT indicators[] = { ID_SEPARATOR, // 状态行指示器 [!if DO_KANA] ID_INDICATOR_KANA, [!endif] ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; [!endif] [!endif] // $mainframeclass$ 构造/析构 $mainframeclass$::$mainframeclass$() noexcept { [!if ACCESSIBILITY] EnableActiveAccessibility(); [!endif] // TODO: 在此添加成员初始化代码 [!if MENUBAR_TOOLBAR || RIBBON_TOOLBAR] [!if ENABLE_VISUAL_STYLE_SWITCHING] theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"), $applicationlookvalue$); [!endif] [!endif] } $mainframeclass$::~$mainframeclass$() { } [!if DOCKING_TOOLBAR || TOOLBAR_STYLE_REBAR || MENUBAR_TOOLBAR || RIBBON_TOOLBAR || STATUS_BAR] int $mainframeclass$::OnCreate(LPCREATESTRUCT lpCreateStruct) { if ($mainframebaseclass$::OnCreate(lpCreateStruct) == -1) return -1; [!if MENUBAR_TOOLBAR || RIBBON_TOOLBAR] BOOL bNameValid; [!endif] [!if APP_TYPE_MDI && APP_TYPE_TABBED_MDI] CMDITabInfo mdiTabParams; mdiTabParams.m_style = CMFCTabCtrl::STYLE_3D_ONENOTE; // 其他可用样式... mdiTabParams.m_bActiveTabCloseButton = TRUE; // 设置为 FALSE 会将关闭按钮放置在选项卡区域的右侧 mdiTabParams.m_bTabIcons = FALSE; // 设置为 TRUE 将在 MDI 选项卡上启用文档图标 mdiTabParams.m_bAutoColor = TRUE; // 设置为 FALSE 将禁用 MDI 选项卡的自动着色 mdiTabParams.m_bDocumentMenu = TRUE; // 在选项卡区域的右边缘启用文档菜单 EnableMDITabbedGroups(TRUE, mdiTabParams); [!endif] [!if MENUBAR_TOOLBAR] if (!m_wndMenuBar.Create(this)) { TRACE0("未能创建菜单栏\n"); return -1; // 未能创建 } m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY); // 防止菜单栏在激活时获得焦点 CMFCPopupMenu::SetForceMenuFocus(FALSE); [!endif] [!if APP_TYPE_SDI] [!if !DOCVIEW] // 创建一个视图以占用框架的工作区 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; } [!endif] [!endif] [!if DOCKING_TOOLBAR || TOOLBAR_STYLE_REBAR || MENUBAR_TOOLBAR] [!if TOOLBAR_STYLE_REBAR] if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT | TBSTYLE_TRANSPARENT) || [!else] if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || [!endif] [!if MENUBAR_TOOLBAR] !m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME)) [!else] !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) [!endif] { TRACE0("未能创建工具栏\n"); return -1; // 未能创建 } [!if MENUBAR_TOOLBAR] CString strToolBarName; bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_STANDARD); ASSERT(bNameValid); m_wndToolBar.SetWindowText(strToolBarName); CString strCustomize; bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE); ASSERT(bNameValid); m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); [!if TOOLBAR_CUST_USER] // 允许用户定义的工具栏操作: InitUserToolbars(nullptr, uiFirstUserToolBarId, uiLastUserToolBarId); [!endif] [!endif] [!if TOOLBAR_STYLE_REBAR] [!if CONTAINER || CONTAINER_SERVER] m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() & ~CBRS_HIDE_INPLACE); [!endif] if (!m_wndDlgBar.Create(this, IDR_MAINFRAME, CBRS_ALIGN_TOP, AFX_IDW_DIALOGBAR)) { TRACE0("未能创建对话栏\n"); return -1; // 未能创建 } if (!m_wndReBar.Create(this) || !m_wndReBar.AddBar(&m_wndToolBar) || !m_wndReBar.AddBar(&m_wndDlgBar)) { TRACE0("未能创建 Rebar\n"); return -1; // 未能创建 } [!if CONTAINER || CONTAINER_SERVER] m_wndReBar.SetBarStyle(m_wndReBar.GetBarStyle() & ~CBRS_HIDE_INPLACE); [!endif] [!endif] [!endif] [!if RIBBON_TOOLBAR] m_wndRibbonBar.Create(this); m_wndRibbonBar.LoadFromResource(IDR_RIBBON); [!endif] [!if STATUS_BAR] if (!m_wndStatusBar.Create(this)) { TRACE0("未能创建状态栏\n"); return -1; // 未能创建 } [!if RIBBON_TOOLBAR] CString strTitlePane1; CString strTitlePane2; bNameValid = strTitlePane1.LoadString(IDS_STATUS_PANE1); ASSERT(bNameValid); bNameValid = strTitlePane2.LoadString(IDS_STATUS_PANE2); ASSERT(bNameValid); m_wndStatusBar.AddElement(new CMFCRibbonStatusBarPane(ID_STATUSBAR_PANE1, strTitlePane1, TRUE), strTitlePane1); m_wndStatusBar.AddExtendedElement(new CMFCRibbonStatusBarPane(ID_STATUSBAR_PANE2, strTitlePane2, TRUE), strTitlePane2); [!else] m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)); [!endif] [!endif] [!if DOCKING_TOOLBAR || TOOLBAR_STYLE_REBAR || MENUBAR_TOOLBAR] [!if TOOLBAR_STYLE_REBAR] // TODO: 如果不需要工具使用技巧,则将此移除 m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY); [!else] [!if MENUBAR_TOOLBAR] // TODO: 如果您不希望工具栏和菜单栏可停靠,请删除这五行 m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY); [!else] // TODO: 如果不需要可停靠工具栏,则删除这三行 [!endif] m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); [!if MENUBAR_TOOLBAR] DockPane(&m_wndMenuBar); [!endif] [!if MENUBAR_TOOLBAR] DockPane(&m_wndToolBar); [!else] DockControlBar(&m_wndToolBar); [!endif] [!endif] [!endif] [!if MENUBAR_TOOLBAR || RIBBON_TOOLBAR] // 启用 Visual Studio 2005 样式停靠窗口行为 CDockingManager::SetDockingMode(DT_SMART); // 启用 Visual Studio 2005 样式停靠窗口自动隐藏行为 EnableAutoHidePanes(CBRS_ALIGN_ANY); [!if ADV_DOCKING_NAVIGATION] // 导航窗格将创建在左侧,因此将暂时禁用左侧的停靠: EnableDocking(CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM | CBRS_ALIGN_RIGHT); // 创建并设置“Outlook”导航栏: if (!CreateOutlookBar(m_wndNavigationBar, ID_VIEW_NAVIGATION, m_wndTree, m_wndCalendar, 250)) { TRACE0("未能创建导航窗格\n"); return -1; // 未能创建 } [!endif] [!if ADV_DOCKING_CAPTION] // 创建标题栏: if (!CreateCaptionBar()) { TRACE0("未能创建标题栏\n"); return -1; // 未能创建 } [!endif] [!if ADV_DOCKING_NAVIGATION] // 已创建 Outlook 栏,应允许在左侧停靠。 EnableDocking(CBRS_ALIGN_LEFT); EnableAutoHidePanes(CBRS_ALIGN_RIGHT); [!endif] [!if ADV_DOCKING_EXPLORER || ADV_DOCKING_OUTPUT || ADV_DOCKING_PROPERTIES] [!if ADV_DOCKING_EXPLORER] // 加载菜单项图像(不在任何标准工具栏上): CMFCToolBar::AddToolBarForImageCollection(IDR_MENU_IMAGES, theApp.m_bHiColorIcons ? IDB_MENU_IMAGES_24 : 0); [!endif] // 创建停靠窗口 if (!CreateDockingWindows()) { TRACE0("未能创建停靠窗口\n"); return -1; } [!if ADV_DOCKING_EXPLORER] m_wndFileView.EnableDocking(CBRS_ALIGN_ANY); m_wndClassView.EnableDocking(CBRS_ALIGN_ANY); DockPane(&m_wndFileView); CDockablePane* pTabbedBar = nullptr; m_wndClassView.AttachToTabWnd(&m_wndFileView, DM_SHOW, TRUE, &pTabbedBar); [!endif] [!if ADV_DOCKING_OUTPUT] m_wndOutput.EnableDocking(CBRS_ALIGN_ANY); DockPane(&m_wndOutput); [!endif] [!if ADV_DOCKING_PROPERTIES] m_wndProperties.EnableDocking(CBRS_ALIGN_ANY); DockPane(&m_wndProperties); [!endif] [!endif] [!if USE_VISUAL_MANAGER] [!if MENUBAR_TOOLBAR || RIBBON_TOOLBAR] [!if !ENABLE_VISUAL_STYLE_SWITCHING] // 设置用于绘制所有用户界面元素的视觉管理器 CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS($visualmanager$)); [!if RIBBON_TOOLBAR] [!if VISUAL_MANAGER_WINDOWS_7] m_wndRibbonBar.SetWindows7Look(TRUE); [!endif] [!endif] [!if USE_VISUAL_STYLE] // 设置视觉管理器使用的视觉样式 CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::$visualstyle$); [!endif] [!else] // 基于持久值设置视觉管理器和样式 OnApplicationLook(theApp.m_nAppLook); [!endif] [!endif] [!endif] [!if APP_TYPE_MDI] // 启用增强的窗口管理对话框 EnableWindowsDialog(ID_WINDOW_MANAGER, ID_WINDOW_MANAGER, TRUE); [!endif] [!if MENUBAR_TOOLBAR] // 启用工具栏和停靠窗口菜单替换 EnablePaneMenu(TRUE, ID_VIEW_CUSTOMIZE, strCustomize, ID_VIEW_TOOLBAR); // 启用快速(按住 Alt 拖动)工具栏自定义 CMFCToolBar::EnableQuickCustomization(); [!if TOOLBAR_CUST_USER] if (CMFCToolBar::GetUserImages() == nullptr) { // 加载用户定义的工具栏图像 if (m_UserImages.Load(_T(".\\UserImages.bmp"))) { CMFCToolBar::SetUserImages(&m_UserImages); } } [!endif] [!if TOOLBAR_CUST_PERSONAL] // 启用菜单个性化(最近使用的命令) // TODO: 定义您自己的基本命令,确保每个下拉菜单至少有一个基本命令。 CList lstBasicCommands; [!if APP_TYPE_MDI || DOCVIEW] lstBasicCommands.AddTail(ID_FILE_NEW); [!endif] [!if DOCVIEW] lstBasicCommands.AddTail(ID_FILE_OPEN); lstBasicCommands.AddTail(ID_FILE_SAVE); [!endif] [!if PRINTING] lstBasicCommands.AddTail(ID_FILE_PRINT); [!endif] lstBasicCommands.AddTail(ID_APP_EXIT); lstBasicCommands.AddTail(ID_EDIT_CUT); lstBasicCommands.AddTail(ID_EDIT_PASTE); lstBasicCommands.AddTail(ID_EDIT_UNDO); [!if OLEDB || ODBC] lstBasicCommands.AddTail(ID_RECORD_NEXT); lstBasicCommands.AddTail(ID_RECORD_LAST); [!endif] lstBasicCommands.AddTail(ID_APP_ABOUT); lstBasicCommands.AddTail(ID_VIEW_STATUS_BAR); lstBasicCommands.AddTail(ID_VIEW_TOOLBAR); [!if APP_TYPE_MTLD] lstBasicCommands.AddTail(ID_FILE_NEW_FRAME); lstBasicCommands.AddTail(ID_FILE_CLOSE); [!endif] [!if RICH_EDIT_VIEW] lstBasicCommands.AddTail(ID_EDIT_SELECT_ALL); lstBasicCommands.AddTail(ID_EDIT_FIND); lstBasicCommands.AddTail(ID_EDIT_REPEAT); lstBasicCommands.AddTail(ID_EDIT_REPLACE); [!endif] [!if ENABLE_VISUAL_STYLE_SWITCHING] lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2003); lstBasicCommands.AddTail(ID_VIEW_APPLOOK_VS_2005); lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_BLUE); lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_SILVER); lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_BLACK); lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_AQUA); lstBasicCommands.AddTail(ID_VIEW_APPLOOK_WINDOWS_7); [!endif] [!if ADV_DOCKING_EXPLORER] lstBasicCommands.AddTail(ID_SORTING_SORTALPHABETIC); lstBasicCommands.AddTail(ID_SORTING_SORTBYTYPE); lstBasicCommands.AddTail(ID_SORTING_SORTBYACCESS); lstBasicCommands.AddTail(ID_SORTING_GROUPBYTYPE); [!endif] [!if CONTAINER || CONTAINER_SERVER] lstBasicCommands.AddTail(ID_OLE_INSERT_NEW); [!endif] CMFCToolBar::SetBasicCommands(lstBasicCommands); [!endif] [!endif] [!endif] [!if APP_TYPE_MDI && APP_TYPE_TABBED_MDI] // 将文档名和应用程序名称在窗口标题栏上的顺序进行交换。这 // 将改进任务栏的可用性,因为显示的文档名带有缩略图。 ModifyStyle(0, FWS_PREFIXTITLE); [!endif] return 0; } [!else] [!if APP_TYPE_SDI && !DOCVIEW] int $mainframeclass$::OnCreate(LPCREATESTRUCT lpCreateStruct) { if ($mainframebaseclass$::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; } [!endif] [!endif] [!if SPLITTER || PROJECT_STYLE_EXPLORER] [!if APP_TYPE_SDI || APP_TYPE_MTLD] BOOL $mainframeclass$::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] } [!endif] [!endif] BOOL $mainframeclass$::PreCreateWindow(CREATESTRUCT& cs) { if( !$mainframebaseclass$::PreCreateWindow(cs) ) return FALSE; // TODO: 在此处通过修改 // CREATESTRUCT cs 来修改窗口类或样式 [!if !MAIN_FRAME_DEFAULT_STYLES] cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE $mainframestyleflags$; [!endif] [!if APP_TYPE_SDI] [!if !DOCVIEW] cs.dwExStyle &= ~WS_EX_CLIENTEDGE; cs.lpszClass = AfxRegisterWndClass(0); [!endif] [!endif] return TRUE; } [!if ADV_DOCKING_EXPLORER || ADV_DOCKING_OUTPUT || ADV_DOCKING_PROPERTIES] BOOL $mainframeclass$::CreateDockingWindows() { BOOL bNameValid; [!if ADV_DOCKING_EXPLORER] // 创建类视图 CString strClassView; bNameValid = strClassView.LoadString(IDS_CLASS_VIEW); ASSERT(bNameValid); if (!m_wndClassView.Create(strClassView, this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_CLASSVIEW, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI)) { TRACE0("未能创建“类视图”窗口\n"); return FALSE; // 未能创建 } // 创建文件视图 CString strFileView; bNameValid = strFileView.LoadString(IDS_FILE_VIEW); ASSERT(bNameValid); if (!m_wndFileView.Create(strFileView, this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_FILEVIEW, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT| CBRS_FLOAT_MULTI)) { TRACE0("未能创建“文件视图”窗口\n"); return FALSE; // 未能创建 } [!endif] [!if ADV_DOCKING_OUTPUT] // 创建输出窗口 CString strOutputWnd; bNameValid = strOutputWnd.LoadString(IDS_OUTPUT_WND); ASSERT(bNameValid); if (!m_wndOutput.Create(strOutputWnd, this, CRect(0, 0, 100, 100), TRUE, ID_VIEW_OUTPUTWND, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_BOTTOM | CBRS_FLOAT_MULTI)) { TRACE0("未能创建输出窗口\n"); return FALSE; // 未能创建 } [!endif] [!if ADV_DOCKING_PROPERTIES] // 创建属性窗口 CString strPropertiesWnd; bNameValid = strPropertiesWnd.LoadString(IDS_PROPERTIES_WND); ASSERT(bNameValid); if (!m_wndProperties.Create(strPropertiesWnd, this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_PROPERTIESWND, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI)) { TRACE0("未能创建“属性”窗口\n"); return FALSE; // 未能创建 } [!endif] SetDockingWindowIcons(theApp.m_bHiColorIcons); return TRUE; } void $mainframeclass$::SetDockingWindowIcons(BOOL bHiColorIcons) { [!if ADV_DOCKING_EXPLORER] HICON hFileViewIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons ? IDI_FILE_VIEW_HC : IDI_FILE_VIEW), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0); m_wndFileView.SetIcon(hFileViewIcon, FALSE); HICON hClassViewIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons ? IDI_CLASS_VIEW_HC : IDI_CLASS_VIEW), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0); m_wndClassView.SetIcon(hClassViewIcon, FALSE); [!endif] [!if ADV_DOCKING_OUTPUT] HICON hOutputBarIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons ? IDI_OUTPUT_WND_HC : IDI_OUTPUT_WND), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0); m_wndOutput.SetIcon(hOutputBarIcon, FALSE); [!endif] [!if ADV_DOCKING_PROPERTIES] HICON hPropertiesBarIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons ? IDI_PROPERTIES_WND_HC : IDI_PROPERTIES_WND), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0); m_wndProperties.SetIcon(hPropertiesBarIcon, FALSE); [!endif] [!if APP_TYPE_MDI && APP_TYPE_TABBED_MDI] UpdateMDITabbedBarsIcons(); [!endif] } [!endif] [!if ADV_DOCKING_NAVIGATION] BOOL $mainframeclass$::CreateOutlookBar(CMFCOutlookBar& bar, UINT uiID, CMFCShellTreeCtrl& tree, CCalendarBar& calendar, int nInitialWidth) { bar.SetMode2003(); BOOL bNameValid; CString strTemp; bNameValid = strTemp.LoadString(IDS_SHORTCUTS); ASSERT(bNameValid); if (!bar.Create(strTemp, this, CRect(0, 0, nInitialWidth, 32000), uiID, WS_CHILD | WS_VISIBLE | CBRS_LEFT)) { return FALSE; // 未能创建 } CMFCOutlookBarTabCtrl* pOutlookBar = (CMFCOutlookBarTabCtrl*)bar.GetUnderlyingWindow(); if (pOutlookBar == nullptr) { ASSERT(FALSE); return FALSE; } pOutlookBar->EnableInPlaceEdit(TRUE); static UINT uiPageID = 1; // 可浮动,可自动隐藏,可调整大小,但不能关闭 DWORD dwStyle = AFX_CBRS_FLOAT | AFX_CBRS_AUTOHIDE | AFX_CBRS_RESIZE; CRect rectDummy(0, 0, 0, 0); const DWORD dwTreeStyle = WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS; tree.Create(dwTreeStyle, rectDummy, &bar, 1200); bNameValid = strTemp.LoadString(IDS_FOLDERS); ASSERT(bNameValid); pOutlookBar->AddControl(&tree, strTemp, 2, TRUE, dwStyle); calendar.Create(rectDummy, &bar, 1201); bNameValid = strTemp.LoadString(IDS_CALENDAR); ASSERT(bNameValid); pOutlookBar->AddControl(&calendar, strTemp, 3, TRUE, dwStyle); bar.SetPaneStyle(bar.GetPaneStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); pOutlookBar->SetImageList(theApp.m_bHiColorIcons ? IDB_PAGES_HC : IDB_PAGES, 24); pOutlookBar->SetToolbarImageList(theApp.m_bHiColorIcons ? IDB_PAGES_SMALL_HC : IDB_PAGES_SMALL, 16); pOutlookBar->RecalcLayout(); BOOL bAnimation = theApp.GetInt(_T("OutlookAnimation"), TRUE); CMFCOutlookBarTabCtrl::EnableAnimation(bAnimation); bar.SetButtonsFont(&afxGlobalData.fontBold); return TRUE; } [!endif] [!if ADV_DOCKING_CAPTION] BOOL $mainframeclass$::CreateCaptionBar() { if (!m_wndCaptionBar.Create(WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, this, ID_VIEW_CAPTION_BAR, -1, TRUE)) { TRACE0("未能创建标题栏\n"); return FALSE; } BOOL bNameValid; CString strTemp, strTemp2; bNameValid = strTemp.LoadString(IDS_CAPTION_BUTTON); ASSERT(bNameValid); m_wndCaptionBar.SetButton(strTemp, ID_TOOLS_OPTIONS, CMFCCaptionBar::ALIGN_LEFT, FALSE); bNameValid = strTemp.LoadString(IDS_CAPTION_BUTTON_TIP); ASSERT(bNameValid); m_wndCaptionBar.SetButtonToolTip(strTemp); bNameValid = strTemp.LoadString(IDS_CAPTION_TEXT); ASSERT(bNameValid); m_wndCaptionBar.SetText(strTemp, CMFCCaptionBar::ALIGN_LEFT); m_wndCaptionBar.SetBitmap(IDB_INFO, RGB(255, 255, 255), FALSE, CMFCCaptionBar::ALIGN_LEFT); bNameValid = strTemp.LoadString(IDS_CAPTION_IMAGE_TIP); ASSERT(bNameValid); bNameValid = strTemp2.LoadString(IDS_CAPTION_IMAGE_TEXT); ASSERT(bNameValid); m_wndCaptionBar.SetImageToolTip(strTemp, strTemp2); return TRUE; } [!endif] // $mainframeclass$ 诊断 #ifdef _DEBUG void $mainframeclass$::AssertValid() const { $mainframebaseclass$::AssertValid(); } void $mainframeclass$::Dump(CDumpContext& dc) const { $mainframebaseclass$::Dump(dc); } #endif //_DEBUG // $mainframeclass$ 消息处理程序 [!if APP_TYPE_SDI] [!if !DOCVIEW] void $mainframeclass$::OnSetFocus(CWnd* /*pOldWnd*/) { // 将焦点前移到视图窗口 m_wndView.SetFocus(); } BOOL $mainframeclass$::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) { // 让视图第一次尝试该命令 if (m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) return TRUE; // 否则,执行默认处理 return $mainframebaseclass$::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); } [!endif] [!endif] [!if APP_TYPE_SDI || APP_TYPE_MTLD] [!if PROJECT_STYLE_EXPLORER] [!if LIST_VIEW] $viewclass$* $mainframeclass$::GetRightPane() { CWnd* pWnd = m_wndSplitter.GetPane(0, 1); $viewclass$* pView = DYNAMIC_DOWNCAST($viewclass$, pWnd); return pView; } void $mainframeclass$::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 $mainframeclass$::OnViewStyle(UINT nCommandID) { // TODO: 自定义或扩展此代码以处理“视图”菜单中的选项 $viewclass$* pView = GetRightPane(); // 如果右窗格已创建并且是 $viewclass$, // 则处理菜单命令... if (pView != nullptr) { DWORD dwStyle = -1; switch (nCommandID) { case ID_VIEW_LINEUP: { // 要求列表控件与网格对齐 CListCtrl& refListCtrl = pView->GetListCtrl(); refListCtrl.Arrange(LVA_SNAPTOGRID); } break; // 其他命令更改列表控件上的样式 case ID_VIEW_DETAILS: dwStyle = LVS_REPORT; break; case ID_VIEW_SMALLICON: dwStyle = LVS_SMALLICON; break; case ID_VIEW_LARGEICON: dwStyle = LVS_ICON; break; case ID_VIEW_LIST: dwStyle = LVS_LIST; break; } // 更改样式;窗口将自动重新绘制 if (dwStyle != -1) pView->ModifyStyle(LVS_TYPEMASK, dwStyle); } } [!endif] [!endif] [!endif] [!if MENUBAR_TOOLBAR || RIBBON_TOOLBAR] [!if APP_TYPE_MDI] void $mainframeclass$::OnWindowManager() { ShowWindowsDialog(); } [!endif] [!endif] [!if MENUBAR_TOOLBAR] void $mainframeclass$::OnViewCustomize() { CMFCToolBarsCustomizeDialog* pDlgCust = new CMFCToolBarsCustomizeDialog(this, TRUE /* 扫描菜单*/); [!if TOOLBAR_CUST_USER] pDlgCust->EnableUserDefinedToolbars(); [!endif] pDlgCust->Create(); } LRESULT $mainframeclass$::OnToolbarCreateNew(WPARAM wp,LPARAM lp) { LRESULT lres = $mainframebaseclass$::OnToolbarCreateNew(wp,lp); if (lres == 0) { return 0; } CMFCToolBar* pUserToolbar = (CMFCToolBar*)lres; ASSERT_VALID(pUserToolbar); BOOL bNameValid; CString strCustomize; bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE); ASSERT(bNameValid); pUserToolbar->EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); return lres; } [!endif] [!if ENABLE_VISUAL_STYLE_SWITCHING] void $mainframeclass$::OnApplicationLook(UINT id) { CWaitCursor wait; theApp.m_nAppLook = id; switch (theApp.m_nAppLook) { case ID_VIEW_APPLOOK_WIN_2000: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManager)); [!if RIBBON_TOOLBAR] m_wndRibbonBar.SetWindows7Look(FALSE); [!endif] break; case ID_VIEW_APPLOOK_OFF_XP: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOfficeXP)); [!if RIBBON_TOOLBAR] m_wndRibbonBar.SetWindows7Look(FALSE); [!endif] break; case ID_VIEW_APPLOOK_WIN_XP: CMFCVisualManagerWindows::m_b3DTabsXPTheme = TRUE; CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); [!if RIBBON_TOOLBAR] m_wndRibbonBar.SetWindows7Look(FALSE); [!endif] break; case ID_VIEW_APPLOOK_OFF_2003: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2003)); CDockingManager::SetDockingMode(DT_SMART); [!if RIBBON_TOOLBAR] m_wndRibbonBar.SetWindows7Look(FALSE); [!endif] break; case ID_VIEW_APPLOOK_VS_2005: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2005)); CDockingManager::SetDockingMode(DT_SMART); [!if RIBBON_TOOLBAR] m_wndRibbonBar.SetWindows7Look(FALSE); [!endif] break; case ID_VIEW_APPLOOK_VS_2008: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2008)); CDockingManager::SetDockingMode(DT_SMART); [!if RIBBON_TOOLBAR] m_wndRibbonBar.SetWindows7Look(FALSE); [!endif] break; case ID_VIEW_APPLOOK_WINDOWS_7: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows7)); CDockingManager::SetDockingMode(DT_SMART); [!if RIBBON_TOOLBAR] m_wndRibbonBar.SetWindows7Look(TRUE); [!endif] break; default: switch (theApp.m_nAppLook) { case ID_VIEW_APPLOOK_OFF_2007_BLUE: CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue); break; case ID_VIEW_APPLOOK_OFF_2007_BLACK: CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_ObsidianBlack); break; case ID_VIEW_APPLOOK_OFF_2007_SILVER: CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silver); break; case ID_VIEW_APPLOOK_OFF_2007_AQUA: CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua); break; } CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007)); CDockingManager::SetDockingMode(DT_SMART); [!if RIBBON_TOOLBAR] m_wndRibbonBar.SetWindows7Look(FALSE); [!endif] } [!if ADV_DOCKING_OUTPUT] m_wndOutput.UpdateFonts(); [!endif] RedrawWindow(nullptr, nullptr, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME | RDW_ERASE); [!if MENUBAR_TOOLBAR || RIBBON_TOOLBAR] theApp.WriteInt(_T("ApplicationLook"), theApp.m_nAppLook); [!endif] } void $mainframeclass$::OnUpdateApplicationLook(CCmdUI* pCmdUI) { pCmdUI->SetRadio(theApp.m_nAppLook == pCmdUI->m_nID); } [!endif] [!if ADV_DOCKING_CAPTION] void $mainframeclass$::OnViewCaptionBar() { m_wndCaptionBar.ShowWindow(m_wndCaptionBar.IsVisible() ? SW_HIDE : SW_SHOW); RecalcLayout(FALSE); } void $mainframeclass$::OnUpdateViewCaptionBar(CCmdUI* pCmdUI) { pCmdUI->SetCheck(m_wndCaptionBar.IsVisible()); } void $mainframeclass$::OnOptions() { [!if RIBBON_TOOLBAR] CMFCRibbonCustomizeDialog *pOptionsDlg = new CMFCRibbonCustomizeDialog(this, &m_wndRibbonBar); ASSERT(pOptionsDlg != nullptr); pOptionsDlg->DoModal(); delete pOptionsDlg; [!endif] } [!endif] [!if PANE_MENUS_ACTIVATE] [!if ADV_DOCKING_EXPLORER] void $mainframeclass$::OnViewFileView() { // 显示或激活窗格,具体取决于当前状态。 // 只能通过窗格帧上的 [x] 按钮关闭窗格。 m_wndFileView.ShowPane(TRUE, FALSE, TRUE); m_wndFileView.SetFocus(); } void $mainframeclass$::OnUpdateViewFileView(CCmdUI* pCmdUI) { pCmdUI->Enable(TRUE); } void $mainframeclass$::OnViewClassView() { // 显示或激活窗格,具体取决于当前状态。 // 只能通过窗格帧上的 [x] 按钮关闭窗格。 m_wndClassView.ShowPane(TRUE, FALSE, TRUE); m_wndClassView.SetFocus(); } void $mainframeclass$::OnUpdateViewClassView(CCmdUI* pCmdUI) { pCmdUI->Enable(TRUE); } [!endif] [!if ADV_DOCKING_OUTPUT] void $mainframeclass$::OnViewOutputWindow() { // 显示或激活窗格,具体取决于当前状态。 // 只能通过窗格帧上的 [x] 按钮关闭窗格。 m_wndOutput.ShowPane(TRUE, FALSE, TRUE); m_wndOutput.SetFocus(); } void $mainframeclass$::OnUpdateViewOutputWindow(CCmdUI* pCmdUI) { pCmdUI->Enable(TRUE); } [!endif] [!if ADV_DOCKING_PROPERTIES] void $mainframeclass$::OnViewPropertiesWindow() { // 显示或激活窗格,具体取决于当前状态。 // 只能通过窗格帧上的 [x] 按钮关闭窗格。 m_wndProperties.ShowPane(TRUE, FALSE, TRUE); m_wndProperties.SetFocus(); } void $mainframeclass$::OnUpdateViewPropertiesWindow(CCmdUI* pCmdUI) { pCmdUI->Enable(TRUE); } [!endif] [!endif] [!if APP_TYPE_MTLD || MENUBAR_TOOLBAR && TOOLBAR_CUST_USER] BOOL $mainframeclass$::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle, CWnd* pParentWnd, CCreateContext* pContext) { // 基类将执行真正的工作 if (!$mainframebaseclass$::LoadFrame(nIDResource, dwDefaultStyle, pParentWnd, pContext)) { return FALSE; } [!if APP_TYPE_MTLD] CWinApp* pApp = AfxGetApp(); if (pApp->m_pMainWnd == nullptr) pApp->m_pMainWnd = this; [!if !RIBBON_TOOLBAR && !MENUBAR_TOOLBAR] // 用辅助窗口的“关闭”替换“文件”菜单上的“退出”选项 if (AfxGetApp()->m_pMainWnd != this) { CMenu *pMenu = GetMenu(); ASSERT(pMenu); BOOL bNameValid; CString strTemp; bNameValid = strTemp.LoadString(IDS_CLOSE); ASSERT(bNameValid); pMenu->ModifyMenu(ID_APP_EXIT, MF_BYCOMMAND | MF_STRING, ID_FILE_CLOSE, strTemp); } [!endif] [!endif] [!if MENUBAR_TOOLBAR && TOOLBAR_CUST_USER] // 为所有用户工具栏启用自定义按钮 BOOL bNameValid; CString strCustomize; bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE); ASSERT(bNameValid); for (int i = 0; i < iMaxUserToolbars; i ++) { CMFCToolBar* pUserToolbar = GetUserToolBarByIndex(i); if (pUserToolbar != nullptr) { pUserToolbar->EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); } } [!endif] return TRUE; } [!if APP_TYPE_MTLD] void $mainframeclass$::OnFileClose() { DestroyWindow(); } [!if !DOCVIEW] void $mainframeclass$::OnClose() { $appclass$ *pApp = reinterpret_cast<$appclass$*>(AfxGetApp()); // 主窗口正在关闭,因此执行清理工作 if (pApp->m_pMainWnd == this) { for (int iCntr=0; iCntr < pApp->m_aryFrames.GetSize(); iCntr++) { HWND hFrame = pApp->m_aryFrames.GetAt(iCntr); if (::IsWindow(hFrame)) ::SendMessage(hFrame, WM_CLOSE, 0, 0); } } CFrameWnd::OnClose(); } [!endif] [!endif] [!endif] [!if PRINTING] [!if RIBBON_TOOLBAR] [!if APP_TYPE_SDI || APP_TYPE_MTLD] void $mainframeclass$::OnFilePrint() { if (IsPrintPreview()) { PostMessage(WM_COMMAND, AFX_ID_PREVIEW_PRINT); } } void $mainframeclass$::OnFilePrintPreview() { if (IsPrintPreview()) { PostMessage(WM_COMMAND, AFX_ID_PREVIEW_CLOSE); // 强制关闭“打印预览”模式 } } void $mainframeclass$::OnUpdateFilePrintPreview(CCmdUI* pCmdUI) { pCmdUI->SetCheck(IsPrintPreview()); } [!endif] [!endif] [!endif] [!if ADV_DOCKING_OUTPUT] void $mainframeclass$::OnSettingChange(UINT uFlags, LPCTSTR lpszSection) { $mainframebaseclass$::OnSettingChange(uFlags, lpszSection); m_wndOutput.UpdateFonts(); } [!endif]