MainFrm.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. 
  2. // MainFrm.cpp: CMainFrame 类的实现
  3. //
  4. #include "pch.h"
  5. #include "framework.h"
  6. #include "CTSManager.h"
  7. #include "MainFrm.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #endif
  11. // CMainFrame
  12. IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWndEx)
  13. const int iMaxUserToolbars = 10;
  14. const UINT uiFirstUserToolBarId = AFX_IDW_CONTROLBAR_FIRST + 40;
  15. const UINT uiLastUserToolBarId = uiFirstUserToolBarId + iMaxUserToolbars - 1;
  16. BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)
  17. ON_WM_CREATE()
  18. ON_COMMAND(ID_WINDOW_MANAGER, &CMainFrame::OnWindowManager)
  19. ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize)
  20. ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::OnToolbarCreateNew)
  21. ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook)
  22. ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdateApplicationLook)
  23. ON_WM_SETTINGCHANGE()
  24. END_MESSAGE_MAP()
  25. static UINT indicators[] =
  26. {
  27. ID_SEPARATOR, // 状态行指示器
  28. ID_INDICATOR_CAPS,
  29. ID_INDICATOR_NUM,
  30. ID_INDICATOR_SCRL,
  31. };
  32. static void DelAllMenu(HMENU hMenu)
  33. {
  34. // 首先删除多余的菜单项
  35. int Menucount = GetMenuItemCount(hMenu);
  36. for (int i = Menucount - 1;i > -1;i--)
  37. {
  38. ::DeleteMenu(hMenu, i, MF_BYPOSITION);
  39. }
  40. }
  41. // CMainFrame 构造/析构
  42. CMainFrame::CMainFrame() noexcept
  43. {
  44. // TODO: 在此添加成员初始化代码
  45. theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"), ID_VIEW_APPLOOK_VS_2008);
  46. }
  47. CMainFrame::~CMainFrame()
  48. {
  49. }
  50. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  51. {
  52. if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1)
  53. return -1;
  54. BOOL bNameValid;
  55. CMDITabInfo mdiTabParams;
  56. mdiTabParams.m_style = CMFCTabCtrl::STYLE_3D_ONENOTE; // 其他可用样式...
  57. mdiTabParams.m_bActiveTabCloseButton = TRUE; // 设置为 FALSE 会将关闭按钮放置在选项卡区域的右侧
  58. mdiTabParams.m_bTabIcons = FALSE; // 设置为 TRUE 将在 MDI 选项卡上启用文档图标
  59. mdiTabParams.m_bAutoColor = TRUE; // 设置为 FALSE 将禁用 MDI 选项卡的自动着色
  60. mdiTabParams.m_bDocumentMenu = TRUE; // 在选项卡区域的右边缘启用文档菜单
  61. EnableMDITabbedGroups(TRUE, mdiTabParams);
  62. if (!m_wndMenuBar.Create(this))
  63. {
  64. TRACE0("未能创建菜单栏\n");
  65. return -1; // 未能创建
  66. }
  67. m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);
  68. // 防止菜单栏在激活时获得焦点
  69. CMFCPopupMenu::SetForceMenuFocus(FALSE);
  70. if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  71. !m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
  72. {
  73. TRACE0("未能创建工具栏\n");
  74. return -1; // 未能创建
  75. }
  76. CString strToolBarName;
  77. bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_STANDARD);
  78. ASSERT(bNameValid);
  79. m_wndToolBar.SetWindowText(strToolBarName);
  80. CString strCustomize;
  81. bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);
  82. ASSERT(bNameValid);
  83. m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);
  84. // 允许用户定义的工具栏操作:
  85. InitUserToolbars(nullptr, uiFirstUserToolBarId, uiLastUserToolBarId);
  86. if (!m_wndStatusBar.Create(this))
  87. {
  88. TRACE0("未能创建状态栏\n");
  89. return -1; // 未能创建
  90. }
  91. m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));
  92. // TODO: 如果您不希望工具栏和菜单栏可停靠,请删除这五行
  93. m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
  94. m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  95. EnableDocking(CBRS_ALIGN_ANY);
  96. DockPane(&m_wndMenuBar);
  97. DockPane(&m_wndToolBar);
  98. // 隐藏掉菜单条;
  99. #if HIDE_MENU_BAR
  100. m_wndMenuBar.ShowPane(FALSE, FALSE, FALSE);
  101. #endif
  102. // 启用 Visual Studio 2005 样式停靠窗口行为
  103. CDockingManager::SetDockingMode(DT_SMART);
  104. // 启用 Visual Studio 2005 样式停靠窗口自动隐藏行为
  105. EnableAutoHidePanes(CBRS_ALIGN_ANY);
  106. // 导航窗格将创建在左侧,因此将暂时禁用左侧的停靠:
  107. EnableDocking(CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM | CBRS_ALIGN_RIGHT);
  108. #if ENABLE_OUTBAR
  109. // 创建并设置“Outlook”导航栏:
  110. if (!CreateOutlookBar(m_wndNavigationBar, ID_VIEW_NAVIGATION, m_wndTree, m_wndCalendar, 250))
  111. {
  112. TRACE0("未能创建导航窗格\n");
  113. return -1; // 未能创建
  114. }
  115. // 已创建 Outlook 栏,应允许在左侧停靠。
  116. EnableDocking(CBRS_ALIGN_LEFT);
  117. EnableAutoHidePanes(CBRS_ALIGN_RIGHT);
  118. #endif
  119. // 加载菜单项图像(不在任何标准工具栏上):
  120. CMFCToolBar::AddToolBarForImageCollection(IDR_MENU_IMAGES, theApp.m_bHiColorIcons ? IDB_MENU_IMAGES_24 : 0);
  121. // 创建停靠窗口
  122. if (!CreateDockingWindows())
  123. {
  124. TRACE0("未能创建停靠窗口\n");
  125. return -1;
  126. }
  127. #if ENABLE_FILE_CLASS
  128. m_wndFileView.EnableDocking(CBRS_ALIGN_ANY);
  129. m_wndClassView.EnableDocking(CBRS_ALIGN_ANY);
  130. DockPane(&m_wndFileView);
  131. CDockablePane* pTabbedBar = nullptr;
  132. m_wndClassView.AttachToTabWnd(&m_wndFileView, DM_SHOW, TRUE, &pTabbedBar);
  133. #endif
  134. #if ENABLE_TITILBAR
  135. m_wndTitleBar.EnableDocking(CBRS_ALIGN_TOP);
  136. DockPane(&m_wndTitleBar);
  137. #endif
  138. m_wndNavBar.EnableDocking(CBRS_ALIGN_LEFT);
  139. DockPane(&m_wndNavBar);
  140. #if ENABLE_OUTPUT
  141. m_wndOutput.EnableDocking(CBRS_ALIGN_ANY);
  142. DockPane(&m_wndOutput);
  143. #endif
  144. m_wndProperties.EnableDocking(CBRS_RIGHT);
  145. DockPane(&m_wndProperties);
  146. // 基于持久值设置视觉管理器和样式
  147. OnApplicationLook(theApp.m_nAppLook);
  148. // 启用增强的窗口管理对话框
  149. EnableWindowsDialog(ID_WINDOW_MANAGER, ID_WINDOW_MANAGER, TRUE);
  150. // 启用工具栏和停靠窗口菜单替换
  151. EnablePaneMenu(TRUE, ID_VIEW_CUSTOMIZE, strCustomize, ID_VIEW_TOOLBAR);
  152. // 启用快速(按住 Alt 拖动)工具栏自定义
  153. CMFCToolBar::EnableQuickCustomization();
  154. if (CMFCToolBar::GetUserImages() == nullptr)
  155. {
  156. // 加载用户定义的工具栏图像
  157. if (m_UserImages.Load(_T(".\\UserImages.bmp")))
  158. {
  159. CMFCToolBar::SetUserImages(&m_UserImages);
  160. }
  161. }
  162. // 启用菜单个性化(最近使用的命令)
  163. // TODO: 定义您自己的基本命令,确保每个下拉菜单至少有一个基本命令。
  164. CList<UINT, UINT> lstBasicCommands;
  165. lstBasicCommands.AddTail(ID_FILE_NEW);
  166. lstBasicCommands.AddTail(ID_FILE_OPEN);
  167. lstBasicCommands.AddTail(ID_FILE_SAVE);
  168. lstBasicCommands.AddTail(ID_FILE_PRINT);
  169. lstBasicCommands.AddTail(ID_APP_EXIT);
  170. lstBasicCommands.AddTail(ID_EDIT_CUT);
  171. lstBasicCommands.AddTail(ID_EDIT_PASTE);
  172. lstBasicCommands.AddTail(ID_EDIT_UNDO);
  173. lstBasicCommands.AddTail(ID_APP_ABOUT);
  174. lstBasicCommands.AddTail(ID_VIEW_STATUS_BAR);
  175. lstBasicCommands.AddTail(ID_VIEW_TOOLBAR);
  176. lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2003);
  177. lstBasicCommands.AddTail(ID_VIEW_APPLOOK_VS_2005);
  178. lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_BLUE);
  179. lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_SILVER);
  180. lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_BLACK);
  181. lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_AQUA);
  182. lstBasicCommands.AddTail(ID_VIEW_APPLOOK_WINDOWS_7);
  183. lstBasicCommands.AddTail(ID_SORTING_SORTALPHABETIC);
  184. lstBasicCommands.AddTail(ID_SORTING_SORTBYTYPE);
  185. lstBasicCommands.AddTail(ID_SORTING_SORTBYACCESS);
  186. lstBasicCommands.AddTail(ID_SORTING_GROUPBYTYPE);
  187. CMFCToolBar::SetBasicCommands(lstBasicCommands);
  188. // 将文档名和应用程序名称在窗口标题栏上的顺序进行交换。这
  189. // 将改进任务栏的可用性,因为显示的文档名带有缩略图。
  190. ModifyStyle(0, FWS_PREFIXTITLE);
  191. return 0;
  192. }
  193. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  194. {
  195. if( !CMDIFrameWndEx::PreCreateWindow(cs) )
  196. return FALSE;
  197. // TODO: 在此处通过修改
  198. // CREATESTRUCT cs 来修改窗口类或样式
  199. return TRUE;
  200. }
  201. BOOL CMainFrame::CreateDockingWindows()
  202. {
  203. BOOL bNameValid;
  204. #if ENABLE_FILE_CLASS
  205. // 创建类视图
  206. CString strClassView;
  207. bNameValid = strClassView.LoadString(IDS_CLASS_VIEW);
  208. ASSERT(bNameValid);
  209. 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))
  210. {
  211. TRACE0("未能创建“类视图”窗口\n");
  212. return FALSE; // 未能创建
  213. }
  214. // 创建文件视图
  215. CString strFileView;
  216. bNameValid = strFileView.LoadString(IDS_FILE_VIEW);
  217. ASSERT(bNameValid);
  218. 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))
  219. {
  220. TRACE0("未能创建“文件视图”窗口\n");
  221. return FALSE; // 未能创建
  222. }
  223. #endif
  224. #if ENABLE_TITILBAR
  225. // 标题栏
  226. CString strFileView;
  227. bNameValid = strFileView.LoadString(IDS_FILE_VIEW);
  228. ASSERT(bNameValid);
  229. // 如何禁止改变大小:将最后2个默认参数全改为,将且删除注册表“应用程序向导生成的本地应用程序”才会生效;
  230. if (!m_wndTitleBar.Create(strFileView, this, CRect(0, 0, 200, 100), FALSE, ID_VIEW_FILEVIEW, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_TOP , 0, 0))
  231. {
  232. TRACE0("未能创建“文件视图”窗口\n");
  233. return FALSE; // 未能创建
  234. }
  235. #endif
  236. // 左导航栏
  237. CString strClassView;
  238. bNameValid = strClassView.LoadString(IDS_CLASS_VIEW);
  239. ASSERT(bNameValid);
  240. // 如何禁止改变大小:将最后2个默认参数全改为,将且删除注册表“应用程序向导生成的本地应用程序”才会生效;
  241. if (!m_wndNavBar.Create(strClassView, this, CRect(0, 0, 200, 200), FALSE, ID_VIEW_CLASSVIEW, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT, 0, 0))
  242. {
  243. TRACE0("未能创建“文件视图”窗口\n");
  244. return FALSE; // 未能创建
  245. }
  246. #if ENABLE_OUTPUT
  247. // 创建输出窗口
  248. CString strOutputWnd;
  249. bNameValid = strOutputWnd.LoadString(IDS_OUTPUT_WND);
  250. ASSERT(bNameValid);
  251. 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))
  252. {
  253. TRACE0("未能创建输出窗口\n");
  254. return FALSE; // 未能创建
  255. }
  256. #endif
  257. // 创建属性窗口
  258. CString strPropertiesWnd;
  259. bNameValid = strPropertiesWnd.LoadString(IDS_PROPERTIES_WND);
  260. ASSERT(bNameValid);
  261. // 将参数4改为FALSE,就不会有Gripper;
  262. if (!m_wndProperties.Create(strPropertiesWnd, this, CRect(0, 0, 200, 200), FALSE, ID_VIEW_PROPERTIESWND, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI, AFX_CBRS_REGULAR_TABS, AFX_CBRS_RESIZE))
  263. {
  264. TRACE0("未能创建“属性”窗口\n");
  265. return FALSE; // 未能创建
  266. }
  267. SetDockingWindowIcons(theApp.m_bHiColorIcons);
  268. return TRUE;
  269. }
  270. void CMainFrame::SetDockingWindowIcons(BOOL bHiColorIcons)
  271. {
  272. #if ENABLE_FILE_CLASS
  273. HICON hFileViewIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons ? IDI_FILE_VIEW_HC : IDI_FILE_VIEW), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0);
  274. m_wndFileView.SetIcon(hFileViewIcon, FALSE);
  275. HICON hClassViewIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons ? IDI_CLASS_VIEW_HC : IDI_CLASS_VIEW), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0);
  276. m_wndClassView.SetIcon(hClassViewIcon, FALSE);
  277. #endif
  278. #if ENABLE_OUTPUT
  279. HICON hOutputBarIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons ? IDI_OUTPUT_WND_HC : IDI_OUTPUT_WND), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0);
  280. m_wndOutput.SetIcon(hOutputBarIcon, FALSE);
  281. #endif
  282. HICON hPropertiesBarIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons ? IDI_PROPERTIES_WND_HC : IDI_PROPERTIES_WND), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0);
  283. m_wndProperties.SetIcon(hPropertiesBarIcon, FALSE);
  284. UpdateMDITabbedBarsIcons();
  285. }
  286. BOOL CMainFrame::CreateOutlookBar(CMFCOutlookBar& bar, UINT uiID, CMFCShellTreeCtrl& tree, CCalendarBar& calendar, int nInitialWidth)
  287. {
  288. bar.SetMode2003();
  289. BOOL bNameValid;
  290. CString strTemp;
  291. bNameValid = strTemp.LoadString(IDS_SHORTCUTS);
  292. ASSERT(bNameValid);
  293. if (!bar.Create(strTemp, this, CRect(0, 0, nInitialWidth, 32000), uiID, WS_CHILD | WS_VISIBLE | CBRS_LEFT))
  294. {
  295. return FALSE; // 未能创建
  296. }
  297. CMFCOutlookBarTabCtrl* pOutlookBar = (CMFCOutlookBarTabCtrl*)bar.GetUnderlyingWindow();
  298. if (pOutlookBar == nullptr)
  299. {
  300. ASSERT(FALSE);
  301. return FALSE;
  302. }
  303. //pOutlookBar->EnableInPlaceEdit(TRUE);
  304. static UINT uiPageID = 1;
  305. // 可浮动,可自动隐藏,可调整大小,但不能关闭
  306. DWORD dwStyle = AFX_CBRS_FLOAT | AFX_CBRS_AUTOHIDE | AFX_CBRS_RESIZE;
  307. CRect rectDummy(0, 0, 0, 0);
  308. const DWORD dwTreeStyle = WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS;
  309. /*tree.Create(dwTreeStyle, rectDummy, &bar, 1200);
  310. bNameValid = strTemp.LoadString(IDS_FOLDERS);
  311. ASSERT(bNameValid);
  312. pOutlookBar->AddControl(&tree, strTemp, 2, TRUE, dwStyle);*/
  313. calendar.Create(rectDummy, &bar, 1201);
  314. bNameValid = strTemp.LoadString(IDS_CALENDAR);
  315. ASSERT(bNameValid);
  316. pOutlookBar->AddControl(&calendar, strTemp, 3, TRUE, dwStyle);
  317. //bar.SetPaneStyle(bar.GetPaneStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
  318. //pOutlookBar->SetImageList(theApp.m_bHiColorIcons ? IDB_PAGES_HC : IDB_PAGES, 24);
  319. //pOutlookBar->SetToolbarImageList(theApp.m_bHiColorIcons ? IDB_PAGES_SMALL_HC : IDB_PAGES_SMALL, 16);
  320. pOutlookBar->RecalcLayout();
  321. BOOL bAnimation = theApp.GetInt(_T("OutlookAnimation"), TRUE);
  322. //CMFCOutlookBarTabCtrl::EnableAnimation(bAnimation);
  323. bar.SetButtonsFont(&afxGlobalData.fontBold);
  324. return TRUE;
  325. }
  326. // CMainFrame 诊断
  327. #ifdef _DEBUG
  328. void CMainFrame::AssertValid() const
  329. {
  330. CMDIFrameWndEx::AssertValid();
  331. }
  332. void CMainFrame::Dump(CDumpContext& dc) const
  333. {
  334. CMDIFrameWndEx::Dump(dc);
  335. }
  336. #endif //_DEBUG
  337. // CMainFrame 消息处理程序
  338. void CMainFrame::OnWindowManager()
  339. {
  340. ShowWindowsDialog();
  341. }
  342. void CMainFrame::OnViewCustomize()
  343. {
  344. CMFCToolBarsCustomizeDialog* pDlgCust = new CMFCToolBarsCustomizeDialog(this, TRUE /* 扫描菜单*/);
  345. pDlgCust->EnableUserDefinedToolbars();
  346. pDlgCust->Create();
  347. }
  348. LRESULT CMainFrame::OnToolbarCreateNew(WPARAM wp,LPARAM lp)
  349. {
  350. LRESULT lres = CMDIFrameWndEx::OnToolbarCreateNew(wp,lp);
  351. if (lres == 0)
  352. {
  353. return 0;
  354. }
  355. CMFCToolBar* pUserToolbar = (CMFCToolBar*)lres;
  356. ASSERT_VALID(pUserToolbar);
  357. BOOL bNameValid;
  358. CString strCustomize;
  359. bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);
  360. ASSERT(bNameValid);
  361. pUserToolbar->EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);
  362. return lres;
  363. }
  364. void CMainFrame::OnApplicationLook(UINT id)
  365. {
  366. CWaitCursor wait;
  367. theApp.m_nAppLook = id;
  368. switch (theApp.m_nAppLook)
  369. {
  370. case ID_VIEW_APPLOOK_WIN_2000:
  371. CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManager));
  372. break;
  373. case ID_VIEW_APPLOOK_OFF_XP:
  374. CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOfficeXP));
  375. break;
  376. case ID_VIEW_APPLOOK_WIN_XP:
  377. CMFCVisualManagerWindows::m_b3DTabsXPTheme = TRUE;
  378. CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
  379. break;
  380. case ID_VIEW_APPLOOK_OFF_2003:
  381. CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2003));
  382. CDockingManager::SetDockingMode(DT_SMART);
  383. break;
  384. case ID_VIEW_APPLOOK_VS_2005:
  385. CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2005));
  386. CDockingManager::SetDockingMode(DT_SMART);
  387. break;
  388. case ID_VIEW_APPLOOK_VS_2008:
  389. CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2008));
  390. CDockingManager::SetDockingMode(DT_SMART);
  391. break;
  392. case ID_VIEW_APPLOOK_WINDOWS_7:
  393. CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows7));
  394. CDockingManager::SetDockingMode(DT_SMART);
  395. break;
  396. default:
  397. switch (theApp.m_nAppLook)
  398. {
  399. case ID_VIEW_APPLOOK_OFF_2007_BLUE:
  400. CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);
  401. break;
  402. case ID_VIEW_APPLOOK_OFF_2007_BLACK:
  403. CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_ObsidianBlack);
  404. break;
  405. case ID_VIEW_APPLOOK_OFF_2007_SILVER:
  406. CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silver);
  407. break;
  408. case ID_VIEW_APPLOOK_OFF_2007_AQUA:
  409. CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua);
  410. break;
  411. }
  412. CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007));
  413. CDockingManager::SetDockingMode(DT_SMART);
  414. }
  415. #if ENABLE_OUTPUT
  416. m_wndOutput.UpdateFonts();
  417. #endif
  418. RedrawWindow(nullptr, nullptr, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME | RDW_ERASE);
  419. theApp.WriteInt(_T("ApplicationLook"), theApp.m_nAppLook);
  420. }
  421. void CMainFrame::OnUpdateApplicationLook(CCmdUI* pCmdUI)
  422. {
  423. pCmdUI->SetRadio(theApp.m_nAppLook == pCmdUI->m_nID);
  424. }
  425. BOOL CMainFrame::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle, CWnd* pParentWnd, CCreateContext* pContext)
  426. {
  427. // 基类将执行真正的工作
  428. if (!CMDIFrameWndEx::LoadFrame(nIDResource, dwDefaultStyle, pParentWnd, pContext))
  429. {
  430. return FALSE;
  431. }
  432. // 为所有用户工具栏启用自定义按钮
  433. BOOL bNameValid;
  434. CString strCustomize;
  435. bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);
  436. ASSERT(bNameValid);
  437. for (int i = 0; i < iMaxUserToolbars; i ++)
  438. {
  439. CMFCToolBar* pUserToolbar = GetUserToolBarByIndex(i);
  440. if (pUserToolbar != nullptr)
  441. {
  442. pUserToolbar->EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);
  443. }
  444. }
  445. return TRUE;
  446. }
  447. void CMainFrame::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
  448. {
  449. CMDIFrameWndEx::OnSettingChange(uFlags, lpszSection);
  450. #if ENABLE_OUTPUT
  451. m_wndOutput.UpdateFonts();
  452. #endif
  453. }