Bladeren bron

多文档:SATHelper

Jeff 5 jaren geleden
bovenliggende
commit
1de8939cf3
70 gewijzigde bestanden met toevoegingen van 4901 en 0 verwijderingen
  1. 31 0
      SATHelper/SATHelper.sln
  2. 92 0
      SATHelper/SATHelper/ChildFrm.cpp
  3. 48 0
      SATHelper/SATHelper/ChildFrm.h
  4. 333 0
      SATHelper/SATHelper/ClassView.cpp
  5. 64 0
      SATHelper/SATHelper/ClassView.h
  6. 267 0
      SATHelper/SATHelper/FileView.cpp
  7. 65 0
      SATHelper/SATHelper/FileView.h
  8. 443 0
      SATHelper/SATHelper/MainFrm.cpp
  9. 91 0
      SATHelper/SATHelper/MainFrm.h
  10. 210 0
      SATHelper/SATHelper/OutputWnd.cpp
  11. 69 0
      SATHelper/SATHelper/OutputWnd.h
  12. 283 0
      SATHelper/SATHelper/PropertiesWnd.cpp
  13. 72 0
      SATHelper/SATHelper/PropertiesWnd.h
  14. 124 0
      SATHelper/SATHelper/Resource.h
  15. 241 0
      SATHelper/SATHelper/SATHelper.cpp
  16. 50 0
      SATHelper/SATHelper/SATHelper.h
  17. 614 0
      SATHelper/SATHelper/SATHelper.rc
  18. 278 0
      SATHelper/SATHelper/SATHelper.vcxproj
  19. 228 0
      SATHelper/SATHelper/SATHelper.vcxproj.filters
  20. 148 0
      SATHelper/SATHelper/SATHelperDoc.cpp
  21. 58 0
      SATHelper/SATHelper/SATHelperDoc.h
  22. 138 0
      SATHelper/SATHelper/SATHelperView.cpp
  23. 62 0
      SATHelper/SATHelper/SATHelperView.h
  24. 52 0
      SATHelper/SATHelper/ViewTree.cpp
  25. 33 0
      SATHelper/SATHelper/ViewTree.h
  26. 172 0
      SATHelper/SATHelper/calendarbar.cpp
  27. 46 0
      SATHelper/SATHelper/calendarbar.h
  28. 60 0
      SATHelper/SATHelper/framework.h
  29. BIN
      SATHelper/SATHelper/res/SATHelper.ico
  30. 13 0
      SATHelper/SATHelper/res/SATHelper.rc2
  31. BIN
      SATHelper/SATHelper/res/SATHelperDoc.ico
  32. BIN
      SATHelper/SATHelper/res/Toolbar.bmp
  33. BIN
      SATHelper/SATHelper/res/Toolbar256.bmp
  34. BIN
      SATHelper/SATHelper/res/buttons.bmp
  35. BIN
      SATHelper/SATHelper/res/class_view.ico
  36. BIN
      SATHelper/SATHelper/res/class_view_hc.ico
  37. BIN
      SATHelper/SATHelper/res/classview.bmp
  38. BIN
      SATHelper/SATHelper/res/classview_hc.bmp
  39. BIN
      SATHelper/SATHelper/res/explorer.bmp
  40. BIN
      SATHelper/SATHelper/res/explorer_hc.bmp
  41. BIN
      SATHelper/SATHelper/res/file_view.ico
  42. BIN
      SATHelper/SATHelper/res/file_view_hc.ico
  43. BIN
      SATHelper/SATHelper/res/filelarge.bmp
  44. BIN
      SATHelper/SATHelper/res/filesmall.bmp
  45. BIN
      SATHelper/SATHelper/res/fileview.bmp
  46. BIN
      SATHelper/SATHelper/res/fileview_hc.bmp
  47. BIN
      SATHelper/SATHelper/res/info.bmp
  48. BIN
      SATHelper/SATHelper/res/main.bmp
  49. BIN
      SATHelper/SATHelper/res/menuimages.bmp
  50. BIN
      SATHelper/SATHelper/res/menuimages_hc.bmp
  51. BIN
      SATHelper/SATHelper/res/nav_large.bmp
  52. BIN
      SATHelper/SATHelper/res/nav_large_hc.bmp
  53. BIN
      SATHelper/SATHelper/res/output_wnd.ico
  54. BIN
      SATHelper/SATHelper/res/output_wnd_hc.ico
  55. BIN
      SATHelper/SATHelper/res/pages.bmp
  56. BIN
      SATHelper/SATHelper/res/pages_hc.bmp
  57. BIN
      SATHelper/SATHelper/res/pages_small.bmp
  58. BIN
      SATHelper/SATHelper/res/pages_small_hc.bmp
  59. BIN
      SATHelper/SATHelper/res/properties.bmp
  60. BIN
      SATHelper/SATHelper/res/properties_hc.bmp
  61. BIN
      SATHelper/SATHelper/res/properties_wnd.ico
  62. BIN
      SATHelper/SATHelper/res/properties_wnd_hc.ico
  63. 462 0
      SATHelper/SATHelper/res/ribbon.mfcribbon-ms
  64. BIN
      SATHelper/SATHelper/res/sort.bmp
  65. BIN
      SATHelper/SATHelper/res/sort_hc.bmp
  66. BIN
      SATHelper/SATHelper/res/writelarge.bmp
  67. BIN
      SATHelper/SATHelper/res/writesmall.bmp
  68. 5 0
      SATHelper/SATHelper/stdafx.cpp
  69. 30 0
      SATHelper/SATHelper/stdafx.h
  70. 19 0
      SATHelper/SATHelper/targetver.h

+ 31 - 0
SATHelper/SATHelper.sln

@@ -0,0 +1,31 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.29411.108
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SATHelper", "SATHelper\SATHelper.vcxproj", "{B5557CC8-F26E-4162-8008-4BFACD2991FD}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{B5557CC8-F26E-4162-8008-4BFACD2991FD}.Debug|x64.ActiveCfg = Debug|x64
+		{B5557CC8-F26E-4162-8008-4BFACD2991FD}.Debug|x64.Build.0 = Debug|x64
+		{B5557CC8-F26E-4162-8008-4BFACD2991FD}.Debug|x86.ActiveCfg = Debug|Win32
+		{B5557CC8-F26E-4162-8008-4BFACD2991FD}.Debug|x86.Build.0 = Debug|Win32
+		{B5557CC8-F26E-4162-8008-4BFACD2991FD}.Release|x64.ActiveCfg = Release|x64
+		{B5557CC8-F26E-4162-8008-4BFACD2991FD}.Release|x64.Build.0 = Release|x64
+		{B5557CC8-F26E-4162-8008-4BFACD2991FD}.Release|x86.ActiveCfg = Release|Win32
+		{B5557CC8-F26E-4162-8008-4BFACD2991FD}.Release|x86.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {F5F081BE-7EE9-479D-8660-303AB8FA2294}
+	EndGlobalSection
+EndGlobal

+ 92 - 0
SATHelper/SATHelper/ChildFrm.cpp

@@ -0,0 +1,92 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面 
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和 
+// MFC C++ 库软件随附的相关电子文档。  
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。  
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问 
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+// ChildFrm.cpp: CChildFrame 类的实现
+//
+
+#include "stdafx.h"
+#include "framework.h"
+#include "SATHelper.h"
+
+#include "ChildFrm.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#endif
+
+// CChildFrame
+
+IMPLEMENT_DYNCREATE(CChildFrame, CMDIChildWndEx)
+
+BEGIN_MESSAGE_MAP(CChildFrame, CMDIChildWndEx)
+	ON_COMMAND(ID_FILE_PRINT, &CChildFrame::OnFilePrint)
+	ON_COMMAND(ID_FILE_PRINT_DIRECT, &CChildFrame::OnFilePrint)
+	ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CChildFrame::OnFilePrintPreview)
+	ON_UPDATE_COMMAND_UI(ID_FILE_PRINT_PREVIEW, &CChildFrame::OnUpdateFilePrintPreview)
+END_MESSAGE_MAP()
+
+// CChildFrame 构造/析构
+
+CChildFrame::CChildFrame() noexcept
+{
+	// TODO: 在此添加成员初始化代码
+}
+
+CChildFrame::~CChildFrame()
+{
+}
+
+
+BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
+{
+	// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或样式
+	if( !CMDIChildWndEx::PreCreateWindow(cs) )
+		return FALSE;
+
+	return TRUE;
+}
+
+// CChildFrame 诊断
+
+#ifdef _DEBUG
+void CChildFrame::AssertValid() const
+{
+	CMDIChildWndEx::AssertValid();
+}
+
+void CChildFrame::Dump(CDumpContext& dc) const
+{
+	CMDIChildWndEx::Dump(dc);
+}
+#endif //_DEBUG
+
+// CChildFrame 消息处理程序
+
+void CChildFrame::OnFilePrint()
+{
+	if (m_dockManager.IsPrintPreviewValid())
+	{
+		PostMessage(WM_COMMAND, AFX_ID_PREVIEW_PRINT);
+	}
+}
+
+void CChildFrame::OnFilePrintPreview()
+{
+	if (m_dockManager.IsPrintPreviewValid())
+	{
+		PostMessage(WM_COMMAND, AFX_ID_PREVIEW_CLOSE);  // 强制关闭“打印预览”模式
+	}
+}
+
+void CChildFrame::OnUpdateFilePrintPreview(CCmdUI* pCmdUI)
+{
+	pCmdUI->SetCheck(m_dockManager.IsPrintPreviewValid());
+}

+ 48 - 0
SATHelper/SATHelper/ChildFrm.h

@@ -0,0 +1,48 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面 
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和 
+// MFC C++ 库软件随附的相关电子文档。  
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。  
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问 
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+// ChildFrm.h: CChildFrame 类的接口
+//
+
+#pragma once
+
+class CChildFrame : public CMDIChildWndEx
+{
+	DECLARE_DYNCREATE(CChildFrame)
+public:
+	CChildFrame() noexcept;
+
+// 特性
+protected:
+	CSplitterWndEx m_wndSplitter;
+public:
+
+// 操作
+public:
+
+// 重写
+	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
+
+// 实现
+public:
+	virtual ~CChildFrame();
+#ifdef _DEBUG
+	virtual void AssertValid() const;
+	virtual void Dump(CDumpContext& dc) const;
+#endif
+
+// 生成的消息映射函数
+protected:
+	afx_msg void OnFilePrint();
+	afx_msg void OnFilePrintPreview();
+	afx_msg void OnUpdateFilePrintPreview(CCmdUI* pCmdUI);
+	DECLARE_MESSAGE_MAP()
+};

+ 333 - 0
SATHelper/SATHelper/ClassView.cpp

@@ -0,0 +1,333 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面 
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和 
+// MFC C++ 库软件随附的相关电子文档。  
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。  
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问 
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+#include "stdafx.h"
+#include "framework.h"
+#include "MainFrm.h"
+#include "ClassView.h"
+#include "Resource.h"
+#include "SATHelper.h"
+
+class CClassViewMenuButton : public CMFCToolBarMenuButton
+{
+	friend class CClassView;
+
+	DECLARE_SERIAL(CClassViewMenuButton)
+
+public:
+	CClassViewMenuButton(HMENU hMenu = nullptr) noexcept : CMFCToolBarMenuButton((UINT)-1, hMenu, -1)
+	{
+	}
+
+	virtual void OnDraw(CDC* pDC, const CRect& rect, CMFCToolBarImages* pImages, BOOL bHorz = TRUE,
+		BOOL bCustomizeMode = FALSE, BOOL bHighlight = FALSE, BOOL bDrawBorder = TRUE, BOOL bGrayDisabledButtons = TRUE)
+	{
+		pImages = CMFCToolBar::GetImages();
+
+		CAfxDrawState ds;
+		pImages->PrepareDrawImage(ds);
+
+		CMFCToolBarMenuButton::OnDraw(pDC, rect, pImages, bHorz, bCustomizeMode, bHighlight, bDrawBorder, bGrayDisabledButtons);
+
+		pImages->EndDrawImage(ds);
+	}
+};
+
+IMPLEMENT_SERIAL(CClassViewMenuButton, CMFCToolBarMenuButton, 1)
+
+//////////////////////////////////////////////////////////////////////
+// 构造/析构
+//////////////////////////////////////////////////////////////////////
+
+CClassView::CClassView() noexcept
+{
+	m_nCurrSort = ID_SORTING_GROUPBYTYPE;
+}
+
+CClassView::~CClassView()
+{
+}
+
+BEGIN_MESSAGE_MAP(CClassView, CDockablePane)
+	ON_WM_CREATE()
+	ON_WM_SIZE()
+	ON_WM_CONTEXTMENU()
+	ON_COMMAND(ID_CLASS_ADD_MEMBER_FUNCTION, OnClassAddMemberFunction)
+	ON_COMMAND(ID_CLASS_ADD_MEMBER_VARIABLE, OnClassAddMemberVariable)
+	ON_COMMAND(ID_CLASS_DEFINITION, OnClassDefinition)
+	ON_COMMAND(ID_CLASS_PROPERTIES, OnClassProperties)
+	ON_COMMAND(ID_NEW_FOLDER, OnNewFolder)
+	ON_WM_PAINT()
+	ON_WM_SETFOCUS()
+	ON_COMMAND_RANGE(ID_SORTING_GROUPBYTYPE, ID_SORTING_SORTBYACCESS, OnSort)
+	ON_UPDATE_COMMAND_UI_RANGE(ID_SORTING_GROUPBYTYPE, ID_SORTING_SORTBYACCESS, OnUpdateSort)
+END_MESSAGE_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// CClassView 消息处理程序
+
+int CClassView::OnCreate(LPCREATESTRUCT lpCreateStruct)
+{
+	if (CDockablePane::OnCreate(lpCreateStruct) == -1)
+		return -1;
+
+	CRect rectDummy;
+	rectDummy.SetRectEmpty();
+
+	// 创建视图: 
+	const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
+
+	if (!m_wndClassView.Create(dwViewStyle, rectDummy, this, 2))
+	{
+		TRACE0("未能创建类视图\n");
+		return -1;      // 未能创建
+	}
+
+	// 加载图像: 
+	m_wndToolBar.Create(this, AFX_DEFAULT_TOOLBAR_STYLE, IDR_SORT);
+	m_wndToolBar.LoadToolBar(IDR_SORT, 0, 0, TRUE /* 已锁定*/);
+
+	OnChangeVisualStyle();
+
+	m_wndToolBar.SetPaneStyle(m_wndToolBar.GetPaneStyle() | CBRS_TOOLTIPS | CBRS_FLYBY);
+	m_wndToolBar.SetPaneStyle(m_wndToolBar.GetPaneStyle() & ~(CBRS_GRIPPER | CBRS_SIZE_DYNAMIC | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT));
+
+	m_wndToolBar.SetOwner(this);
+
+	// 所有命令将通过此控件路由,而不是通过主框架路由: 
+	m_wndToolBar.SetRouteCommandsViaFrame(FALSE);
+
+	CMenu menuSort;
+	menuSort.LoadMenu(IDR_POPUP_SORT);
+
+	m_wndToolBar.ReplaceButton(ID_SORT_MENU, CClassViewMenuButton(menuSort.GetSubMenu(0)->GetSafeHmenu()));
+
+	CClassViewMenuButton* pButton =  DYNAMIC_DOWNCAST(CClassViewMenuButton, m_wndToolBar.GetButton(0));
+
+	if (pButton != nullptr)
+	{
+		pButton->m_bText = FALSE;
+		pButton->m_bImage = TRUE;
+		pButton->SetImage(GetCmdMgr()->GetCmdImage(m_nCurrSort));
+		pButton->SetMessageWnd(this);
+	}
+
+	// 填入一些静态树视图数据(此处只需填入虚拟代码,而不是复杂的数据)
+	FillClassView();
+
+	return 0;
+}
+
+void CClassView::OnSize(UINT nType, int cx, int cy)
+{
+	CDockablePane::OnSize(nType, cx, cy);
+	AdjustLayout();
+}
+
+void CClassView::FillClassView()
+{
+	HTREEITEM hRoot = m_wndClassView.InsertItem(_T("FakeApp 类"), 0, 0);
+	m_wndClassView.SetItemState(hRoot, TVIS_BOLD, TVIS_BOLD);
+
+	HTREEITEM hClass = m_wndClassView.InsertItem(_T("CFakeAboutDlg"), 1, 1, hRoot);
+	m_wndClassView.InsertItem(_T("CFakeAboutDlg()"), 3, 3, hClass);
+
+	m_wndClassView.Expand(hRoot, TVE_EXPAND);
+
+	hClass = m_wndClassView.InsertItem(_T("CFakeApp"), 1, 1, hRoot);
+	m_wndClassView.InsertItem(_T("CFakeApp()"), 3, 3, hClass);
+	m_wndClassView.InsertItem(_T("InitInstance()"), 3, 3, hClass);
+	m_wndClassView.InsertItem(_T("OnAppAbout()"), 3, 3, hClass);
+
+	hClass = m_wndClassView.InsertItem(_T("CFakeAppDoc"), 1, 1, hRoot);
+	m_wndClassView.InsertItem(_T("CFakeAppDoc()"), 4, 4, hClass);
+	m_wndClassView.InsertItem(_T("~CFakeAppDoc()"), 3, 3, hClass);
+	m_wndClassView.InsertItem(_T("OnNewDocument()"), 3, 3, hClass);
+
+	hClass = m_wndClassView.InsertItem(_T("CFakeAppView"), 1, 1, hRoot);
+	m_wndClassView.InsertItem(_T("CFakeAppView()"), 4, 4, hClass);
+	m_wndClassView.InsertItem(_T("~CFakeAppView()"), 3, 3, hClass);
+	m_wndClassView.InsertItem(_T("GetDocument()"), 3, 3, hClass);
+	m_wndClassView.Expand(hClass, TVE_EXPAND);
+
+	hClass = m_wndClassView.InsertItem(_T("CFakeAppFrame"), 1, 1, hRoot);
+	m_wndClassView.InsertItem(_T("CFakeAppFrame()"), 3, 3, hClass);
+	m_wndClassView.InsertItem(_T("~CFakeAppFrame()"), 3, 3, hClass);
+	m_wndClassView.InsertItem(_T("m_wndMenuBar"), 6, 6, hClass);
+	m_wndClassView.InsertItem(_T("m_wndToolBar"), 6, 6, hClass);
+	m_wndClassView.InsertItem(_T("m_wndStatusBar"), 6, 6, hClass);
+
+	hClass = m_wndClassView.InsertItem(_T("Globals"), 2, 2, hRoot);
+	m_wndClassView.InsertItem(_T("theFakeApp"), 5, 5, hClass);
+	m_wndClassView.Expand(hClass, TVE_EXPAND);
+}
+
+void CClassView::OnContextMenu(CWnd* pWnd, CPoint point)
+{
+	CTreeCtrl* pWndTree = (CTreeCtrl*)&m_wndClassView;
+	ASSERT_VALID(pWndTree);
+
+	if (pWnd != pWndTree)
+	{
+		CDockablePane::OnContextMenu(pWnd, point);
+		return;
+	}
+
+	if (point != CPoint(-1, -1))
+	{
+		// 选择已单击的项: 
+		CPoint ptTree = point;
+		pWndTree->ScreenToClient(&ptTree);
+
+		UINT flags = 0;
+		HTREEITEM hTreeItem = pWndTree->HitTest(ptTree, &flags);
+		if (hTreeItem != nullptr)
+		{
+			pWndTree->SelectItem(hTreeItem);
+		}
+	}
+
+	pWndTree->SetFocus();
+	CMenu menu;
+	menu.LoadMenu(IDR_POPUP_SORT);
+
+	CMenu* pSumMenu = menu.GetSubMenu(0);
+
+	if (AfxGetMainWnd()->IsKindOf(RUNTIME_CLASS(CMDIFrameWndEx)))
+	{
+		CMFCPopupMenu* pPopupMenu = new CMFCPopupMenu;
+
+		if (!pPopupMenu->Create(this, point.x, point.y, (HMENU)pSumMenu->m_hMenu, FALSE, TRUE))
+			return;
+
+		((CMDIFrameWndEx*)AfxGetMainWnd())->OnShowPopupMenu(pPopupMenu);
+		UpdateDialogControls(this, FALSE);
+	}
+}
+
+void CClassView::AdjustLayout()
+{
+	if (GetSafeHwnd() == nullptr)
+	{
+		return;
+	}
+
+	CRect rectClient;
+	GetClientRect(rectClient);
+
+	int cyTlb = m_wndToolBar.CalcFixedLayout(FALSE, TRUE).cy;
+
+	m_wndToolBar.SetWindowPos(nullptr, rectClient.left, rectClient.top, rectClient.Width(), cyTlb, SWP_NOACTIVATE | SWP_NOZORDER);
+	m_wndClassView.SetWindowPos(nullptr, rectClient.left + 1, rectClient.top + cyTlb + 1, rectClient.Width() - 2, rectClient.Height() - cyTlb - 2, SWP_NOACTIVATE | SWP_NOZORDER);
+}
+
+BOOL CClassView::PreTranslateMessage(MSG* pMsg)
+{
+	return CDockablePane::PreTranslateMessage(pMsg);
+}
+
+void CClassView::OnSort(UINT id)
+{
+	if (m_nCurrSort == id)
+	{
+		return;
+	}
+
+	m_nCurrSort = id;
+
+	CClassViewMenuButton* pButton =  DYNAMIC_DOWNCAST(CClassViewMenuButton, m_wndToolBar.GetButton(0));
+
+	if (pButton != nullptr)
+	{
+		pButton->SetImage(GetCmdMgr()->GetCmdImage(id));
+		m_wndToolBar.Invalidate();
+		m_wndToolBar.UpdateWindow();
+	}
+}
+
+void CClassView::OnUpdateSort(CCmdUI* pCmdUI)
+{
+	pCmdUI->SetCheck(pCmdUI->m_nID == m_nCurrSort);
+}
+
+void CClassView::OnClassAddMemberFunction()
+{
+	AfxMessageBox(_T("添加成员函数..."));
+}
+
+void CClassView::OnClassAddMemberVariable()
+{
+	// TODO: 在此处添加命令处理程序代码
+}
+
+void CClassView::OnClassDefinition()
+{
+	// TODO: 在此处添加命令处理程序代码
+}
+
+void CClassView::OnClassProperties()
+{
+	// TODO: 在此处添加命令处理程序代码
+}
+
+void CClassView::OnNewFolder()
+{
+	AfxMessageBox(_T("新建文件夹..."));
+}
+
+void CClassView::OnPaint()
+{
+	CPaintDC dc(this); // 用于绘制的设备上下文
+
+	CRect rectTree;
+	m_wndClassView.GetWindowRect(rectTree);
+	ScreenToClient(rectTree);
+
+	rectTree.InflateRect(1, 1);
+	dc.Draw3dRect(rectTree, ::GetSysColor(COLOR_3DSHADOW), ::GetSysColor(COLOR_3DSHADOW));
+}
+
+void CClassView::OnSetFocus(CWnd* pOldWnd)
+{
+	CDockablePane::OnSetFocus(pOldWnd);
+
+	m_wndClassView.SetFocus();
+}
+
+void CClassView::OnChangeVisualStyle()
+{
+	m_ClassViewImages.DeleteImageList();
+
+	UINT uiBmpId = theApp.m_bHiColorIcons ? IDB_CLASS_VIEW_24 : IDB_CLASS_VIEW;
+
+	CBitmap bmp;
+	if (!bmp.LoadBitmap(uiBmpId))
+	{
+		TRACE(_T("无法加载位图: %x\n"), uiBmpId);
+		ASSERT(FALSE);
+		return;
+	}
+
+	BITMAP bmpObj;
+	bmp.GetBitmap(&bmpObj);
+
+	UINT nFlags = ILC_MASK;
+
+	nFlags |= (theApp.m_bHiColorIcons) ? ILC_COLOR24 : ILC_COLOR4;
+
+	m_ClassViewImages.Create(16, bmpObj.bmHeight, nFlags, 0, 0);
+	m_ClassViewImages.Add(&bmp, RGB(255, 0, 0));
+
+	m_wndClassView.SetImageList(&m_ClassViewImages, TVSIL_NORMAL);
+
+	m_wndToolBar.CleanUpLockedImages();
+	m_wndToolBar.LoadBitmap(theApp.m_bHiColorIcons ? IDB_SORT_24 : IDR_SORT, 0, 0, TRUE /* 锁定*/);
+}

+ 64 - 0
SATHelper/SATHelper/ClassView.h

@@ -0,0 +1,64 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面 
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和 
+// MFC C++ 库软件随附的相关电子文档。  
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。  
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问 
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+#pragma once
+
+#include "ViewTree.h"
+
+class CClassToolBar : public CMFCToolBar
+{
+	virtual void OnUpdateCmdUI(CFrameWnd* /*pTarget*/, BOOL bDisableIfNoHndler)
+	{
+		CMFCToolBar::OnUpdateCmdUI((CFrameWnd*) GetOwner(), bDisableIfNoHndler);
+	}
+
+	virtual BOOL AllowShowOnList() const { return FALSE; }
+};
+
+class CClassView : public CDockablePane
+{
+public:
+	CClassView() noexcept;
+	virtual ~CClassView();
+
+	void AdjustLayout();
+	void OnChangeVisualStyle();
+
+protected:
+	CClassToolBar m_wndToolBar;
+	CViewTree m_wndClassView;
+	CImageList m_ClassViewImages;
+	UINT m_nCurrSort;
+
+	void FillClassView();
+
+// 重写
+public:
+	virtual BOOL PreTranslateMessage(MSG* pMsg);
+
+protected:
+	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
+	afx_msg void OnSize(UINT nType, int cx, int cy);
+	afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
+	afx_msg void OnClassAddMemberFunction();
+	afx_msg void OnClassAddMemberVariable();
+	afx_msg void OnClassDefinition();
+	afx_msg void OnClassProperties();
+	afx_msg void OnNewFolder();
+	afx_msg void OnPaint();
+	afx_msg void OnSetFocus(CWnd* pOldWnd);
+	afx_msg LRESULT OnChangeActiveTab(WPARAM, LPARAM);
+	afx_msg void OnSort(UINT id);
+	afx_msg void OnUpdateSort(CCmdUI* pCmdUI);
+
+	DECLARE_MESSAGE_MAP()
+};
+

+ 267 - 0
SATHelper/SATHelper/FileView.cpp

@@ -0,0 +1,267 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面 
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和 
+// MFC C++ 库软件随附的相关电子文档。  
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。  
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问 
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+#include "stdafx.h"
+#include "framework.h"
+#include "mainfrm.h"
+#include "FileView.h"
+#include "Resource.h"
+#include "SATHelper.h"
+
+#ifdef _DEBUG
+#undef THIS_FILE
+static char THIS_FILE[]=__FILE__;
+#define new DEBUG_NEW
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+// CFileView
+
+CFileView::CFileView() noexcept
+{
+}
+
+CFileView::~CFileView()
+{
+}
+
+BEGIN_MESSAGE_MAP(CFileView, CDockablePane)
+	ON_WM_CREATE()
+	ON_WM_SIZE()
+	ON_WM_CONTEXTMENU()
+	ON_COMMAND(ID_PROPERTIES, OnProperties)
+	ON_COMMAND(ID_OPEN, OnFileOpen)
+	ON_COMMAND(ID_OPEN_WITH, OnFileOpenWith)
+	ON_COMMAND(ID_DUMMY_COMPILE, OnDummyCompile)
+	ON_COMMAND(ID_EDIT_CUT, OnEditCut)
+	ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
+	ON_COMMAND(ID_EDIT_CLEAR, OnEditClear)
+	ON_WM_PAINT()
+	ON_WM_SETFOCUS()
+END_MESSAGE_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// CWorkspaceBar 消息处理程序
+
+int CFileView::OnCreate(LPCREATESTRUCT lpCreateStruct)
+{
+	if (CDockablePane::OnCreate(lpCreateStruct) == -1)
+		return -1;
+
+	CRect rectDummy;
+	rectDummy.SetRectEmpty();
+
+	// 创建视图: 
+	const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS;
+
+	if (!m_wndFileView.Create(dwViewStyle, rectDummy, this, 4))
+	{
+		TRACE0("未能创建文件视图\n");
+		return -1;      // 未能创建
+	}
+
+	// 加载视图图像: 
+	m_FileViewImages.Create(IDB_FILE_VIEW, 16, 0, RGB(255, 0, 255));
+	m_wndFileView.SetImageList(&m_FileViewImages, TVSIL_NORMAL);
+
+	m_wndToolBar.Create(this, AFX_DEFAULT_TOOLBAR_STYLE, IDR_EXPLORER);
+	m_wndToolBar.LoadToolBar(IDR_EXPLORER, 0, 0, TRUE /* 已锁定*/);
+
+	OnChangeVisualStyle();
+
+	m_wndToolBar.SetPaneStyle(m_wndToolBar.GetPaneStyle() | CBRS_TOOLTIPS | CBRS_FLYBY);
+
+	m_wndToolBar.SetPaneStyle(m_wndToolBar.GetPaneStyle() & ~(CBRS_GRIPPER | CBRS_SIZE_DYNAMIC | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT));
+
+	m_wndToolBar.SetOwner(this);
+
+	// 所有命令将通过此控件路由,而不是通过主框架路由: 
+	m_wndToolBar.SetRouteCommandsViaFrame(FALSE);
+
+	// 填入一些静态树视图数据(此处只需填入虚拟代码,而不是复杂的数据)
+	FillFileView();
+	AdjustLayout();
+
+	return 0;
+}
+
+void CFileView::OnSize(UINT nType, int cx, int cy)
+{
+	CDockablePane::OnSize(nType, cx, cy);
+	AdjustLayout();
+}
+
+void CFileView::FillFileView()
+{
+	HTREEITEM hRoot = m_wndFileView.InsertItem(_T("FakeApp 文件"), 0, 0);
+	m_wndFileView.SetItemState(hRoot, TVIS_BOLD, TVIS_BOLD);
+
+	HTREEITEM hSrc = m_wndFileView.InsertItem(_T("FakeApp 源文件"), 0, 0, hRoot);
+
+	m_wndFileView.InsertItem(_T("FakeApp.cpp"), 1, 1, hSrc);
+	m_wndFileView.InsertItem(_T("FakeApp.rc"), 1, 1, hSrc);
+	m_wndFileView.InsertItem(_T("FakeAppDoc.cpp"), 1, 1, hSrc);
+	m_wndFileView.InsertItem(_T("FakeAppView.cpp"), 1, 1, hSrc);
+	m_wndFileView.InsertItem(_T("MainFrm.cpp"), 1, 1, hSrc);
+	m_wndFileView.InsertItem(_T("pch.cpp"), 1, 1, hSrc);
+
+	HTREEITEM hInc = m_wndFileView.InsertItem(_T("FakeApp 头文件"), 0, 0, hRoot);
+
+	m_wndFileView.InsertItem(_T("FakeApp.h"), 2, 2, hInc);
+	m_wndFileView.InsertItem(_T("FakeAppDoc.h"), 2, 2, hInc);
+	m_wndFileView.InsertItem(_T("FakeAppView.h"), 2, 2, hInc);
+	m_wndFileView.InsertItem(_T("Resource.h"), 2, 2, hInc);
+	m_wndFileView.InsertItem(_T("MainFrm.h"), 2, 2, hInc);
+	m_wndFileView.InsertItem(_T("pch.h"), 2, 2, hInc);
+
+	HTREEITEM hRes = m_wndFileView.InsertItem(_T("FakeApp 资源文件"), 0, 0, hRoot);
+
+	m_wndFileView.InsertItem(_T("FakeApp.ico"), 2, 2, hRes);
+	m_wndFileView.InsertItem(_T("FakeApp.rc2"), 2, 2, hRes);
+	m_wndFileView.InsertItem(_T("FakeAppDoc.ico"), 2, 2, hRes);
+	m_wndFileView.InsertItem(_T("FakeToolbar.bmp"), 2, 2, hRes);
+
+	m_wndFileView.Expand(hRoot, TVE_EXPAND);
+	m_wndFileView.Expand(hSrc, TVE_EXPAND);
+	m_wndFileView.Expand(hInc, TVE_EXPAND);
+}
+
+void CFileView::OnContextMenu(CWnd* pWnd, CPoint point)
+{
+	CTreeCtrl* pWndTree = (CTreeCtrl*) &m_wndFileView;
+	ASSERT_VALID(pWndTree);
+
+	if (pWnd != pWndTree)
+	{
+		CDockablePane::OnContextMenu(pWnd, point);
+		return;
+	}
+
+	if (point != CPoint(-1, -1))
+	{
+		// 选择已单击的项: 
+		CPoint ptTree = point;
+		pWndTree->ScreenToClient(&ptTree);
+
+		UINT flags = 0;
+		HTREEITEM hTreeItem = pWndTree->HitTest(ptTree, &flags);
+		if (hTreeItem != nullptr)
+		{
+			pWndTree->SelectItem(hTreeItem);
+		}
+	}
+
+	pWndTree->SetFocus();
+	theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EXPLORER, point.x, point.y, this, TRUE);
+}
+
+void CFileView::AdjustLayout()
+{
+	if (GetSafeHwnd() == nullptr)
+	{
+		return;
+	}
+
+	CRect rectClient;
+	GetClientRect(rectClient);
+
+	int cyTlb = m_wndToolBar.CalcFixedLayout(FALSE, TRUE).cy;
+
+	m_wndToolBar.SetWindowPos(nullptr, rectClient.left, rectClient.top, rectClient.Width(), cyTlb, SWP_NOACTIVATE | SWP_NOZORDER);
+	m_wndFileView.SetWindowPos(nullptr, rectClient.left + 1, rectClient.top + cyTlb + 1, rectClient.Width() - 2, rectClient.Height() - cyTlb - 2, SWP_NOACTIVATE | SWP_NOZORDER);
+}
+
+void CFileView::OnProperties()
+{
+	AfxMessageBox(_T("属性...."));
+
+}
+
+void CFileView::OnFileOpen()
+{
+	// TODO: 在此处添加命令处理程序代码
+}
+
+void CFileView::OnFileOpenWith()
+{
+	// TODO: 在此处添加命令处理程序代码
+}
+
+void CFileView::OnDummyCompile()
+{
+	// TODO: 在此处添加命令处理程序代码
+}
+
+void CFileView::OnEditCut()
+{
+	// TODO: 在此处添加命令处理程序代码
+}
+
+void CFileView::OnEditCopy()
+{
+	// TODO: 在此处添加命令处理程序代码
+}
+
+void CFileView::OnEditClear()
+{
+	// TODO: 在此处添加命令处理程序代码
+}
+
+void CFileView::OnPaint()
+{
+	CPaintDC dc(this); // 用于绘制的设备上下文
+
+	CRect rectTree;
+	m_wndFileView.GetWindowRect(rectTree);
+	ScreenToClient(rectTree);
+
+	rectTree.InflateRect(1, 1);
+	dc.Draw3dRect(rectTree, ::GetSysColor(COLOR_3DSHADOW), ::GetSysColor(COLOR_3DSHADOW));
+}
+
+void CFileView::OnSetFocus(CWnd* pOldWnd)
+{
+	CDockablePane::OnSetFocus(pOldWnd);
+
+	m_wndFileView.SetFocus();
+}
+
+void CFileView::OnChangeVisualStyle()
+{
+	m_wndToolBar.CleanUpLockedImages();
+	m_wndToolBar.LoadBitmap(theApp.m_bHiColorIcons ? IDB_EXPLORER_24 : IDR_EXPLORER, 0, 0, TRUE /* 锁定*/);
+
+	m_FileViewImages.DeleteImageList();
+
+	UINT uiBmpId = theApp.m_bHiColorIcons ? IDB_FILE_VIEW_24 : IDB_FILE_VIEW;
+
+	CBitmap bmp;
+	if (!bmp.LoadBitmap(uiBmpId))
+	{
+		TRACE(_T("无法加载位图: %x\n"), uiBmpId);
+		ASSERT(FALSE);
+		return;
+	}
+
+	BITMAP bmpObj;
+	bmp.GetBitmap(&bmpObj);
+
+	UINT nFlags = ILC_MASK;
+
+	nFlags |= (theApp.m_bHiColorIcons) ? ILC_COLOR24 : ILC_COLOR4;
+
+	m_FileViewImages.Create(16, bmpObj.bmHeight, nFlags, 0, 0);
+	m_FileViewImages.Add(&bmp, RGB(255, 0, 255));
+
+	m_wndFileView.SetImageList(&m_FileViewImages, TVSIL_NORMAL);
+}
+
+

+ 65 - 0
SATHelper/SATHelper/FileView.h

@@ -0,0 +1,65 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面 
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和 
+// MFC C++ 库软件随附的相关电子文档。  
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。  
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问 
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+#pragma once
+
+#include "ViewTree.h"
+
+class CFileViewToolBar : public CMFCToolBar
+{
+	virtual void OnUpdateCmdUI(CFrameWnd* /*pTarget*/, BOOL bDisableIfNoHndler)
+	{
+		CMFCToolBar::OnUpdateCmdUI((CFrameWnd*) GetOwner(), bDisableIfNoHndler);
+	}
+
+	virtual BOOL AllowShowOnList() const { return FALSE; }
+};
+
+class CFileView : public CDockablePane
+{
+// 构造
+public:
+	CFileView() noexcept;
+
+	void AdjustLayout();
+	void OnChangeVisualStyle();
+
+// 特性
+protected:
+
+	CViewTree m_wndFileView;
+	CImageList m_FileViewImages;
+	CFileViewToolBar m_wndToolBar;
+
+protected:
+	void FillFileView();
+
+// 实现
+public:
+	virtual ~CFileView();
+
+protected:
+	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
+	afx_msg void OnSize(UINT nType, int cx, int cy);
+	afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
+	afx_msg void OnProperties();
+	afx_msg void OnFileOpen();
+	afx_msg void OnFileOpenWith();
+	afx_msg void OnDummyCompile();
+	afx_msg void OnEditCut();
+	afx_msg void OnEditCopy();
+	afx_msg void OnEditClear();
+	afx_msg void OnPaint();
+	afx_msg void OnSetFocus(CWnd* pOldWnd);
+
+	DECLARE_MESSAGE_MAP()
+};
+

+ 443 - 0
SATHelper/SATHelper/MainFrm.cpp

@@ -0,0 +1,443 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和
+// MFC C++ 库软件随附的相关电子文档。
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+// MainFrm.cpp: CMainFrame 类的实现
+//
+
+#include "stdafx.h"
+#include "framework.h"
+#include "SATHelper.h"
+
+#include "MainFrm.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#endif
+
+// CMainFrame
+
+IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWndEx)
+
+BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)
+	ON_WM_CREATE()
+	ON_COMMAND(ID_WINDOW_MANAGER, &CMainFrame::OnWindowManager)
+	ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook)
+	ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdateApplicationLook)
+	ON_COMMAND(ID_VIEW_CAPTION_BAR, &CMainFrame::OnViewCaptionBar)
+	ON_UPDATE_COMMAND_UI(ID_VIEW_CAPTION_BAR, &CMainFrame::OnUpdateViewCaptionBar)
+	ON_COMMAND(ID_TOOLS_OPTIONS, &CMainFrame::OnOptions)
+	ON_WM_SETTINGCHANGE()
+END_MESSAGE_MAP()
+
+// CMainFrame 构造/析构
+
+CMainFrame::CMainFrame() noexcept
+{
+	// TODO: 在此添加成员初始化代码
+	theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"), ID_VIEW_APPLOOK_VS_2008);
+}
+
+CMainFrame::~CMainFrame()
+{
+}
+
+int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
+{
+	if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1)
+		return -1;
+
+	BOOL bNameValid;
+
+#if __TAB_BAR__
+	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
+
+	m_wndRibbonBar.Create(this);
+	m_wndRibbonBar.LoadFromResource(IDR_RIBBON);
+
+	if (!m_wndStatusBar.Create(this))
+	{
+		TRACE0("未能创建状态栏\n");
+		return -1;      // 未能创建
+	}
+
+	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);
+
+	// 启用 Visual Studio 2005 样式停靠窗口行为
+	CDockingManager::SetDockingMode(DT_SMART);
+	// 启用 Visual Studio 2005 样式停靠窗口自动隐藏行为
+	EnableAutoHidePanes(CBRS_ALIGN_ANY);
+
+	// 导航窗格将创建在左侧,因此将暂时禁用左侧的停靠: 
+	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;      // 未能创建
+	}
+
+	// 创建标题栏: 
+	if (!CreateCaptionBar())
+	{
+		TRACE0("未能创建标题栏\n");
+		return -1;      // 未能创建
+	}
+
+	// 已创建 Outlook 栏,应允许在左侧停靠。
+	EnableDocking(CBRS_ALIGN_LEFT);
+	EnableAutoHidePanes(CBRS_ALIGN_RIGHT);
+
+	// 加载菜单项图像(不在任何标准工具栏上): 
+	CMFCToolBar::AddToolBarForImageCollection(IDR_MENU_IMAGES, theApp.m_bHiColorIcons ? IDB_MENU_IMAGES_24 : 0);
+
+	// 创建停靠窗口
+	if (!CreateDockingWindows())
+	{
+		TRACE0("未能创建停靠窗口\n");
+		return -1;
+	}
+
+	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);
+	m_wndOutput.EnableDocking(CBRS_ALIGN_ANY);
+	DockPane(&m_wndOutput);
+	m_wndProperties.EnableDocking(CBRS_ALIGN_ANY);
+	DockPane(&m_wndProperties);
+
+	// 基于持久值设置视觉管理器和样式
+	OnApplicationLook(theApp.m_nAppLook);
+
+	// 启用增强的窗口管理对话框
+	EnableWindowsDialog(ID_WINDOW_MANAGER, ID_WINDOW_MANAGER, TRUE);
+
+#if __TAB_BAR__
+	// 将文档名和应用程序名称在窗口标题栏上的顺序进行交换。这
+	// 将改进任务栏的可用性,因为显示的文档名带有缩略图。
+	ModifyStyle(0, FWS_PREFIXTITLE);
+#endif
+
+	return 0;
+}
+
+BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
+{
+	if( !CMDIFrameWndEx::PreCreateWindow(cs) )
+		return FALSE;
+	// TODO: 在此处通过修改
+	//  CREATESTRUCT cs 来修改窗口类或样式
+
+	return TRUE;
+}
+
+BOOL CMainFrame::CreateDockingWindows()
+{
+	BOOL bNameValid;
+
+	// 创建类视图
+	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; // 未能创建
+	}
+
+	// 创建输出窗口
+	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; // 未能创建
+	}
+
+	// 创建属性窗口
+	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; // 未能创建
+	}
+
+	SetDockingWindowIcons(theApp.m_bHiColorIcons);
+	return TRUE;
+}
+
+void CMainFrame::SetDockingWindowIcons(BOOL bHiColorIcons)
+{
+	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);
+
+	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);
+
+	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);
+
+#if __TAB_BAR__
+	UpdateMDITabbedBarsIcons();
+#endif
+}
+
+BOOL CMainFrame::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;
+}
+
+BOOL CMainFrame::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;
+}
+
+// CMainFrame 诊断
+
+#ifdef _DEBUG
+void CMainFrame::AssertValid() const
+{
+	CMDIFrameWndEx::AssertValid();
+}
+
+void CMainFrame::Dump(CDumpContext& dc) const
+{
+	CMDIFrameWndEx::Dump(dc);
+}
+#endif //_DEBUG
+
+
+// CMainFrame 消息处理程序
+
+void CMainFrame::OnWindowManager()
+{
+	ShowWindowsDialog();
+}
+
+void CMainFrame::OnApplicationLook(UINT id)
+{
+	CWaitCursor wait;
+
+	theApp.m_nAppLook = id;
+
+	switch (theApp.m_nAppLook)
+	{
+	case ID_VIEW_APPLOOK_WIN_2000:
+		CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManager));
+		m_wndRibbonBar.SetWindows7Look(FALSE);
+		break;
+
+	case ID_VIEW_APPLOOK_OFF_XP:
+		CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOfficeXP));
+		m_wndRibbonBar.SetWindows7Look(FALSE);
+		break;
+
+	case ID_VIEW_APPLOOK_WIN_XP:
+		CMFCVisualManagerWindows::m_b3DTabsXPTheme = TRUE;
+		CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
+		m_wndRibbonBar.SetWindows7Look(FALSE);
+		break;
+
+	case ID_VIEW_APPLOOK_OFF_2003:
+		CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2003));
+		CDockingManager::SetDockingMode(DT_SMART);
+		m_wndRibbonBar.SetWindows7Look(FALSE);
+		break;
+
+	case ID_VIEW_APPLOOK_VS_2005:
+		CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2005));
+		CDockingManager::SetDockingMode(DT_SMART);
+		m_wndRibbonBar.SetWindows7Look(FALSE);
+		break;
+
+	case ID_VIEW_APPLOOK_VS_2008:
+		CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2008));
+		CDockingManager::SetDockingMode(DT_SMART);
+		m_wndRibbonBar.SetWindows7Look(FALSE);
+		break;
+
+	case ID_VIEW_APPLOOK_WINDOWS_7:
+		CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows7));
+		CDockingManager::SetDockingMode(DT_SMART);
+		m_wndRibbonBar.SetWindows7Look(TRUE);
+		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);
+		m_wndRibbonBar.SetWindows7Look(FALSE);
+	}
+
+	m_wndOutput.UpdateFonts();
+	RedrawWindow(nullptr, nullptr, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME | RDW_ERASE);
+
+	theApp.WriteInt(_T("ApplicationLook"), theApp.m_nAppLook);
+}
+
+void CMainFrame::OnUpdateApplicationLook(CCmdUI* pCmdUI)
+{
+	pCmdUI->SetRadio(theApp.m_nAppLook == pCmdUI->m_nID);
+}
+
+void CMainFrame::OnViewCaptionBar()
+{
+	m_wndCaptionBar.ShowWindow(m_wndCaptionBar.IsVisible() ? SW_HIDE : SW_SHOW);
+	RecalcLayout(FALSE);
+}
+
+void CMainFrame::OnUpdateViewCaptionBar(CCmdUI* pCmdUI)
+{
+	pCmdUI->SetCheck(m_wndCaptionBar.IsVisible());
+}
+
+void CMainFrame::OnOptions()
+{
+	CMFCRibbonCustomizeDialog *pOptionsDlg = new CMFCRibbonCustomizeDialog(this, &m_wndRibbonBar);
+	ASSERT(pOptionsDlg != nullptr);
+
+	pOptionsDlg->DoModal();
+	delete pOptionsDlg;
+}
+
+
+void CMainFrame::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
+{
+	CMDIFrameWndEx::OnSettingChange(uFlags, lpszSection);
+	m_wndOutput.UpdateFonts();
+}

+ 91 - 0
SATHelper/SATHelper/MainFrm.h

@@ -0,0 +1,91 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面 
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和 
+// MFC C++ 库软件随附的相关电子文档。  
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。  
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问 
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+// MainFrm.h: CMainFrame 类的接口
+//
+
+#pragma once
+#include "FileView.h"
+#include "ClassView.h"
+#include "OutputWnd.h"
+#include "PropertiesWnd.h"
+#include "CalendarBar.h"
+#include "Resource.h"
+
+class COutlookBar : public CMFCOutlookBar
+{
+	virtual BOOL AllowShowOnPaneMenu() const { return TRUE; }
+	virtual void GetPaneName(CString& strName) const { BOOL bNameValid = strName.LoadString(IDS_OUTLOOKBAR); ASSERT(bNameValid); if (!bNameValid) strName.Empty(); }
+};
+
+class CMainFrame : public CMDIFrameWndEx
+{
+	DECLARE_DYNAMIC(CMainFrame)
+public:
+	CMainFrame() noexcept;
+
+// 特性
+public:
+
+// 操作
+public:
+
+// 重写
+public:
+	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
+
+// 实现
+public:
+	virtual ~CMainFrame();
+#ifdef _DEBUG
+	virtual void AssertValid() const;
+	virtual void Dump(CDumpContext& dc) const;
+#endif
+
+protected:  // 控件条嵌入成员
+	CMFCRibbonBar     m_wndRibbonBar;
+	CMFCRibbonApplicationButton m_MainButton;
+	CMFCToolBarImages m_PanelImages;
+	CMFCRibbonStatusBar  m_wndStatusBar;
+	CFileView         m_wndFileView;
+	CClassView        m_wndClassView;
+	COutputWnd        m_wndOutput;
+	CPropertiesWnd    m_wndProperties;
+	COutlookBar       m_wndNavigationBar;
+	CMFCShellTreeCtrl m_wndTree;
+	CCalendarBar      m_wndCalendar;
+	CMFCCaptionBar    m_wndCaptionBar;
+
+// 生成的消息映射函数
+protected:
+	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
+	afx_msg void OnWindowManager();
+	afx_msg void OnApplicationLook(UINT id);
+	afx_msg void OnUpdateApplicationLook(CCmdUI* pCmdUI);
+	afx_msg void OnViewCaptionBar();
+	afx_msg void OnUpdateViewCaptionBar(CCmdUI* pCmdUI);
+	afx_msg void OnOptions();
+	afx_msg void OnSettingChange(UINT uFlags, LPCTSTR lpszSection);
+	DECLARE_MESSAGE_MAP()
+
+	BOOL CreateDockingWindows();
+	void SetDockingWindowIcons(BOOL bHiColorIcons);
+	BOOL CreateOutlookBar(CMFCOutlookBar& bar, UINT uiID, CMFCShellTreeCtrl& tree, CCalendarBar& calendar, int nInitialWidth);
+	BOOL CreateCaptionBar();
+
+	int FindFocusedOutlookWnd(CMFCOutlookBarTabCtrl** ppOutlookWnd);
+
+	CMFCOutlookBarTabCtrl* FindOutlookParent(CWnd* pWnd);
+	CMFCOutlookBarTabCtrl* m_pCurrOutlookWnd;
+	CMFCOutlookBarPane*    m_pCurrOutlookPage;
+};
+
+

+ 210 - 0
SATHelper/SATHelper/OutputWnd.cpp

@@ -0,0 +1,210 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和
+// MFC C++ 库软件随附的相关电子文档。
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+#include "stdafx.h"
+#include "framework.h"
+
+#include "OutputWnd.h"
+#include "Resource.h"
+#include "MainFrm.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+// COutputBar
+
+COutputWnd::COutputWnd() noexcept
+{
+}
+
+COutputWnd::~COutputWnd()
+{
+}
+
+BEGIN_MESSAGE_MAP(COutputWnd, CDockablePane)
+	ON_WM_CREATE()
+	ON_WM_SIZE()
+END_MESSAGE_MAP()
+
+int COutputWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
+{
+	if (CDockablePane::OnCreate(lpCreateStruct) == -1)
+		return -1;
+
+	CRect rectDummy;
+	rectDummy.SetRectEmpty();
+
+	// 创建选项卡窗口: 
+	if (!m_wndTabs.Create(CMFCTabCtrl::STYLE_FLAT, rectDummy, this, 1))
+	{
+		TRACE0("未能创建输出选项卡窗口\n");
+		return -1;      // 未能创建
+	}
+
+	// 创建输出窗格: 
+	const DWORD dwStyle = LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL;
+
+	if (!m_wndOutputBuild.Create(dwStyle, rectDummy, &m_wndTabs, 2) ||
+		!m_wndOutputDebug.Create(dwStyle, rectDummy, &m_wndTabs, 3) ||
+		!m_wndOutputFind.Create(dwStyle, rectDummy, &m_wndTabs, 4))
+	{
+		TRACE0("未能创建输出窗口\n");
+		return -1;      // 未能创建
+	}
+
+	UpdateFonts();
+
+	CString strTabName;
+	BOOL bNameValid;
+
+	// 将列表窗口附加到选项卡: 
+	bNameValid = strTabName.LoadString(IDS_BUILD_TAB);
+	ASSERT(bNameValid);
+	m_wndTabs.AddTab(&m_wndOutputBuild, strTabName, (UINT)0);
+	bNameValid = strTabName.LoadString(IDS_DEBUG_TAB);
+	ASSERT(bNameValid);
+	m_wndTabs.AddTab(&m_wndOutputDebug, strTabName, (UINT)1);
+	bNameValid = strTabName.LoadString(IDS_FIND_TAB);
+	ASSERT(bNameValid);
+	m_wndTabs.AddTab(&m_wndOutputFind, strTabName, (UINT)2);
+
+	// 使用一些虚拟文本填写输出选项卡(无需复杂数据)
+	FillBuildWindow();
+	FillDebugWindow();
+	FillFindWindow();
+
+	return 0;
+}
+
+void COutputWnd::OnSize(UINT nType, int cx, int cy)
+{
+	CDockablePane::OnSize(nType, cx, cy);
+
+	// 选项卡控件应覆盖整个工作区: 
+	m_wndTabs.SetWindowPos (nullptr, -1, -1, cx, cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
+}
+
+void COutputWnd::AdjustHorzScroll(CListBox& wndListBox)
+{
+	CClientDC dc(this);
+	CFont* pOldFont = dc.SelectObject(&afxGlobalData.fontRegular);
+
+	int cxExtentMax = 0;
+
+	for (int i = 0; i < wndListBox.GetCount(); i ++)
+	{
+		CString strItem;
+		wndListBox.GetText(i, strItem);
+
+		cxExtentMax = max(cxExtentMax, (int)dc.GetTextExtent(strItem).cx);
+	}
+
+	wndListBox.SetHorizontalExtent(cxExtentMax);
+	dc.SelectObject(pOldFont);
+}
+
+void COutputWnd::FillBuildWindow()
+{
+	m_wndOutputBuild.AddString(_T("生成输出正显示在此处。"));
+	m_wndOutputBuild.AddString(_T("输出正显示在列表视图的行中"));
+	m_wndOutputBuild.AddString(_T("但您可以根据需要更改其显示方式..."));
+}
+
+void COutputWnd::FillDebugWindow()
+{
+	m_wndOutputDebug.AddString(_T("调试输出正显示在此处。"));
+	m_wndOutputDebug.AddString(_T("输出正显示在列表视图的行中"));
+	m_wndOutputDebug.AddString(_T("但您可以根据需要更改其显示方式..."));
+}
+
+void COutputWnd::FillFindWindow()
+{
+	m_wndOutputFind.AddString(_T("查找输出正显示在此处。"));
+	m_wndOutputFind.AddString(_T("输出正显示在列表视图的行中"));
+	m_wndOutputFind.AddString(_T("但您可以根据需要更改其显示方式..."));
+}
+
+void COutputWnd::UpdateFonts()
+{
+	m_wndOutputBuild.SetFont(&afxGlobalData.fontRegular);
+	m_wndOutputDebug.SetFont(&afxGlobalData.fontRegular);
+	m_wndOutputFind.SetFont(&afxGlobalData.fontRegular);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// COutputList1
+
+COutputList::COutputList() noexcept
+{
+}
+
+COutputList::~COutputList()
+{
+}
+
+BEGIN_MESSAGE_MAP(COutputList, CListBox)
+	ON_WM_CONTEXTMENU()
+	ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
+	ON_COMMAND(ID_EDIT_CLEAR, OnEditClear)
+	ON_COMMAND(ID_VIEW_OUTPUTWND, OnViewOutput)
+	ON_WM_WINDOWPOSCHANGING()
+END_MESSAGE_MAP()
+/////////////////////////////////////////////////////////////////////////////
+// COutputList 消息处理程序
+
+void COutputList::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
+{
+	CMenu menu;
+	menu.LoadMenu(IDR_OUTPUT_POPUP);
+
+	CMenu* pSumMenu = menu.GetSubMenu(0);
+
+	if (AfxGetMainWnd()->IsKindOf(RUNTIME_CLASS(CMDIFrameWndEx)))
+	{
+		CMFCPopupMenu* pPopupMenu = new CMFCPopupMenu;
+
+		if (!pPopupMenu->Create(this, point.x, point.y, (HMENU)pSumMenu->m_hMenu, FALSE, TRUE))
+			return;
+
+		((CMDIFrameWndEx*)AfxGetMainWnd())->OnShowPopupMenu(pPopupMenu);
+		UpdateDialogControls(this, FALSE);
+	}
+
+	SetFocus();
+}
+
+void COutputList::OnEditCopy()
+{
+	MessageBox(_T("复制输出"));
+}
+
+void COutputList::OnEditClear()
+{
+	MessageBox(_T("清除输出"));
+}
+
+void COutputList::OnViewOutput()
+{
+	CDockablePane* pParentBar = DYNAMIC_DOWNCAST(CDockablePane, GetOwner());
+	CMDIFrameWndEx* pMainFrame = DYNAMIC_DOWNCAST(CMDIFrameWndEx, GetTopLevelFrame());
+
+	if (pMainFrame != nullptr && pParentBar != nullptr)
+	{
+		pMainFrame->SetFocus();
+		pMainFrame->ShowPane(pParentBar, FALSE, FALSE, FALSE);
+		pMainFrame->RecalcLayout();
+
+	}
+}

+ 69 - 0
SATHelper/SATHelper/OutputWnd.h

@@ -0,0 +1,69 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和
+// MFC C++ 库软件随附的相关电子文档。
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+#pragma once
+
+/////////////////////////////////////////////////////////////////////////////
+// COutputList 窗口
+
+class COutputList : public CListBox
+{
+// 构造
+public:
+	COutputList() noexcept;
+
+// 实现
+public:
+	virtual ~COutputList();
+
+protected:
+	afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
+	afx_msg void OnEditCopy();
+	afx_msg void OnEditClear();
+	afx_msg void OnViewOutput();
+
+	DECLARE_MESSAGE_MAP()
+};
+
+class COutputWnd : public CDockablePane
+{
+// 构造
+public:
+	COutputWnd() noexcept;
+
+	void UpdateFonts();
+
+// 特性
+protected:
+	CMFCTabCtrl	m_wndTabs;
+
+	COutputList m_wndOutputBuild;
+	COutputList m_wndOutputDebug;
+	COutputList m_wndOutputFind;
+
+protected:
+	void FillBuildWindow();
+	void FillDebugWindow();
+	void FillFindWindow();
+
+	void AdjustHorzScroll(CListBox& wndListBox);
+
+// 实现
+public:
+	virtual ~COutputWnd();
+
+protected:
+	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
+	afx_msg void OnSize(UINT nType, int cx, int cy);
+
+	DECLARE_MESSAGE_MAP()
+};
+

+ 283 - 0
SATHelper/SATHelper/PropertiesWnd.cpp

@@ -0,0 +1,283 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和
+// MFC C++ 库软件随附的相关电子文档。
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+#include "stdafx.h"
+#include "framework.h"
+
+#include "PropertiesWnd.h"
+#include "Resource.h"
+#include "MainFrm.h"
+#include "SATHelper.h"
+
+#ifdef _DEBUG
+#undef THIS_FILE
+static char THIS_FILE[]=__FILE__;
+#define new DEBUG_NEW
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+// CResourceViewBar
+
+CPropertiesWnd::CPropertiesWnd() noexcept
+{
+	m_nComboHeight = 0;
+}
+
+CPropertiesWnd::~CPropertiesWnd()
+{
+}
+
+BEGIN_MESSAGE_MAP(CPropertiesWnd, CDockablePane)
+	ON_WM_CREATE()
+	ON_WM_SIZE()
+	ON_COMMAND(ID_EXPAND_ALL, OnExpandAllProperties)
+	ON_UPDATE_COMMAND_UI(ID_EXPAND_ALL, OnUpdateExpandAllProperties)
+	ON_COMMAND(ID_SORTPROPERTIES, OnSortProperties)
+	ON_UPDATE_COMMAND_UI(ID_SORTPROPERTIES, OnUpdateSortProperties)
+	ON_COMMAND(ID_PROPERTIES1, OnProperties1)
+	ON_UPDATE_COMMAND_UI(ID_PROPERTIES1, OnUpdateProperties1)
+	ON_COMMAND(ID_PROPERTIES2, OnProperties2)
+	ON_UPDATE_COMMAND_UI(ID_PROPERTIES2, OnUpdateProperties2)
+	ON_WM_SETFOCUS()
+	ON_WM_SETTINGCHANGE()
+END_MESSAGE_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// CResourceViewBar 消息处理程序
+
+void CPropertiesWnd::AdjustLayout()
+{
+	if (GetSafeHwnd () == nullptr || (AfxGetMainWnd() != nullptr && AfxGetMainWnd()->IsIconic()))
+	{
+		return;
+	}
+
+	CRect rectClient;
+	GetClientRect(rectClient);
+
+	int cyTlb = m_wndToolBar.CalcFixedLayout(FALSE, TRUE).cy;
+
+	m_wndObjectCombo.SetWindowPos(nullptr, rectClient.left, rectClient.top, rectClient.Width(), m_nComboHeight, SWP_NOACTIVATE | SWP_NOZORDER);
+	m_wndToolBar.SetWindowPos(nullptr, rectClient.left, rectClient.top + m_nComboHeight, rectClient.Width(), cyTlb, SWP_NOACTIVATE | SWP_NOZORDER);
+	m_wndPropList.SetWindowPos(nullptr, rectClient.left, rectClient.top + m_nComboHeight + cyTlb, rectClient.Width(), rectClient.Height() -(m_nComboHeight+cyTlb), SWP_NOACTIVATE | SWP_NOZORDER);
+}
+
+int CPropertiesWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
+{
+	if (CDockablePane::OnCreate(lpCreateStruct) == -1)
+		return -1;
+
+	CRect rectDummy;
+	rectDummy.SetRectEmpty();
+
+	// 创建组合: 
+	const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_BORDER | CBS_SORT | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
+
+	if (!m_wndObjectCombo.Create(dwViewStyle, rectDummy, this, 1))
+	{
+		TRACE0("未能创建属性组合 \n");
+		return -1;      // 未能创建
+	}
+
+	m_wndObjectCombo.AddString(_T("应用程序"));
+	m_wndObjectCombo.AddString(_T("属性窗口"));
+	m_wndObjectCombo.SetCurSel(0);
+
+	CRect rectCombo;
+	m_wndObjectCombo.GetClientRect (&rectCombo);
+
+	m_nComboHeight = rectCombo.Height();
+
+	if (!m_wndPropList.Create(WS_VISIBLE | WS_CHILD, rectDummy, this, 2))
+	{
+		TRACE0("未能创建属性网格\n");
+		return -1;      // 未能创建
+	}
+
+	InitPropList();
+
+	m_wndToolBar.Create(this, AFX_DEFAULT_TOOLBAR_STYLE, IDR_PROPERTIES);
+	m_wndToolBar.LoadToolBar(IDR_PROPERTIES, 0, 0, TRUE /* 已锁定*/);
+	m_wndToolBar.CleanUpLockedImages();
+	m_wndToolBar.LoadBitmap(theApp.m_bHiColorIcons ? IDB_PROPERTIES_HC : IDR_PROPERTIES, 0, 0, TRUE /* 锁定*/);
+
+	m_wndToolBar.SetPaneStyle(m_wndToolBar.GetPaneStyle() | CBRS_TOOLTIPS | CBRS_FLYBY);
+	m_wndToolBar.SetPaneStyle(m_wndToolBar.GetPaneStyle() & ~(CBRS_GRIPPER | CBRS_SIZE_DYNAMIC | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT));
+	m_wndToolBar.SetOwner(this);
+
+	// 所有命令将通过此控件路由,而不是通过主框架路由: 
+	m_wndToolBar.SetRouteCommandsViaFrame(FALSE);
+
+	AdjustLayout();
+	return 0;
+}
+
+void CPropertiesWnd::OnSize(UINT nType, int cx, int cy)
+{
+	CDockablePane::OnSize(nType, cx, cy);
+	AdjustLayout();
+}
+
+void CPropertiesWnd::OnExpandAllProperties()
+{
+	m_wndPropList.ExpandAll();
+}
+
+void CPropertiesWnd::OnUpdateExpandAllProperties(CCmdUI* /* pCmdUI */)
+{
+}
+
+void CPropertiesWnd::OnSortProperties()
+{
+	m_wndPropList.SetAlphabeticMode(!m_wndPropList.IsAlphabeticMode());
+}
+
+void CPropertiesWnd::OnUpdateSortProperties(CCmdUI* pCmdUI)
+{
+	pCmdUI->SetCheck(m_wndPropList.IsAlphabeticMode());
+}
+
+void CPropertiesWnd::OnProperties1()
+{
+	// TODO: 在此处添加命令处理程序代码
+}
+
+void CPropertiesWnd::OnUpdateProperties1(CCmdUI* /*pCmdUI*/)
+{
+	// TODO: 在此处添加命令更新 UI 处理程序代码
+}
+
+void CPropertiesWnd::OnProperties2()
+{
+	// TODO: 在此处添加命令处理程序代码
+}
+
+void CPropertiesWnd::OnUpdateProperties2(CCmdUI* /*pCmdUI*/)
+{
+	// TODO: 在此处添加命令更新 UI 处理程序代码
+}
+
+void CPropertiesWnd::InitPropList()
+{
+	SetPropListFont();
+
+	m_wndPropList.EnableHeaderCtrl(FALSE);
+	m_wndPropList.EnableDescriptionArea();
+	m_wndPropList.SetVSDotNetLook();
+	m_wndPropList.MarkModifiedProperties();
+
+	CMFCPropertyGridProperty* pGroup1 = new CMFCPropertyGridProperty(_T("外观"));
+
+	pGroup1->AddSubItem(new CMFCPropertyGridProperty(_T("三维外观"), (_variant_t) false, _T("指定窗口的字体不使用粗体,并且控件将使用三维边框")));
+
+	CMFCPropertyGridProperty* pProp = new CMFCPropertyGridProperty(_T("边框"), _T("对话框外框"), _T("其中之一: “无”、“细”、“可调整大小”或“对话框外框”"));
+	pProp->AddOption(_T("无"));
+	pProp->AddOption(_T("细"));
+	pProp->AddOption(_T("可调整大小"));
+	pProp->AddOption(_T("对话框外框"));
+	pProp->AllowEdit(FALSE);
+
+	pGroup1->AddSubItem(pProp);
+	pGroup1->AddSubItem(new CMFCPropertyGridProperty(_T("标题"), (_variant_t) _T("关于"), _T("指定窗口标题栏中显示的文本")));
+
+	m_wndPropList.AddProperty(pGroup1);
+
+	CMFCPropertyGridProperty* pSize = new CMFCPropertyGridProperty(_T("窗口大小"), 0, TRUE);
+
+	pProp = new CMFCPropertyGridProperty(_T("高度"), (_variant_t) 250l, _T("指定窗口的高度"));
+	pProp->EnableSpinControl(TRUE, 50, 300);
+	pSize->AddSubItem(pProp);
+
+	pProp = new CMFCPropertyGridProperty( _T("宽度"), (_variant_t) 150l, _T("指定窗口的宽度"));
+	pProp->EnableSpinControl(TRUE, 50, 200);
+	pSize->AddSubItem(pProp);
+
+	m_wndPropList.AddProperty(pSize);
+
+	CMFCPropertyGridProperty* pGroup2 = new CMFCPropertyGridProperty(_T("字体"));
+
+	LOGFONT lf;
+	CFont* font = CFont::FromHandle((HFONT) GetStockObject(DEFAULT_GUI_FONT));
+	font->GetLogFont(&lf);
+
+	_tcscpy_s(lf.lfFaceName, _T("宋体, Arial"));
+
+	pGroup2->AddSubItem(new CMFCPropertyGridFontProperty(_T("字体"), lf, CF_EFFECTS | CF_SCREENFONTS, _T("指定窗口的默认字体")));
+	pGroup2->AddSubItem(new CMFCPropertyGridProperty(_T("使用系统字体"), (_variant_t) true, _T("指定窗口使用“MS Shell Dlg”字体")));
+
+	m_wndPropList.AddProperty(pGroup2);
+
+	CMFCPropertyGridProperty* pGroup3 = new CMFCPropertyGridProperty(_T("杂项"));
+	pProp = new CMFCPropertyGridProperty(_T("(名称)"), _T("应用程序"));
+	pProp->Enable(FALSE);
+	pGroup3->AddSubItem(pProp);
+
+	CMFCPropertyGridColorProperty* pColorProp = new CMFCPropertyGridColorProperty(_T("窗口颜色"), RGB(210, 192, 254), nullptr, _T("指定默认的窗口颜色"));
+	pColorProp->EnableOtherButton(_T("其他..."));
+	pColorProp->EnableAutomaticButton(_T("默认"), ::GetSysColor(COLOR_3DFACE));
+	pGroup3->AddSubItem(pColorProp);
+
+	static const TCHAR szFilter[] = _T("图标文件(*.ico)|*.ico|所有文件(*.*)|*.*||");
+	pGroup3->AddSubItem(new CMFCPropertyGridFileProperty(_T("图标"), TRUE, _T(""), _T("ico"), 0, szFilter, _T("指定窗口图标")));
+
+	pGroup3->AddSubItem(new CMFCPropertyGridFileProperty(_T("文件夹"), _T("c:\\")));
+
+	m_wndPropList.AddProperty(pGroup3);
+
+	CMFCPropertyGridProperty* pGroup4 = new CMFCPropertyGridProperty(_T("层次结构"));
+
+	CMFCPropertyGridProperty* pGroup41 = new CMFCPropertyGridProperty(_T("第一个子级"));
+	pGroup4->AddSubItem(pGroup41);
+
+	CMFCPropertyGridProperty* pGroup411 = new CMFCPropertyGridProperty(_T("第二个子级"));
+	pGroup41->AddSubItem(pGroup411);
+
+	pGroup411->AddSubItem(new CMFCPropertyGridProperty(_T("项 1"), (_variant_t) _T("值 1"), _T("此为说明")));
+	pGroup411->AddSubItem(new CMFCPropertyGridProperty(_T("项 2"), (_variant_t) _T("值 2"), _T("此为说明")));
+	pGroup411->AddSubItem(new CMFCPropertyGridProperty(_T("项 3"), (_variant_t) _T("值 3"), _T("此为说明")));
+
+	pGroup4->Expand(FALSE);
+	m_wndPropList.AddProperty(pGroup4);
+}
+
+void CPropertiesWnd::OnSetFocus(CWnd* pOldWnd)
+{
+	CDockablePane::OnSetFocus(pOldWnd);
+	m_wndPropList.SetFocus();
+}
+
+void CPropertiesWnd::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
+{
+	CDockablePane::OnSettingChange(uFlags, lpszSection);
+	SetPropListFont();
+}
+
+void CPropertiesWnd::SetPropListFont()
+{
+	::DeleteObject(m_fntPropList.Detach());
+
+	LOGFONT lf;
+	afxGlobalData.fontRegular.GetLogFont(&lf);
+
+	NONCLIENTMETRICS info;
+	info.cbSize = sizeof(info);
+
+	afxGlobalData.GetNonClientMetrics(info);
+
+	lf.lfHeight = info.lfMenuFont.lfHeight;
+	lf.lfWeight = info.lfMenuFont.lfWeight;
+	lf.lfItalic = info.lfMenuFont.lfItalic;
+
+	m_fntPropList.CreateFontIndirect(&lf);
+
+	m_wndPropList.SetFont(&m_fntPropList);
+	m_wndObjectCombo.SetFont(&m_fntPropList);
+}

+ 72 - 0
SATHelper/SATHelper/PropertiesWnd.h

@@ -0,0 +1,72 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和
+// MFC C++ 库软件随附的相关电子文档。
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+#pragma once
+
+class CPropertiesToolBar : public CMFCToolBar
+{
+public:
+	virtual void OnUpdateCmdUI(CFrameWnd* /*pTarget*/, BOOL bDisableIfNoHndler)
+	{
+		CMFCToolBar::OnUpdateCmdUI((CFrameWnd*) GetOwner(), bDisableIfNoHndler);
+	}
+
+	virtual BOOL AllowShowOnList() const { return FALSE; }
+};
+
+class CPropertiesWnd : public CDockablePane
+{
+// 构造
+public:
+	CPropertiesWnd() noexcept;
+
+	void AdjustLayout();
+
+// 特性
+public:
+	void SetVSDotNetLook(BOOL bSet)
+	{
+		m_wndPropList.SetVSDotNetLook(bSet);
+		m_wndPropList.SetGroupNameFullWidth(bSet);
+	}
+
+protected:
+	CFont m_fntPropList;
+	CComboBox m_wndObjectCombo;
+	CPropertiesToolBar m_wndToolBar;
+	CMFCPropertyGridCtrl m_wndPropList;
+
+// 实现
+public:
+	virtual ~CPropertiesWnd();
+
+protected:
+	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
+	afx_msg void OnSize(UINT nType, int cx, int cy);
+	afx_msg void OnExpandAllProperties();
+	afx_msg void OnUpdateExpandAllProperties(CCmdUI* pCmdUI);
+	afx_msg void OnSortProperties();
+	afx_msg void OnUpdateSortProperties(CCmdUI* pCmdUI);
+	afx_msg void OnProperties1();
+	afx_msg void OnUpdateProperties1(CCmdUI* pCmdUI);
+	afx_msg void OnProperties2();
+	afx_msg void OnUpdateProperties2(CCmdUI* pCmdUI);
+	afx_msg void OnSetFocus(CWnd* pOldWnd);
+	afx_msg void OnSettingChange(UINT uFlags, LPCTSTR lpszSection);
+
+	DECLARE_MESSAGE_MAP()
+
+	void InitPropList();
+	void SetPropListFont();
+
+	int m_nComboHeight;
+};
+

+ 124 - 0
SATHelper/SATHelper/Resource.h

@@ -0,0 +1,124 @@
+//{{NO_DEPENDENCIES}}
+// 生成的 Microsoft Visual C++ 包含文件。
+// 由 SATHelper.rc 使用
+//
+#define IDR_PASTE_MENU				151
+#define IDR_WINDOWS_MENU			152
+#define IDD_ABOUTBOX				100
+#define IDP_OLE_INIT_FAILED			100
+#define ID_WRITE_PASTEASHYPERLINK	32770
+#define IDB_WRITESMALL				110
+#define IDB_WRITELARGE				111
+#define IDB_MAIN					112
+#define IDB_BUTTONS					113
+#define IDB_FILELARGE				114
+#define IDB_FILESMALL				115
+#define IDR_POPUP_EDIT				119
+#define ID_STATUSBAR_PANE1			120
+#define ID_STATUSBAR_PANE2			121
+#define IDS_STATUS_PANE1			122
+#define IDS_STATUS_PANE2			123
+#define IDR_MAINFRAME				128
+#define IDR_MAINFRAME_256			129
+#define IDR_SATHelperTYPE				130
+#define ID_WINDOW_MANAGER			131
+#define ID_VIEW_FILEVIEW			133
+#define ID_VIEW_CLASSVIEW			134
+#define ID_PROPERTIES				135
+#define ID_OPEN						136
+#define ID_OPEN_WITH				137
+#define ID_DUMMY_COMPILE			138
+#define ID_CLASS_ADD_MEMBER_FUNCTION	139
+#define ID_CLASS_ADD_MEMBER_VARIABLE	140
+#define ID_CLASS_DEFINITION			141
+#define ID_CLASS_PROPERTIES			142
+#define ID_NEW_FOLDER				143
+#define ID_SORT_MENU				144
+#define ID_SORTING_GROUPBYTYPE		145
+#define ID_SORTING_SORTALPHABETIC	146
+#define ID_SORTING_SORTBYTYPE		147
+#define ID_SORTING_SORTBYACCESS		148
+#define ID_VIEW_OUTPUTWND			149
+#define ID_VIEW_PROPERTIESWND		150
+#define ID_SORTPROPERTIES			151
+#define ID_PROPERTIES1				152
+#define ID_PROPERTIES2				153
+#define ID_EXPAND_ALL				154
+#define IDS_FILE_VIEW				155
+#define IDS_CLASS_VIEW				156
+#define IDS_OUTPUT_WND				157
+#define IDS_PROPERTIES_WND			158
+#define IDI_FILE_VIEW				161
+#define IDI_FILE_VIEW_HC			162
+#define IDI_CLASS_VIEW				163
+#define IDI_CLASS_VIEW_HC			164
+#define IDI_OUTPUT_WND				165
+#define IDI_OUTPUT_WND_HC			166
+#define IDI_PROPERTIES_WND			167
+#define IDI_PROPERTIES_WND_HC		168
+#define IDR_EXPLORER				169
+#define IDB_EXPLORER_24				170
+#define IDR_SORT					171
+#define IDB_SORT_24					172
+#define IDR_POPUP_SORT				173
+#define IDR_POPUP_EXPLORER			174
+#define IDB_FILE_VIEW				175
+#define IDB_FILE_VIEW_24			176
+#define IDB_CLASS_VIEW				177
+#define IDB_CLASS_VIEW_24			178
+#define IDR_MENU_IMAGES				179
+#define IDB_MENU_IMAGES_24			180
+#define ID_TOOLS_MACRO				181
+#define IDR_OUTPUT_POPUP			182
+#define IDR_PROPERTIES				183
+#define IDB_PROPERTIES_HC			184
+#define ID_VIEW_NAVIGATION			185
+#define IDB_NAVIGATION_LARGE		186
+#define IDB_NAVIGATION_LARGE_HC		187
+#define IDB_PAGES					188
+#define IDB_PAGES_HC				189
+#define IDB_PAGES_SMALL				190
+#define IDB_PAGES_SMALL_HC			191
+#define IDR_THEME_MENU				200
+#define ID_SET_STYLE				201
+#define ID_VIEW_APPLOOK_WIN_2000	205
+#define ID_VIEW_APPLOOK_OFF_XP		206
+#define ID_VIEW_APPLOOK_WIN_XP		207
+#define ID_VIEW_APPLOOK_OFF_2003	208
+#define ID_VIEW_APPLOOK_VS_2005		209
+#define ID_VIEW_APPLOOK_VS_2008		210
+#define ID_VIEW_APPLOOK_OFF_2007_BLUE	215
+#define ID_VIEW_APPLOOK_OFF_2007_BLACK	216
+#define ID_VIEW_APPLOOK_OFF_2007_SILVER	217
+#define ID_VIEW_APPLOOK_OFF_2007_AQUA	218
+#define ID_VIEW_APPLOOK_WINDOWS_7	219
+#define ID_TOOLS_OPTIONS			220
+#define ID_VIEW_CAPTION_BAR			221
+#define IDB_INFO					230
+#define IDS_CAPTION_BUTTON			231
+#define IDS_CAPTION_BUTTON_TIP		232
+#define IDS_CAPTION_TEXT			233
+#define IDS_CAPTION_IMAGE_TIP		234
+#define IDS_CAPTION_IMAGE_TEXT		235
+#define IDS_MYCALENDARS				250
+#define IDS_CALENDAR				251
+#define IDS_SHORTCUTS				252
+#define IDS_FOLDERS					253
+#define IDS_OUTLOOKBAR				258
+#define IDS_BUILD_TAB				300
+#define IDS_DEBUG_TAB				301
+#define IDS_FIND_TAB				302
+#define IDS_EXPLORER				305
+#define IDS_EDIT_MENU				306
+#define IDR_RIBBON             			307
+
+// 新对象的下一组默认值
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE	310
+#define _APS_NEXT_CONTROL_VALUE		1000
+#define _APS_NEXT_SYMED_VALUE		310
+#define _APS_NEXT_COMMAND_VALUE		32771
+#endif
+#endif

+ 241 - 0
SATHelper/SATHelper/SATHelper.cpp

@@ -0,0 +1,241 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和
+// MFC C++ 库软件随附的相关电子文档。
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+// SATHelper.cpp: 定义应用程序的类行为。
+//
+
+#include "stdafx.h"
+#include "framework.h"
+#include "afxwinappex.h"
+#include "afxdialogex.h"
+#include "SATHelper.h"
+#include "MainFrm.h"
+
+#include "ChildFrm.h"
+#include "SATHelperDoc.h"
+#include "SATHelperView.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#endif
+
+
+// CSATHelperApp
+
+BEGIN_MESSAGE_MAP(CSATHelperApp, CWinAppEx)
+	ON_COMMAND(ID_APP_ABOUT, &CSATHelperApp::OnAppAbout)
+	// 基于文件的标准文档命令
+	ON_COMMAND(ID_FILE_NEW, &CWinAppEx::OnFileNew)
+	ON_COMMAND(ID_FILE_OPEN, &CWinAppEx::OnFileOpen)
+	// 标准打印设置命令
+	ON_COMMAND(ID_FILE_PRINT_SETUP, &CWinAppEx::OnFilePrintSetup)
+END_MESSAGE_MAP()
+
+
+// CSATHelperApp 构造
+
+CSATHelperApp::CSATHelperApp() noexcept
+{
+	m_bHiColorIcons = TRUE;
+
+	// 支持重新启动管理器
+	m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_ALL_ASPECTS;
+#ifdef _MANAGED
+	// 如果应用程序是利用公共语言运行时支持(/clr)构建的,则: 
+	//     1) 必须有此附加设置,“重新启动管理器”支持才能正常工作。
+	//     2) 在您的项目中,您必须按照生成顺序向 System.Windows.Forms 添加引用。
+	System::Windows::Forms::Application::SetUnhandledExceptionMode(System::Windows::Forms::UnhandledExceptionMode::ThrowException);
+#endif
+
+	// TODO: 将以下应用程序 ID 字符串替换为唯一的 ID 字符串;建议的字符串格式
+	//为 CompanyName.ProductName.SubProduct.VersionInformation
+	SetAppID(_T("SATHelper.AppID.NoVersion"));
+
+	// TODO:  在此处添加构造代码,
+	// 将所有重要的初始化放置在 InitInstance 中
+}
+
+// 唯一的 CSATHelperApp 对象
+
+CSATHelperApp theApp;
+
+
+// CSATHelperApp 初始化
+
+BOOL CSATHelperApp::InitInstance()
+{
+	// 如果一个运行在 Windows XP 上的应用程序清单指定要
+	// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
+	//则需要 InitCommonControlsEx()。  否则,将无法创建窗口。
+	INITCOMMONCONTROLSEX InitCtrls;
+	InitCtrls.dwSize = sizeof(InitCtrls);
+	// 将它设置为包括所有要在应用程序中使用的
+	// 公共控件类。
+	InitCtrls.dwICC = ICC_WIN95_CLASSES;
+	InitCommonControlsEx(&InitCtrls);
+
+	CWinAppEx::InitInstance();
+
+
+	// 初始化 OLE 库
+	if (!AfxOleInit())
+	{
+		AfxMessageBox(IDP_OLE_INIT_FAILED);
+		return FALSE;
+	}
+
+	AfxEnableControlContainer();
+
+#if __TAB_BAR__
+	EnableTaskbarInteraction();
+#else
+	EnableTaskbarInteraction(FALSE);
+#endif
+
+	// 使用 RichEdit 控件需要 AfxInitRichEdit2()
+	// AfxInitRichEdit2();
+
+	// 标准初始化
+	// 如果未使用这些功能并希望减小
+	// 最终可执行文件的大小,则应移除下列
+	// 不需要的特定初始化例程
+	// 更改用于存储设置的注册表项
+	// TODO: 应适当修改该字符串,
+	// 例如修改为公司或组织名
+	SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
+	LoadStdProfileSettings(4);  // 加载标准 INI 文件选项(包括 MRU)
+
+
+	InitContextMenuManager();
+	InitShellManager();
+
+	InitKeyboardManager();
+
+	InitTooltipManager();
+	CMFCToolTipInfo ttParams;
+	ttParams.m_bVislManagerTheme = TRUE;
+	theApp.GetTooltipManager()->SetTooltipParams(AFX_TOOLTIP_TYPE_ALL,
+		RUNTIME_CLASS(CMFCToolTipCtrl), &ttParams);
+
+	// 注册应用程序的文档模板。  文档模板
+	// 将用作文档、框架窗口和视图之间的连接
+	CMultiDocTemplate* pDocTemplate;
+	pDocTemplate = new CMultiDocTemplate(IDR_SATHelperTYPE,
+		RUNTIME_CLASS(CSATHelperDoc),
+		RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
+		RUNTIME_CLASS(CSATHelperView));
+	if (!pDocTemplate)
+		return FALSE;
+	AddDocTemplate(pDocTemplate);
+
+	// 创建主 MDI 框架窗口
+	CMainFrame* pMainFrame = new CMainFrame;
+	if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))
+	{
+		delete pMainFrame;
+		return FALSE;
+	}
+	m_pMainWnd = pMainFrame;
+
+
+	// 分析标准 shell 命令、DDE、打开文件操作的命令行
+	CCommandLineInfo cmdInfo;
+	ParseCommandLine(cmdInfo);
+
+
+
+	// 调度在命令行中指定的命令。  如果
+	// 用 /RegServer、/Register、/Unregserver 或 /Unregister 启动应用程序,则返回 FALSE。
+	if (!ProcessShellCommand(cmdInfo))
+		return FALSE;
+	// 主窗口已初始化,因此显示它并对其进行更新
+	pMainFrame->ShowWindow(m_nCmdShow);
+	pMainFrame->UpdateWindow();
+
+	return TRUE;
+}
+
+int CSATHelperApp::ExitInstance()
+{
+	//TODO: 处理可能已添加的附加资源
+	AfxOleTerm(FALSE);
+
+	return CWinAppEx::ExitInstance();
+}
+
+// CSATHelperApp 消息处理程序
+
+
+// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
+
+class CAboutDlg : public CDialogEx
+{
+public:
+	CAboutDlg() noexcept;
+
+// 对话框数据
+#ifdef AFX_DESIGN_TIME
+	enum { IDD = IDD_ABOUTBOX };
+#endif
+
+protected:
+	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
+
+// 实现
+protected:
+	DECLARE_MESSAGE_MAP()
+};
+
+CAboutDlg::CAboutDlg() noexcept : CDialogEx(IDD_ABOUTBOX)
+{
+}
+
+void CAboutDlg::DoDataExchange(CDataExchange* pDX)
+{
+	CDialogEx::DoDataExchange(pDX);
+}
+
+BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
+END_MESSAGE_MAP()
+
+// 用于运行对话框的应用程序命令
+void CSATHelperApp::OnAppAbout()
+{
+	CAboutDlg aboutDlg;
+	aboutDlg.DoModal();
+}
+
+// CSATHelperApp 自定义加载/保存方法
+
+void CSATHelperApp::PreLoadState()
+{
+	BOOL bNameValid;
+	CString strName;
+	bNameValid = strName.LoadString(IDS_EDIT_MENU);
+	ASSERT(bNameValid);
+	GetContextMenuManager()->AddMenu(strName, IDR_POPUP_EDIT);
+	bNameValid = strName.LoadString(IDS_EXPLORER);
+	ASSERT(bNameValid);
+	GetContextMenuManager()->AddMenu(strName, IDR_POPUP_EXPLORER);
+}
+
+void CSATHelperApp::LoadCustomState()
+{
+}
+
+void CSATHelperApp::SaveCustomState()
+{
+}
+
+// CSATHelperApp 消息处理程序
+
+
+

+ 50 - 0
SATHelper/SATHelper/SATHelper.h

@@ -0,0 +1,50 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和
+// MFC C++ 库软件随附的相关电子文档。
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+// SATHelper.h: SATHelper 应用程序的主头文件
+//
+#pragma once
+
+#ifndef __AFXWIN_H__
+	#error "在包含此文件之前包含 'pch.h' 以生成 PCH"
+#endif
+
+#include "resource.h"       // 主符号
+
+
+// CSATHelperApp:
+// 有关此类的实现,请参阅 SATHelper.cpp
+//
+
+class CSATHelperApp : public CWinAppEx
+{
+public:
+	CSATHelperApp() noexcept;
+
+
+// 重写
+public:
+	virtual BOOL InitInstance();
+	virtual int ExitInstance();
+
+// 实现
+	UINT  m_nAppLook;
+	BOOL  m_bHiColorIcons;
+
+	virtual void PreLoadState();
+	virtual void LoadCustomState();
+	virtual void SaveCustomState();
+
+	afx_msg void OnAppAbout();
+	DECLARE_MESSAGE_MAP()
+};
+
+extern CSATHelperApp theApp;

+ 614 - 0
SATHelper/SATHelper/SATHelper.rc

@@ -0,0 +1,614 @@
+//Microsoft Visual C++ 生成的资源脚本。
+//
+#pragma code_page(65001)
+
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// 从 TEXTINCLUDE 2 资源生成。
+//
+#ifndef APSTUDIO_INVOKED
+#include "targetver.h"
+#endif
+#include "afxres.h"
+#include "verrsrc.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+#ifdef APSTUDIO_INVOKED
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+    "#ifndef APSTUDIO_INVOKED\r\n"
+    "#include ""targetver.h""\r\n"
+    "#endif\r\n"
+    "#include ""afxres.h""\r\n"
+    "#include ""verrsrc.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+    "#define _AFX_NO_OLE_RESOURCES\r\n"
+    "#define _AFX_NO_TRACKER_RESOURCES\r\n"
+    "#define _AFX_NO_PROPERTY_RESOURCES\r\n"
+    "\r\n"
+    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)\r\n"
+    "LANGUAGE 4, 2\r\n"
+    "#include ""res\\SATHelper.rc2""  // 非 Microsoft Visual C++ 编辑的资源\r\n"
+    "#include ""l.CHS\\afxres.rc""      // 标准组件\r\n"
+    "#include ""l.CHS\\afxprint.rc""    // 打印/打印预览资源\r\n"
+    "#if !defined(_AFXDLL)\r\n"
+    "#include ""l.CHS\\afxribbon.rc""        // MFC 功能区和控制条资源\r\n"
+    "#endif\r\n"
+    "#endif\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// 图标
+//
+
+// ID 值最低的图标放在最前面,以确保应用程序图标
+// 在所有系统中保持一致。
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
+LANGUAGE 4, 2
+IDR_MAINFRAME           ICON         "res\\SATHelper.ico"
+IDR_SATHelperTYPE         ICON         "res\\SATHelperDoc.ico"
+#endif
+IDI_FILE_VIEW           ICON         "res\\file_view.ico"
+IDI_FILE_VIEW_HC        ICON         "res\\file_view_hc.ico"
+IDI_CLASS_VIEW          ICON         "res\\class_view.ico"
+IDI_CLASS_VIEW_HC       ICON         "res\\class_view_hc.ico"
+IDI_OUTPUT_WND          ICON         "res\\output_wnd.ico"
+IDI_OUTPUT_WND_HC       ICON         "res\\output_wnd_hc.ico"
+IDI_PROPERTIES_WND      ICON         "res\\properties_wnd.ico"
+IDI_PROPERTIES_WND_HC   ICON         "res\\properties_wnd_hc.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// 位图
+//
+
+IDR_MAINFRAME           BITMAP                  "res\\Toolbar.bmp"
+IDR_MAINFRAME_256       BITMAP                  "res\\Toolbar256.bmp"
+IDB_MAIN                BITMAP                  "res\\main.bmp"
+IDB_FILELARGE           BITMAP                  "res\\filelarge.bmp"
+IDB_FILESMALL           BITMAP                  "res\\filesmall.bmp"
+IDB_WRITELARGE          BITMAP                  "res\\writelarge.bmp"
+IDB_WRITESMALL          BITMAP                  "res\\writesmall.bmp"
+IDB_BUTTONS             BITMAP                  "res\\buttons.bmp"
+IDR_SORT                BITMAP                  "res\\sort.bmp"
+IDB_SORT_24             BITMAP                  "res\\sort_hc.bmp"
+IDB_FILE_VIEW           BITMAP                  "res\\fileview.bmp"
+IDB_FILE_VIEW_24        BITMAP                  "res\\fileview_hc.bmp"
+IDB_CLASS_VIEW          BITMAP                  "res\\classview.bmp"
+IDB_CLASS_VIEW_24       BITMAP                  "res\\classview_hc.bmp"
+IDR_EXPLORER            BITMAP                  "res\\explorer.bmp"
+IDB_EXPLORER_24         BITMAP                  "res\\explorer_hc.bmp"
+IDR_MENU_IMAGES         BITMAP                  "res\\menuimages.bmp"
+IDB_MENU_IMAGES_24      BITMAP                  "res\\menuimages_hc.bmp"
+IDR_PROPERTIES          BITMAP                  "res\\properties.bmp"
+IDB_PROPERTIES_HC       BITMAP                  "res\\properties_hc.bmp"
+IDB_NAVIGATION_LARGE    BITMAP                  "res\\nav_large.bmp"
+IDB_NAVIGATION_LARGE_HC BITMAP                  "res\\nav_large_hc.bmp"
+IDB_PAGES               BITMAP                  "res\\pages.bmp"
+IDB_PAGES_HC            BITMAP                  "res\\pages_hc.bmp"
+IDB_PAGES_SMALL         BITMAP                  "res\\pages_small.bmp"
+IDB_PAGES_SMALL_HC      BITMAP                  "res\\pages_small_hc.bmp"
+IDB_INFO                BITMAP                  "res\\info.bmp"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// 工具栏
+//
+
+IDR_MAINFRAME TOOLBAR 16, 15
+BEGIN
+    BUTTON      ID_FILE_NEW
+    BUTTON      ID_FILE_OPEN
+    BUTTON      ID_FILE_SAVE
+    SEPARATOR
+    BUTTON      ID_EDIT_CUT
+    BUTTON      ID_EDIT_COPY
+    BUTTON      ID_EDIT_PASTE
+    SEPARATOR
+    BUTTON      ID_FILE_PRINT
+    BUTTON      ID_APP_ABOUT
+END
+
+IDR_MAINFRAME_256 TOOLBAR 16, 15
+BEGIN
+    BUTTON      ID_FILE_NEW
+    BUTTON      ID_FILE_OPEN
+    BUTTON      ID_FILE_SAVE
+    SEPARATOR
+    BUTTON      ID_EDIT_CUT
+    BUTTON      ID_EDIT_COPY
+    BUTTON      ID_EDIT_PASTE
+    SEPARATOR
+    BUTTON      ID_FILE_PRINT
+    BUTTON      ID_APP_ABOUT
+END
+
+
+IDR_SORT TOOLBAR 16, 15
+BEGIN
+    BUTTON      ID_SORT_MENU
+    BUTTON      ID_NEW_FOLDER
+END
+
+IDR_EXPLORER TOOLBAR 16, 15
+BEGIN
+    BUTTON      ID_PROPERTIES
+END
+
+IDR_MENU_IMAGES TOOLBAR 16, 15
+BEGIN
+    BUTTON      ID_WINDOW_MANAGER
+    SEPARATOR
+    BUTTON      ID_WINDOW_CASCADE
+    BUTTON      ID_WINDOW_TILE_HORZ
+    BUTTON      ID_TOOLS_MACRO
+    BUTTON      ID_SORTING_SORTALPHABETIC
+    BUTTON      ID_SORTING_SORTBYTYPE
+    BUTTON      ID_SORTING_SORTBYACCESS
+    BUTTON      ID_SORTING_GROUPBYTYPE
+END
+
+IDR_PROPERTIES TOOLBAR 16, 15
+BEGIN
+    BUTTON      ID_EXPAND_ALL
+    BUTTON      ID_SORTPROPERTIES
+    BUTTON      ID_PROPERTIES1
+    BUTTON      ID_PROPERTIES2
+END
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
+LANGUAGE 4, 2
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// 菜单
+//
+
+IDR_MAINFRAME MENU
+BEGIN
+    POPUP "文件(&F)"
+    BEGIN
+        MENUITEM "新建(&N)\tCtrl+N",                ID_FILE_NEW
+        MENUITEM "打开(&O)...\tCtrl+O",            ID_FILE_OPEN
+        MENUITEM "关闭(&C)",                      ID_FILE_CLOSE
+        MENUITEM SEPARATOR
+        MENUITEM "打印设置(&R)...",             ID_FILE_PRINT_SETUP
+        MENUITEM SEPARATOR
+        MENUITEM "最近的文件",                 ID_FILE_MRU_FILE1,GRAYED
+        MENUITEM SEPARATOR
+        MENUITEM "退出(&X)",                       ID_APP_EXIT
+    END
+    POPUP "视图(&V)"
+    BEGIN
+        MENUITEM "状态栏(&S)",                 ID_VIEW_STATUS_BAR
+        MENUITEM "标题栏(&C)",                ID_VIEW_CAPTION_BAR
+        POPUP "应用程序外观(&A)"
+        BEGIN
+            MENUITEM "Windows 2000(&2)",           ID_VIEW_APPLOOK_WIN_2000
+            MENUITEM "Office XP(&X)",              ID_VIEW_APPLOOK_OFF_XP
+            MENUITEM "Windows XP(&W)",             ID_VIEW_APPLOOK_WIN_XP
+            MENUITEM "Office 2003(&3)",            ID_VIEW_APPLOOK_OFF_2003
+            MENUITEM "Visual Studio 200&5",     ID_VIEW_APPLOOK_VS_2005
+            MENUITEM "Visual Studio 200&8",     ID_VIEW_APPLOOK_VS_2008
+            POPUP "Office 2007(&7)"
+            BEGIN
+                MENUITEM "蓝色样式(&B)",         ID_VIEW_APPLOOK_OFF_2007_BLUE
+                MENUITEM "黑色样式(&L)",        ID_VIEW_APPLOOK_OFF_2007_BLACK
+                MENUITEM "银色样式(&S)",       ID_VIEW_APPLOOK_OFF_2007_SILVER
+                MENUITEM "水绿色样式(&A)",         ID_VIEW_APPLOOK_OFF_2007_AQUA
+            END
+        END
+    END
+    POPUP "帮助(&H)"
+    BEGIN
+        MENUITEM "关于 SATHelper(&A)...",          ID_APP_ABOUT
+    END
+END
+
+IDR_SATHelperTYPE MENU
+BEGIN
+    POPUP "文件(&F)"
+    BEGIN
+        MENUITEM "新建(&N)\tCtrl+N",                ID_FILE_NEW
+        MENUITEM "打开(&O)...\tCtrl+O",            ID_FILE_OPEN
+        MENUITEM "关闭(&C)",                      ID_FILE_CLOSE
+        MENUITEM "保存(&S)\tCtrl+S",               ID_FILE_SAVE
+        MENUITEM "另存为(&A)...",                 ID_FILE_SAVE_AS
+        MENUITEM SEPARATOR
+        MENUITEM "打印(&P)...\tCtrl+P",           ID_FILE_PRINT
+        MENUITEM "打印预览(&V)",              ID_FILE_PRINT_PREVIEW
+        MENUITEM "打印设置(&R)...",             ID_FILE_PRINT_SETUP
+        MENUITEM SEPARATOR
+        MENUITEM "最近的文件",                 ID_FILE_MRU_FILE1,GRAYED
+        MENUITEM SEPARATOR
+        MENUITEM "退出(&X)",                       ID_APP_EXIT
+    END
+    POPUP "编辑(&E)"
+    BEGIN
+        MENUITEM "撤消(&U)\tCtrl+Z",               ID_EDIT_UNDO
+        MENUITEM SEPARATOR
+        MENUITEM "剪切(&T)\tCtrl+X",                ID_EDIT_CUT
+        MENUITEM "复制(&C)\tCtrl+C",               ID_EDIT_COPY
+        MENUITEM "粘贴(&P)\tCtrl+V",              ID_EDIT_PASTE
+    END
+    POPUP "视图(&V)"
+    BEGIN
+        MENUITEM "状态栏(&S)",                 ID_VIEW_STATUS_BAR
+        MENUITEM "标题栏(&C)",                ID_VIEW_CAPTION_BAR
+        POPUP "应用程序外观(&A)"
+        BEGIN
+            MENUITEM "Windows 2000(&2)",           ID_VIEW_APPLOOK_WIN_2000
+            MENUITEM "Office XP(&X)",              ID_VIEW_APPLOOK_OFF_XP
+            MENUITEM "Windows XP(&W)",             ID_VIEW_APPLOOK_WIN_XP
+            MENUITEM "Office 2003(&3)",            ID_VIEW_APPLOOK_OFF_2003
+            MENUITEM "Visual Studio 200&5",     ID_VIEW_APPLOOK_VS_2005
+            MENUITEM "Visual Studio 200&8",     ID_VIEW_APPLOOK_VS_2008
+            POPUP "Office 2007(&7)"
+            BEGIN
+                MENUITEM "蓝色样式(&B)",         ID_VIEW_APPLOOK_OFF_2007_BLUE
+                MENUITEM "黑色样式(&L)",        ID_VIEW_APPLOOK_OFF_2007_BLACK
+                MENUITEM "银色样式(&S)",       ID_VIEW_APPLOOK_OFF_2007_SILVER
+                MENUITEM "水绿色样式(&A)",         ID_VIEW_APPLOOK_OFF_2007_AQUA
+            END
+        END
+    END
+    POPUP "窗口(&W)"
+    BEGIN
+        MENUITEM "新建窗口(&N)",                 ID_WINDOW_NEW
+    END
+    POPUP "帮助(&H)"
+    BEGIN
+        MENUITEM "关于 SATHelper(&A)...",          ID_APP_ABOUT
+    END
+END
+
+
+
+
+IDR_POPUP_EDIT MENU
+BEGIN
+	POPUP "编辑"
+	BEGIN
+		MENUITEM "剪切(&T)\tCtrl+X",            ID_EDIT_CUT
+		MENUITEM "复制(&C)\tCtrl+C",           ID_EDIT_COPY
+		MENUITEM "粘贴(&P)\tCtrl+V",          ID_EDIT_PASTE
+    END
+END
+
+IDR_WINDOWS_MENU MENU
+BEGIN
+    MENUITEM "新建窗口(&N)",                 ID_WINDOW_NEW
+END
+
+IDR_POPUP_SORT MENU
+BEGIN
+    POPUP "排序"
+    BEGIN
+        MENUITEM "按字母顺序排序(&S)",         ID_SORTING_SORTALPHABETIC
+        MENUITEM "按类型排序(&T)",               ID_SORTING_SORTBYTYPE
+        MENUITEM "按访问排序(&E)",             ID_SORTING_SORTBYACCESS
+        MENUITEM "按类型分组(&Y)",              ID_SORTING_GROUPBYTYPE
+    END
+END
+
+IDR_POPUP_EXPLORER MENU
+BEGIN
+    POPUP "资源管理器"
+    BEGIN
+        MENUITEM "打开(&O)",                       ID_OPEN
+        MENUITEM "打开方式(&W)....",              ID_OPEN_WITH
+        MENUITEM SEPARATOR
+        MENUITEM "编译(&C)",                    ID_DUMMY_COMPILE
+        MENUITEM SEPARATOR
+        MENUITEM "剪切(&T)\tCtrl+X",                ID_EDIT_CUT
+        MENUITEM "复制(&C)\tCtrl+C",               ID_EDIT_COPY
+        MENUITEM "移除(&R)",                     ID_EDIT_CLEAR
+        MENUITEM SEPARATOR
+        MENUITEM "属性(&P)...",              ID_PROPERTIES
+    END
+END
+
+IDR_OUTPUT_POPUP MENU
+BEGIN
+    POPUP "弹出项"
+    BEGIN
+        MENUITEM "复制(&C)",                       ID_EDIT_COPY
+        MENUITEM "清除(&C)",                      ID_EDIT_CLEAR
+        MENUITEM SEPARATOR
+        MENUITEM "隐藏(&H)",                       ID_VIEW_OUTPUTWND
+    END
+END
+
+IDR_HELP_MENU MENU
+BEGIN
+    MENUITEM "关于 SATHelper(&A)...",          ID_APP_ABOUT
+END
+
+IDR_THEME_MENU MENU
+BEGIN
+    MENUITEM "Office 2007 (蓝色样式)(&B)",       ID_VIEW_APPLOOK_OFF_2007_BLUE
+    MENUITEM "Office 2007 (黑色样式)(&L)",      ID_VIEW_APPLOOK_OFF_2007_BLACK
+    MENUITEM "Office 2007 (银色样式)(&S)",     ID_VIEW_APPLOOK_OFF_2007_SILVER
+    MENUITEM "Office 2007 (水绿色样式)(&A)",       ID_VIEW_APPLOOK_OFF_2007_AQUA
+    MENUITEM "Windows 7(&D)",                      ID_VIEW_APPLOOK_WINDOWS_7
+END
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// 加速器
+//
+
+IDR_MAINFRAME ACCELERATORS
+BEGIN
+    "N",            ID_FILE_NEW,            VIRTKEY,CONTROL
+    "O",            ID_FILE_OPEN,           VIRTKEY,CONTROL
+    "S",            ID_FILE_SAVE,           VIRTKEY,CONTROL
+    "P",            ID_FILE_PRINT,          VIRTKEY,CONTROL
+	"Z",            ID_EDIT_UNDO,           VIRTKEY,CONTROL
+	"X",            ID_EDIT_CUT,            VIRTKEY,CONTROL
+	"C",            ID_EDIT_COPY,           VIRTKEY,CONTROL
+	"V",            ID_EDIT_PASTE,          VIRTKEY,CONTROL
+    VK_BACK,        ID_EDIT_UNDO,           VIRTKEY,ALT
+    VK_DELETE,      ID_EDIT_CUT,            VIRTKEY,SHIFT
+    VK_INSERT,      ID_EDIT_COPY,           VIRTKEY,CONTROL
+    VK_INSERT,      ID_EDIT_PASTE,          VIRTKEY,SHIFT
+    VK_F6,          ID_NEXT_PANE,           VIRTKEY
+    VK_F6,          ID_PREV_PANE,           VIRTKEY,SHIFT
+END
+
+
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// 对话框
+//
+
+IDD_ABOUTBOX DIALOGEX 0, 0, 170, 62
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "关于 SATHelper"
+FONT 9, "MS Shell Dlg"
+BEGIN
+    ICON            IDR_MAINFRAME,IDC_STATIC,14,14,21,20
+    LTEXT           "SATHelper,版本 1.0",IDC_STATIC,42,14,114,8,SS_NOPREFIX
+    LTEXT           "版权所有 (C) 2019",IDC_STATIC,42,26,114,8
+    DEFPUSHBUTTON   "确定",IDOK,113,41,50,14,WS_GROUP
+END
+
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// 版本
+//
+
+VS_VERSION_INFO     VERSIONINFO
+  FILEVERSION       1,0,0,1
+  PRODUCTVERSION    1,0,0,1
+ FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+#ifdef _DEBUG
+ FILEFLAGS VS_FF_DEBUG
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS VOS_NT_WINDOWS32
+ FILETYPE VFT_APP
+ FILESUBTYPE VFT2_UNKNOWN
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "080404B0"
+        BEGIN
+            VALUE "CompanyName", "TODO:  <公司名>"
+            VALUE "FileDescription", "SATHelper"
+            VALUE "FileVersion",     "1.0.0.1"
+            VALUE "InternalName",    "SATHelper.exe"
+            VALUE "LegalCopyright", "TODO:  (C) <公司名>。  保留所有权利。"
+            VALUE "OriginalFilename","SATHelper.exe"
+            VALUE "ProductName", "TODO:  <产品名>"
+            VALUE "ProductVersion",  "1.0.0.1"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x0804, 1200
+    END
+END
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+    IDD_ABOUTBOX, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 163
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 55
+    END
+END
+#endif    // APSTUDIO_INVOKED
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// 字符串表
+//
+
+STRINGTABLE
+BEGIN
+    IDP_OLE_INIT_FAILED       "OLE 初始化失败。  请确保 OLE 库是正确的版本。"
+END
+STRINGTABLE
+BEGIN
+// 非 Mac 应用程序将移除额外的两个子字符串
+    IDR_MAINFRAME           "SATHelper"
+    IDR_SATHelperTYPE         "\nSATHelper\nSATHelper\n\n\nSATHelper.Document\nSATHelper.Document"
+END
+STRINGTABLE
+BEGIN
+    AFX_IDS_APP_TITLE       "SATHelper"
+    AFX_IDS_IDLEMESSAGE     "就绪"
+END
+STRINGTABLE
+BEGIN
+    ID_INDICATOR_EXT        "EXT"
+    ID_INDICATOR_CAPS       "CAP"
+    ID_INDICATOR_NUM        "NUM"
+    ID_INDICATOR_SCRL       "SCRL"
+    ID_INDICATOR_OVR        "OVR"
+    ID_INDICATOR_REC        "REC"
+END
+STRINGTABLE
+BEGIN
+    ID_FILE_NEW             "创建新文档\n新建"
+    ID_FILE_OPEN            "打开现有文档\n打开"
+    ID_FILE_CLOSE           "关闭活动文档\n关闭"
+    ID_FILE_SAVE            "保存活动文档\n保存"
+    ID_FILE_SAVE_AS         "用新名称保存活动文档\n另存为"
+    ID_FILE_PAGE_SETUP      "更改打印选项\n页面设置"
+    ID_FILE_PRINT_SETUP     "更改打印机选项和打印选项\n打印设置"
+    ID_FILE_PRINT_DIRECT    "使用当前选项打印活动文档\n快速打印"
+    ID_FILE_PRINT           "打印活动文档\n打印"
+    ID_FILE_PRINT_PREVIEW   "显示整页\n打印预览"
+    ID_APP_ABOUT            "显示程序信息、版本号和版权信息\n关于"
+    ID_APP_EXIT             "退出应用程序;提示保存文档\n退出"
+    ID_FILE_MRU_FILE1       "打开此文档"
+    ID_FILE_MRU_FILE2       "打开此文档"
+    ID_FILE_MRU_FILE3       "打开此文档"
+    ID_FILE_MRU_FILE4       "打开此文档"
+    ID_FILE_MRU_FILE5       "打开此文档"
+    ID_FILE_MRU_FILE6       "打开此文档"
+    ID_FILE_MRU_FILE7       "打开此文档"
+    ID_FILE_MRU_FILE8       "打开此文档"
+    ID_FILE_MRU_FILE9       "打开此文档"
+    ID_FILE_MRU_FILE10      "打开此文档"
+    ID_FILE_MRU_FILE11      "打开此文档"
+    ID_FILE_MRU_FILE12      "打开此文档"
+    ID_FILE_MRU_FILE13      "打开此文档"
+    ID_FILE_MRU_FILE14      "打开此文档"
+    ID_FILE_MRU_FILE15      "打开此文档"
+    ID_FILE_MRU_FILE16      "打开此文档"
+    ID_NEXT_PANE            "切换到下一个窗格\n下一窗格"
+    ID_PREV_PANE            "切换回上一个窗格\n上一窗格"
+    ID_WINDOW_NEW           "为活动文档打开另一个窗口\n新建窗口"
+    ID_WINDOW_ARRANGE       "在窗口底部排列图标\n排列图标"
+    ID_WINDOW_CASCADE       "以重叠方式排列窗口\n层叠窗口"
+    ID_WINDOW_TILE_HORZ     "以不重叠的平铺方式排列窗口\n平铺窗口"
+    ID_WINDOW_TILE_VERT     "以不重叠的平铺方式排列窗口\n平铺窗口"
+    ID_WINDOW_SPLIT         "将活动窗口拆分为多个窗格\n拆分"
+    ID_EDIT_CLEAR           "清除所选内容\n清除"
+    ID_EDIT_CLEAR_ALL       "清除全部内容\n全部清除"
+    ID_EDIT_COPY            "复制所选内容,将其放入剪贴板\n复制"
+    ID_EDIT_CUT             "剪切所选内容,将其放入剪贴板\n剪切"
+    ID_EDIT_FIND            "查找指定的文本\n查找"
+    ID_EDIT_PASTE           "插入剪贴板内容\n粘贴"
+    ID_EDIT_REPEAT          "重复上一操作\n重复"
+    ID_EDIT_REPLACE         "用其他文本替换特定的文本\n替换"
+    ID_EDIT_SELECT_ALL      "选定整个文档\n全选"
+    ID_EDIT_UNDO            "撤消上一操作\n撤消"
+    ID_EDIT_REDO            "重做上次撤消的操作\n重做"
+    ID_VIEW_TOOLBAR         "显示或隐藏工具栏\n切换工具栏"
+    ID_VIEW_STATUS_BAR      "显示或隐藏状态栏\n切换状态栏"
+    ID_VIEW_CAPTION_BAR     "显示或隐藏标题栏\n切换标题栏"
+END
+
+STRINGTABLE
+BEGIN
+    AFX_IDS_SCSIZE          "更改窗口大小"
+    AFX_IDS_SCMOVE          "更改窗口位置"
+    AFX_IDS_SCMINIMIZE      "将窗口缩小成图标"
+    AFX_IDS_SCMAXIMIZE      "将窗口放大到最大尺寸"
+    AFX_IDS_SCNEXTWINDOW    "切换到下一个文档窗口"
+    AFX_IDS_SCPREVWINDOW    "切换到上一个文档窗口"
+    AFX_IDS_SCCLOSE         "关闭活动窗口并提示保存文档"
+    AFX_IDS_SCRESTORE       "将窗口恢复到正常大小"
+    AFX_IDS_SCTASKLIST      "激活任务列表"
+    AFX_IDS_MDICHILD        "激活此窗口"
+    AFX_IDS_PREVIEW_CLOSE   "关闭打印预览模式\n取消预览"
+END
+
+
+STRINGTABLE
+BEGIN
+    IDS_STATUS_PANE1        "窗格 1"
+    IDS_STATUS_PANE2        "窗格 2"
+    ID_WINDOW_MANAGER       "窗口(&W)..."
+    IDS_FILE_VIEW           "文件视图"
+    IDS_CLASS_VIEW          "类视图"
+    IDS_EXPLORER            "资源管理器"
+    IDS_OUTPUT_WND          "输出"
+    IDS_BUILD_TAB           "生成"
+    IDS_DEBUG_TAB           "调试"
+    IDS_FIND_TAB            "查找"
+    IDS_PROPERTIES_WND      "属性"
+    IDS_MYCALENDARS         "我的日历"
+    IDS_CALENDAR            "日历"
+    IDS_SHORTCUTS           "快捷方式"
+    IDS_FOLDERS             "文件夹"
+    IDS_OUTLOOKBAR          "Outlook 栏"
+    IDS_CAPTION_BUTTON      "选项..."
+    IDS_CAPTION_BUTTON_TIP  "单击此处查看其他选项"
+    IDS_CAPTION_TEXT        "这是标题栏,可在其中向用户显示消息。"
+    IDS_CAPTION_IMAGE_TIP   "重要事项"
+    IDS_CAPTION_IMAGE_TEXT  "这是向用户显示的信息性消息。"
+    IDS_EDIT_MENU           "编辑"
+END
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// 功能区
+//
+
+IDR_RIBBON             RT_RIBBON_XML           "res\\ribbon.mfcribbon-ms"
+
+#endif
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// 从 TEXTINCLUDE 3 资源生成。
+//
+
+#define _AFX_NO_OLE_RESOURCES
+#define _AFX_NO_TRACKER_RESOURCES
+#define _AFX_NO_PROPERTY_RESOURCES
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
+LANGUAGE 4, 2
+#include "res\\SATHelper.rc2"  // 非 Microsoft Visual C++ 编辑的资源
+#include "l.CHS\\afxres.rc"      // 标准组件
+#include "l.CHS\\afxprint.rc"  // 打印/打印预览资源
+#if !defined(_AFXDLL)
+#include "l.CHS\\afxribbon.rc"        // MFC 功能区和控件条资源
+#endif
+#endif
+#endif    // 不是 APSTUDIO_INVOKED

+ 278 - 0
SATHelper/SATHelper/SATHelper.vcxproj

@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <VCProjectVersion>16.0</VCProjectVersion>
+    <ProjectGuid>{B5557CC8-F26E-4162-8008-4BFACD2991FD}</ProjectGuid>
+    <Keyword>MFCProj</Keyword>
+    <RootNamespace>SATHelper</RootNamespace>
+    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v142</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+    <UseOfMfc>Dynamic</UseOfMfc>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v142</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+    <UseOfMfc>Dynamic</UseOfMfc>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v142</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+    <UseOfMfc>Dynamic</UseOfMfc>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v142</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+    <UseOfMfc>Dynamic</UseOfMfc>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="Shared">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+    <OutDir>..\..\..\..\bin\$(ProjectName)\</OutDir>
+    <IntDir>$(OutDir)$(Configuration)\</IntDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <LinkIncremental>true</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+    <OutDir>..\..\..\..\bin\$(ProjectName)\</OutDir>
+    <IntDir>$(OutDir)$(Configuration)\</IntDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+    </Link>
+    <Midl>
+      <MkTypLibCompatible>false</MkTypLibCompatible>
+      <ValidateAllParameters>true</ValidateAllParameters>
+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </Midl>
+    <ResourceCompile>
+      <Culture>0x0804</Culture>
+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ResourceCompile>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+    </Link>
+    <Midl>
+      <MkTypLibCompatible>false</MkTypLibCompatible>
+      <ValidateAllParameters>true</ValidateAllParameters>
+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </Midl>
+    <ResourceCompile>
+      <Culture>0x0804</Culture>
+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ResourceCompile>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+    <Midl>
+      <MkTypLibCompatible>false</MkTypLibCompatible>
+      <ValidateAllParameters>true</ValidateAllParameters>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </Midl>
+    <ResourceCompile>
+      <Culture>0x0804</Culture>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ResourceCompile>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+    <Midl>
+      <MkTypLibCompatible>false</MkTypLibCompatible>
+      <ValidateAllParameters>true</ValidateAllParameters>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </Midl>
+    <ResourceCompile>
+      <Culture>0x0804</Culture>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ResourceCompile>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClInclude Include="calendarbar.h" />
+    <ClInclude Include="ChildFrm.h" />
+    <ClInclude Include="ClassView.h" />
+    <ClInclude Include="FileView.h" />
+    <ClInclude Include="framework.h" />
+    <ClInclude Include="MainFrm.h" />
+    <ClInclude Include="OutputWnd.h" />
+    <ClInclude Include="stdafx.h" />
+    <ClInclude Include="PropertiesWnd.h" />
+    <ClInclude Include="Resource.h" />
+    <ClInclude Include="SATHelper.h" />
+    <ClInclude Include="SATHelperDoc.h" />
+    <ClInclude Include="SATHelperView.h" />
+    <ClInclude Include="targetver.h" />
+    <ClInclude Include="ViewTree.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="calendarbar.cpp" />
+    <ClCompile Include="ChildFrm.cpp" />
+    <ClCompile Include="ClassView.cpp" />
+    <ClCompile Include="FileView.cpp" />
+    <ClCompile Include="MainFrm.cpp" />
+    <ClCompile Include="OutputWnd.cpp" />
+    <ClCompile Include="stdafx.cpp">
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
+    </ClCompile>
+    <ClCompile Include="PropertiesWnd.cpp" />
+    <ClCompile Include="SATHelper.cpp" />
+    <ClCompile Include="SATHelperDoc.cpp" />
+    <ClCompile Include="SATHelperView.cpp" />
+    <ClCompile Include="ViewTree.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="SATHelper.rc" />
+  </ItemGroup>
+  <ItemGroup>
+    <Image Include="res\buttons.bmp" />
+    <Image Include="res\classview.bmp" />
+    <Image Include="res\classview_hc.bmp" />
+    <Image Include="res\class_view.ico" />
+    <Image Include="res\class_view_hc.ico" />
+    <Image Include="res\explorer.bmp" />
+    <Image Include="res\explorer_hc.bmp" />
+    <Image Include="res\filelarge.bmp" />
+    <Image Include="res\filesmall.bmp" />
+    <Image Include="res\fileview.bmp" />
+    <Image Include="res\fileview_hc.bmp" />
+    <Image Include="res\file_view.ico" />
+    <Image Include="res\file_view_hc.ico" />
+    <Image Include="res\info.bmp" />
+    <Image Include="res\main.bmp" />
+    <Image Include="res\menuimages.bmp" />
+    <Image Include="res\menuimages_hc.bmp" />
+    <Image Include="res\nav_large.bmp" />
+    <Image Include="res\nav_large_hc.bmp" />
+    <Image Include="res\output_wnd.ico" />
+    <Image Include="res\output_wnd_hc.ico" />
+    <Image Include="res\pages.bmp" />
+    <Image Include="res\pages_hc.bmp" />
+    <Image Include="res\pages_small.bmp" />
+    <Image Include="res\pages_small_hc.bmp" />
+    <Image Include="res\properties.bmp" />
+    <Image Include="res\properties_hc.bmp" />
+    <Image Include="res\properties_wnd.ico" />
+    <Image Include="res\properties_wnd_hc.ico" />
+    <Image Include="res\SATHelper.ico" />
+    <Image Include="res\SATHelperDoc.ico" />
+    <Image Include="res\sort.bmp" />
+    <Image Include="res\sort_hc.bmp" />
+    <Image Include="res\Toolbar.bmp" />
+    <Image Include="res\Toolbar256.bmp" />
+    <Image Include="res\writelarge.bmp" />
+    <Image Include="res\writesmall.bmp" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="res\ribbon.mfcribbon-ms" />
+    <None Include="res\SATHelper.rc2" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>

+ 228 - 0
SATHelper/SATHelper/SATHelper.vcxproj.filters

@@ -0,0 +1,228 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="源文件">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="头文件">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>
+    </Filter>
+    <Filter Include="资源文件">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="SATHelper.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="framework.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="targetver.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="MainFrm.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="ChildFrm.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="SATHelperDoc.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="SATHelperView.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="Resource.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="FileView.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="ClassView.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="ViewTree.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="OutputWnd.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="PropertiesWnd.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="calendarbar.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="stdafx.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="SATHelper.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="MainFrm.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="ChildFrm.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="SATHelperDoc.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="SATHelperView.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="FileView.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="ClassView.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="ViewTree.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="OutputWnd.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="PropertiesWnd.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="calendarbar.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="stdafx.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="SATHelper.rc">
+      <Filter>资源文件</Filter>
+    </ResourceCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <Image Include="res\file_view.ico">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\file_view_hc.ico">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\class_view.ico">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\class_view_hc.ico">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\fileview.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\fileview_hc.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\classview.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\classview_hc.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\explorer.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\explorer_hc.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\sort.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\sort_hc.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\menuimages.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\menuimages_hc.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\output_wnd.ico">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\output_wnd_hc.ico">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\properties_wnd.ico">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\properties_wnd_hc.ico">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\properties.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\properties_hc.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\nav_large.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\nav_large_hc.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\pages.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\pages_hc.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\pages_small.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\pages_small_hc.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\info.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\buttons.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\filelarge.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\filesmall.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\main.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\writelarge.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\writesmall.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\SATHelperDoc.ico">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\SATHelper.ico">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\Toolbar.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\Toolbar256.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="res\ribbon.mfcribbon-ms">
+      <Filter>资源文件</Filter>
+    </None>
+    <None Include="res\SATHelper.rc2">
+      <Filter>资源文件</Filter>
+    </None>
+  </ItemGroup>
+</Project>

+ 148 - 0
SATHelper/SATHelper/SATHelperDoc.cpp

@@ -0,0 +1,148 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和
+// MFC C++ 库软件随附的相关电子文档。
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+// SATHelperDoc.cpp: CSATHelperDoc 类的实现
+//
+
+#include "stdafx.h"
+#include "framework.h"
+// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
+// ATL 项目中进行定义,并允许与该项目共享文档代码。
+#ifndef SHARED_HANDLERS
+#include "SATHelper.h"
+#endif
+
+#include "SATHelperDoc.h"
+
+#include <propkey.h>
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#endif
+
+// CSATHelperDoc
+
+IMPLEMENT_DYNCREATE(CSATHelperDoc, CDocument)
+
+BEGIN_MESSAGE_MAP(CSATHelperDoc, CDocument)
+END_MESSAGE_MAP()
+
+
+// CSATHelperDoc 构造/析构
+
+CSATHelperDoc::CSATHelperDoc() noexcept
+{
+	// TODO: 在此添加一次性构造代码
+
+}
+
+CSATHelperDoc::~CSATHelperDoc()
+{
+}
+
+BOOL CSATHelperDoc::OnNewDocument()
+{
+	if (!CDocument::OnNewDocument())
+		return FALSE;
+
+	// TODO: 在此添加重新初始化代码
+	// (SDI 文档将重用该文档)
+
+	return TRUE;
+}
+
+
+
+
+// CSATHelperDoc 序列化
+
+void CSATHelperDoc::Serialize(CArchive& ar)
+{
+	if (ar.IsStoring())
+	{
+		// TODO:  在此添加存储代码
+	}
+	else
+	{
+		// TODO:  在此添加加载代码
+	}
+}
+
+#ifdef SHARED_HANDLERS
+
+// 缩略图的支持
+void CSATHelperDoc::OnDrawThumbnail(CDC& dc, LPRECT lprcBounds)
+{
+	// 修改此代码以绘制文档数据
+	dc.FillSolidRect(lprcBounds, RGB(255, 255, 255));
+
+	CString strText = _T("TODO: implement thumbnail drawing here");
+	LOGFONT lf;
+
+	CFont* pDefaultGUIFont = CFont::FromHandle((HFONT) GetStockObject(DEFAULT_GUI_FONT));
+	pDefaultGUIFont->GetLogFont(&lf);
+	lf.lfHeight = 36;
+
+	CFont fontDraw;
+	fontDraw.CreateFontIndirect(&lf);
+
+	CFont* pOldFont = dc.SelectObject(&fontDraw);
+	dc.DrawText(strText, lprcBounds, DT_CENTER | DT_WORDBREAK);
+	dc.SelectObject(pOldFont);
+}
+
+// 搜索处理程序的支持
+void CSATHelperDoc::InitializeSearchContent()
+{
+	CString strSearchContent;
+	// 从文档数据设置搜索内容。
+	// 内容部分应由“;”分隔
+
+	// 例如:     strSearchContent = _T("point;rectangle;circle;ole object;");
+	SetSearchContent(strSearchContent);
+}
+
+void CSATHelperDoc::SetSearchContent(const CString& value)
+{
+	if (value.IsEmpty())
+	{
+		RemoveChunk(PKEY_Search_Contents.fmtid, PKEY_Search_Contents.pid);
+	}
+	else
+	{
+		CMFCFilterChunkValueImpl *pChunk = nullptr;
+		ATLTRY(pChunk = new CMFCFilterChunkValueImpl);
+		if (pChunk != nullptr)
+		{
+			pChunk->SetTextValue(PKEY_Search_Contents, value, CHUNK_TEXT);
+			SetChunkValue(pChunk);
+		}
+	}
+}
+
+#endif // SHARED_HANDLERS
+
+// CSATHelperDoc 诊断
+
+#ifdef _DEBUG
+void CSATHelperDoc::AssertValid() const
+{
+	CDocument::AssertValid();
+}
+
+void CSATHelperDoc::Dump(CDumpContext& dc) const
+{
+	CDocument::Dump(dc);
+}
+#endif //_DEBUG
+
+
+// CSATHelperDoc 命令

+ 58 - 0
SATHelper/SATHelper/SATHelperDoc.h

@@ -0,0 +1,58 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和
+// MFC C++ 库软件随附的相关电子文档。
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+// SATHelperDoc.h: CSATHelperDoc 类的接口
+//
+
+
+#pragma once
+
+
+class CSATHelperDoc : public CDocument
+{
+protected: // 仅从序列化创建
+	CSATHelperDoc() noexcept;
+	DECLARE_DYNCREATE(CSATHelperDoc)
+
+// 特性
+public:
+
+// 操作
+public:
+
+// 重写
+public:
+	virtual BOOL OnNewDocument();
+	virtual void Serialize(CArchive& ar);
+#ifdef SHARED_HANDLERS
+	virtual void InitializeSearchContent();
+	virtual void OnDrawThumbnail(CDC& dc, LPRECT lprcBounds);
+#endif // SHARED_HANDLERS
+
+// 实现
+public:
+	virtual ~CSATHelperDoc();
+#ifdef _DEBUG
+	virtual void AssertValid() const;
+	virtual void Dump(CDumpContext& dc) const;
+#endif
+
+protected:
+
+// 生成的消息映射函数
+protected:
+	DECLARE_MESSAGE_MAP()
+
+#ifdef SHARED_HANDLERS
+	// 用于为搜索处理程序设置搜索内容的 Helper 函数
+	void SetSearchContent(const CString& value);
+#endif // SHARED_HANDLERS
+};

+ 138 - 0
SATHelper/SATHelper/SATHelperView.cpp

@@ -0,0 +1,138 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和
+// MFC C++ 库软件随附的相关电子文档。
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+// SATHelperView.cpp: CSATHelperView 类的实现
+//
+
+#include "stdafx.h"
+#include "framework.h"
+// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
+// ATL 项目中进行定义,并允许与该项目共享文档代码。
+#ifndef SHARED_HANDLERS
+#include "SATHelper.h"
+#endif
+
+#include "SATHelperDoc.h"
+#include "SATHelperView.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#endif
+
+
+// CSATHelperView
+
+IMPLEMENT_DYNCREATE(CSATHelperView, CView)
+
+BEGIN_MESSAGE_MAP(CSATHelperView, CView)
+	// 标准打印命令
+	ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
+	ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
+	ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CSATHelperView::OnFilePrintPreview)
+	ON_WM_CONTEXTMENU()
+	ON_WM_RBUTTONUP()
+END_MESSAGE_MAP()
+
+// CSATHelperView 构造/析构
+
+CSATHelperView::CSATHelperView() noexcept
+{
+	// TODO: 在此处添加构造代码
+
+}
+
+CSATHelperView::~CSATHelperView()
+{
+}
+
+BOOL CSATHelperView::PreCreateWindow(CREATESTRUCT& cs)
+{
+	// TODO: 在此处通过修改
+	//  CREATESTRUCT cs 来修改窗口类或样式
+
+	return CView::PreCreateWindow(cs);
+}
+
+// CSATHelperView 绘图
+
+void CSATHelperView::OnDraw(CDC* /*pDC*/)
+{
+	CSATHelperDoc* pDoc = GetDocument();
+	ASSERT_VALID(pDoc);
+	if (!pDoc)
+		return;
+
+	// TODO: 在此处为本机数据添加绘制代码
+}
+
+
+// CSATHelperView 打印
+
+
+void CSATHelperView::OnFilePrintPreview()
+{
+#ifndef SHARED_HANDLERS
+	AFXPrintPreview(this);
+#endif
+}
+
+BOOL CSATHelperView::OnPreparePrinting(CPrintInfo* pInfo)
+{
+	// 默认准备
+	return DoPreparePrinting(pInfo);
+}
+
+void CSATHelperView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
+{
+	// TODO: 添加额外的打印前进行的初始化过程
+}
+
+void CSATHelperView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
+{
+	// TODO: 添加打印后进行的清理过程
+}
+
+void CSATHelperView::OnRButtonUp(UINT /* nFlags */, CPoint point)
+{
+	ClientToScreen(&point);
+	OnContextMenu(this, point);
+}
+
+void CSATHelperView::OnContextMenu(CWnd* /* pWnd */, CPoint point)
+{
+#ifndef SHARED_HANDLERS
+	theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);
+#endif
+}
+
+
+// CSATHelperView 诊断
+
+#ifdef _DEBUG
+void CSATHelperView::AssertValid() const
+{
+	CView::AssertValid();
+}
+
+void CSATHelperView::Dump(CDumpContext& dc) const
+{
+	CView::Dump(dc);
+}
+
+CSATHelperDoc* CSATHelperView::GetDocument() const // 非调试版本是内联的
+{
+	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSATHelperDoc)));
+	return (CSATHelperDoc*)m_pDocument;
+}
+#endif //_DEBUG
+
+
+// CSATHelperView 消息处理程序

+ 62 - 0
SATHelper/SATHelper/SATHelperView.h

@@ -0,0 +1,62 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和
+// MFC C++ 库软件随附的相关电子文档。
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+// SATHelperView.h: CSATHelperView 类的接口
+//
+
+#pragma once
+
+
+class CSATHelperView : public CView
+{
+protected: // 仅从序列化创建
+	CSATHelperView() noexcept;
+	DECLARE_DYNCREATE(CSATHelperView)
+
+// 特性
+public:
+	CSATHelperDoc* GetDocument() const;
+
+// 操作
+public:
+
+// 重写
+public:
+	virtual void OnDraw(CDC* pDC);  // 重写以绘制该视图
+	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
+protected:
+	virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
+	virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
+	virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
+
+// 实现
+public:
+	virtual ~CSATHelperView();
+#ifdef _DEBUG
+	virtual void AssertValid() const;
+	virtual void Dump(CDumpContext& dc) const;
+#endif
+
+protected:
+
+// 生成的消息映射函数
+protected:
+	afx_msg void OnFilePrintPreview();
+	afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
+	afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
+	DECLARE_MESSAGE_MAP()
+};
+
+#ifndef _DEBUG  // SATHelperView.cpp 中的调试版本
+inline CSATHelperDoc* CSATHelperView::GetDocument() const
+   { return reinterpret_cast<CSATHelperDoc*>(m_pDocument); }
+#endif
+

+ 52 - 0
SATHelper/SATHelper/ViewTree.cpp

@@ -0,0 +1,52 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和
+// MFC C++ 库软件随附的相关电子文档。
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+#include "stdafx.h"
+#include "framework.h"
+#include "ViewTree.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+// CViewTree
+
+CViewTree::CViewTree() noexcept
+{
+}
+
+CViewTree::~CViewTree()
+{
+}
+
+BEGIN_MESSAGE_MAP(CViewTree, CTreeCtrl)
+END_MESSAGE_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// CViewTree 消息处理程序
+
+BOOL CViewTree::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
+{
+	BOOL bRes = CTreeCtrl::OnNotify(wParam, lParam, pResult);
+
+	NMHDR* pNMHDR = (NMHDR*)lParam;
+	ASSERT(pNMHDR != nullptr);
+
+	if (pNMHDR && pNMHDR->code == TTN_SHOW && GetToolTips() != nullptr)
+	{
+		GetToolTips()->SetWindowPos(&wndTop, -1, -1, -1, -1, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOSIZE);
+	}
+
+	return bRes;
+}

+ 33 - 0
SATHelper/SATHelper/ViewTree.h

@@ -0,0 +1,33 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和
+// MFC C++ 库软件随附的相关电子文档。
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+#pragma once
+
+/////////////////////////////////////////////////////////////////////////////
+// CViewTree 窗口
+
+class CViewTree : public CTreeCtrl
+{
+// 构造
+public:
+	CViewTree() noexcept;
+
+// 重写
+protected:
+	virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult);
+
+// 实现
+public:
+	virtual ~CViewTree();
+
+protected:
+	DECLARE_MESSAGE_MAP()
+};

+ 172 - 0
SATHelper/SATHelper/calendarbar.cpp

@@ -0,0 +1,172 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面 
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和 
+// MFC C++ 库软件随附的相关电子文档。  
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。  
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问 
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+#include "stdafx.h"
+#include "framework.h"
+#include "CalendarBar.h"
+#include "SATHelper.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+const int nBorderSize = 10;
+
+/////////////////////////////////////////////////////////////////////////////
+// CCalendarBar
+
+CCalendarBar::CCalendarBar()
+{
+	m_nMyCalendarsY = 0;
+}
+
+CCalendarBar::~CCalendarBar()
+{
+}
+
+BEGIN_MESSAGE_MAP(CCalendarBar, CWnd)
+	ON_WM_CREATE()
+	ON_WM_ERASEBKGND()
+	ON_WM_SIZE()
+	ON_WM_PAINT()
+	ON_WM_SETFOCUS()
+	ON_WM_SETTINGCHANGE()
+END_MESSAGE_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// CCalendarBar 消息处理程序
+
+int CCalendarBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
+{
+	if (CWnd::OnCreate(lpCreateStruct) == -1)
+		return -1;
+
+	CRect rectDummy(0, 0, 0, 0);
+	m_wndCalendar.Create(WS_CHILD | WS_VISIBLE, rectDummy, this, 1);
+
+	CBitmap bmp;
+	bmp.LoadBitmap(IDB_PAGES_SMALL_HC);
+
+	m_Images.Create(16, 16, ILC_COLOR24 | ILC_MASK, 0, 0);
+	m_Images.Add(&bmp, RGB(255, 0, 255));
+
+	return 0;
+}
+
+BOOL CCalendarBar::PreTranslateMessage(MSG *pMsg)
+{
+	if (pMsg->message == WM_LBUTTONDOWN)
+	{
+		// 确保将键盘焦点设置到日历上
+		m_wndCalendar.SetFocus();
+	}
+
+	return CWnd::PreTranslateMessage(pMsg);
+}
+
+BOOL CCalendarBar::OnEraseBkgnd(CDC* /*pDC*/)
+{
+	return TRUE;
+}
+
+void CCalendarBar::OnSetFocus(CWnd *pOldWnd)
+{
+	CWnd::OnSetFocus(pOldWnd);
+	m_wndCalendar.SetFocus();
+}
+
+void CCalendarBar::OnSize(UINT nType, int cx, int cy)
+{
+	CWnd::OnSize(nType, cx, cy);
+
+	int nMyCalendarsHeight = 70;
+
+	if (m_wndCalendar.GetSafeHwnd() != nullptr)
+	{
+		m_wndCalendar.SetWindowPos(nullptr, nBorderSize, nBorderSize, cx - 2 * nBorderSize, cy - 2 * nBorderSize - nMyCalendarsHeight - 10, SWP_NOZORDER | SWP_NOACTIVATE);
+	}
+
+	m_nMyCalendarsY = cy - nMyCalendarsHeight;
+}
+
+BOOL CCalendarBar::Create(const RECT& rect, CWnd* pParentWnd, UINT nID)
+{
+	return CWnd::Create(nullptr, _T(""), WS_CHILD | WS_VISIBLE, rect, pParentWnd, nID);
+}
+
+void CCalendarBar::OnPaint()
+{
+	CPaintDC dc(this); // 用于绘制的设备上下文
+
+	CRect rectClient;
+	GetClientRect(rectClient);
+
+	dc.FillRect(rectClient, &afxGlobalData.brWindow);
+
+	if (rectClient.bottom - m_nMyCalendarsY > 0)
+	{
+		CRect rectMyCalendarsCaption = rectClient;
+		rectMyCalendarsCaption.top = m_nMyCalendarsY;
+		rectMyCalendarsCaption.bottom = rectMyCalendarsCaption.top + afxGlobalData.GetTextHeight(TRUE) * 3 / 2;
+
+		COLORREF clrText = CMFCVisualManager::GetInstance()->OnDrawPaneCaption(&dc, nullptr, FALSE, rectMyCalendarsCaption, CRect(0, 0, 0, 0));
+
+		CPen* pOldPen = dc.SelectObject(&afxGlobalData.penBarShadow);
+
+		dc.MoveTo(rectMyCalendarsCaption.left - 1, rectMyCalendarsCaption.top);
+		dc.LineTo(rectMyCalendarsCaption.right, rectMyCalendarsCaption.top);
+
+		dc.SelectStockObject(BLACK_PEN);
+
+		dc.MoveTo(rectMyCalendarsCaption.left - 1, rectMyCalendarsCaption.bottom);
+		dc.LineTo(rectMyCalendarsCaption.right, rectMyCalendarsCaption.bottom);
+
+		dc.SelectObject(pOldPen);
+
+		CRect rectText = rectMyCalendarsCaption;
+		rectText.DeflateRect(10, 0);
+
+		dc.SetBkMode(TRANSPARENT);
+		dc.SetTextColor(clrText);
+
+		CFont* pOldFont = dc.SelectObject(&afxGlobalData.fontRegular);
+
+		BOOL bNameValid;
+		CString str;
+
+		bNameValid = str.LoadString(IDS_MYCALENDARS);
+		ASSERT(bNameValid);
+		dc.DrawText(str, rectText, DT_VCENTER | DT_LEFT | DT_SINGLELINE);
+
+		CRect rectCalendar = rectClient;
+		rectCalendar.top = rectMyCalendarsCaption.bottom + 5;
+		rectCalendar.bottom = rectCalendar.top + afxGlobalData.GetTextHeight(TRUE) * 3 / 2 - 5;
+
+		dc.FillSolidRect(rectCalendar, RGB(255, 255, 213));
+
+		rectCalendar.DeflateRect(20, 0);
+		m_Images.Draw(&dc, 3, rectCalendar.TopLeft(), 0);
+
+		rectCalendar.left += 20;
+
+		bNameValid = str.LoadString(IDS_CALENDAR);
+		ASSERT(bNameValid);
+
+		dc.SetTextColor(afxGlobalData.clrHotLinkNormalText);
+		dc.DrawText(str, rectCalendar, DT_VCENTER | DT_LEFT | DT_SINGLELINE);
+
+		dc.SelectObject(pOldFont);
+	}
+}
+
+

+ 46 - 0
SATHelper/SATHelper/calendarbar.h

@@ -0,0 +1,46 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面 
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和 
+// MFC C++ 库软件随附的相关电子文档。  
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。  
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问 
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+#pragma once
+
+/////////////////////////////////////////////////////////////////////////////
+// CCalendarBar 窗口
+
+class CCalendarBar : public CWnd
+{
+// 构造
+public:
+	CCalendarBar();
+
+// 特性
+protected:
+	CMonthCalCtrl m_wndCalendar;
+	int m_nMyCalendarsY;
+	CImageList m_Images;
+
+// 重写
+public:
+	virtual BOOL Create(const RECT& rect, CWnd* pParentWnd, UINT nID = (UINT)-1);
+	virtual BOOL PreTranslateMessage(MSG *pMsg);
+
+// 实现
+public:
+	virtual ~CCalendarBar();
+
+protected:
+	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
+	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
+	afx_msg void OnSize(UINT nType, int cx, int cy);
+	afx_msg void OnPaint();
+	afx_msg void OnSetFocus(CWnd *pOldWnd);
+
+	DECLARE_MESSAGE_MAP()
+};

+ 60 - 0
SATHelper/SATHelper/framework.h

@@ -0,0 +1,60 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和
+// MFC C++ 库软件随附的相关电子文档。
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+#pragma once
+
+#ifndef VC_EXTRALEAN
+#define VC_EXTRALEAN            // 从 Windows 头中排除极少使用的资料
+#endif
+
+#include "targetver.h"
+
+#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // 某些 CString 构造函数将是显式的
+
+// 关闭 MFC 的一些常见且经常可放心忽略的隐藏警告消息
+#define _AFX_ALL_WARNINGS
+
+#include <afxwin.h>         // MFC 核心组件和标准组件
+#include <afxext.h>         // MFC 扩展
+
+
+#include <afxdisp.h>        // MFC 自动化类
+
+
+
+#ifndef _AFX_NO_OLE_SUPPORT
+#include <afxdtctl.h>           // MFC 对 Internet Explorer 4 公共控件的支持
+#endif
+#ifndef _AFX_NO_AFXCMN_SUPPORT
+#include <afxcmn.h>             // MFC 对 Windows 公共控件的支持
+#endif // _AFX_NO_AFXCMN_SUPPORT
+
+#include <afxcontrolbars.h>     // MFC 支持功能区和控制条
+
+
+
+
+
+
+
+
+
+#ifdef _UNICODE
+#if defined _M_IX86
+#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
+#elif defined _M_X64
+#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
+#else
+#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
+#endif
+#endif
+
+

BIN
SATHelper/SATHelper/res/SATHelper.ico


+ 13 - 0
SATHelper/SATHelper/res/SATHelper.rc2

@@ -0,0 +1,13 @@
+//
+// SATHelper.rc2 - Microsoft Visual C++ 不会直接编辑的资源
+//
+
+#ifdef APSTUDIO_INVOKED
+#error 此文件不能用 Microsoft Visual C++ 编辑
+#endif //APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+// 在此处添加手动编辑的资源...
+
+/////////////////////////////////////////////////////////////////////////////

BIN
SATHelper/SATHelper/res/SATHelperDoc.ico


BIN
SATHelper/SATHelper/res/Toolbar.bmp


BIN
SATHelper/SATHelper/res/Toolbar256.bmp


BIN
SATHelper/SATHelper/res/buttons.bmp


BIN
SATHelper/SATHelper/res/class_view.ico


BIN
SATHelper/SATHelper/res/class_view_hc.ico


BIN
SATHelper/SATHelper/res/classview.bmp


BIN
SATHelper/SATHelper/res/classview_hc.bmp


BIN
SATHelper/SATHelper/res/explorer.bmp


BIN
SATHelper/SATHelper/res/explorer_hc.bmp


BIN
SATHelper/SATHelper/res/file_view.ico


BIN
SATHelper/SATHelper/res/file_view_hc.ico


BIN
SATHelper/SATHelper/res/filelarge.bmp


BIN
SATHelper/SATHelper/res/filesmall.bmp


BIN
SATHelper/SATHelper/res/fileview.bmp


BIN
SATHelper/SATHelper/res/fileview_hc.bmp


BIN
SATHelper/SATHelper/res/info.bmp


BIN
SATHelper/SATHelper/res/main.bmp


BIN
SATHelper/SATHelper/res/menuimages.bmp


BIN
SATHelper/SATHelper/res/menuimages_hc.bmp


BIN
SATHelper/SATHelper/res/nav_large.bmp


BIN
SATHelper/SATHelper/res/nav_large_hc.bmp


BIN
SATHelper/SATHelper/res/output_wnd.ico


BIN
SATHelper/SATHelper/res/output_wnd_hc.ico


BIN
SATHelper/SATHelper/res/pages.bmp


BIN
SATHelper/SATHelper/res/pages_hc.bmp


BIN
SATHelper/SATHelper/res/pages_small.bmp


BIN
SATHelper/SATHelper/res/pages_small_hc.bmp


BIN
SATHelper/SATHelper/res/properties.bmp


BIN
SATHelper/SATHelper/res/properties_hc.bmp


BIN
SATHelper/SATHelper/res/properties_wnd.ico


BIN
SATHelper/SATHelper/res/properties_wnd_hc.ico


+ 462 - 0
SATHelper/SATHelper/res/ribbon.mfcribbon-ms

@@ -0,0 +1,462 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<AFX_RIBBON>
+  <HEADER>
+    <VERSION>1</VERSION>
+  </HEADER>
+  <RIBBON_BAR>
+    <ELEMENT_NAME>RibbonBar</ELEMENT_NAME>
+    <IMAGE>
+      <ID>
+        <NAME>IDB_BUTTONS</NAME>
+        <VALUE>113</VALUE>
+      </ID>
+    </IMAGE>
+    <BUTTON_MAIN>
+      <ELEMENT_NAME>Button_Main</ELEMENT_NAME>
+      <KEYS>F</KEYS>
+      <IMAGE>
+        <ID>
+          <NAME>IDB_MAIN</NAME>
+          <VALUE>112</VALUE>
+        </ID>
+      </IMAGE>
+    </BUTTON_MAIN>
+    <CATEGORY_MAIN>
+      <ELEMENT_NAME>Category_Main</ELEMENT_NAME>
+      <NAME>文件</NAME>
+      <IMAGE_SMALL>
+        <ID>
+          <NAME>IDB_FILESMALL</NAME>
+          <VALUE>115</VALUE>
+        </ID>
+      </IMAGE_SMALL>
+      <IMAGE_LARGE>
+        <ID>
+          <NAME>IDB_FILELARGE</NAME>
+          <VALUE>114</VALUE>
+        </ID>
+      </IMAGE_LARGE>
+      <ELEMENTS>
+[!if APP_TYPE_MTLD]
+        <ELEMENT>
+          <ELEMENT_NAME>Button</ELEMENT_NAME>
+          <ID>
+            <NAME>ID_FILE_NEW_FRAME</NAME>
+            <VALUE>57613</VALUE>
+          </ID>
+          <TEXT>新建框架(&amp;N)</TEXT>
+          <INDEX_SMALL>0</INDEX_SMALL>
+          <INDEX_LARGE>0</INDEX_LARGE>
+        </ELEMENT>
+[!endif]
+        <ELEMENT>
+          <ELEMENT_NAME>Button</ELEMENT_NAME>
+          <ID>
+            <NAME>ID_FILE_NEW</NAME>
+            <VALUE>57600</VALUE>
+          </ID>
+          <TEXT>新建(&amp;N)</TEXT>
+          <INDEX_SMALL>0</INDEX_SMALL>
+          <INDEX_LARGE>0</INDEX_LARGE>
+        </ELEMENT>
+        <ELEMENT>
+          <ELEMENT_NAME>Button</ELEMENT_NAME>
+          <ID>
+            <NAME>ID_FILE_OPEN</NAME>
+            <VALUE>57601</VALUE>
+          </ID>
+          <TEXT>打开(&amp;O)...</TEXT>
+          <INDEX_SMALL>1</INDEX_SMALL>
+          <INDEX_LARGE>1</INDEX_LARGE>
+        </ELEMENT>
+        <ELEMENT>
+          <ELEMENT_NAME>Button</ELEMENT_NAME>
+          <ID>
+            <NAME>ID_FILE_SAVE</NAME>
+            <VALUE>57603</VALUE>
+          </ID>
+          <TEXT>保存(&amp;S)</TEXT>
+          <INDEX_SMALL>2</INDEX_SMALL>
+          <INDEX_LARGE>2</INDEX_LARGE>
+        </ELEMENT>
+        <ELEMENT>
+          <ELEMENT_NAME>Button</ELEMENT_NAME>
+          <ID>
+            <NAME>ID_FILE_SAVE_AS</NAME>
+            <VALUE>57604</VALUE>
+          </ID>
+          <TEXT>另存为(&amp;A)...</TEXT>
+          <INDEX_SMALL>3</INDEX_SMALL>
+          <INDEX_LARGE>3</INDEX_LARGE>
+        </ELEMENT>
+[!if PRINTING]
+        <ELEMENT>
+          <ELEMENT_NAME>Button</ELEMENT_NAME>
+          <ID>
+            <NAME>ID_FILE_PRINT</NAME>
+            <VALUE>57607</VALUE>
+          </ID>
+          <TEXT>打印</TEXT>
+          <KEYS>P</KEYS>
+          <KEYS_MENU>W</KEYS_MENU>
+          <INDEX_SMALL>4</INDEX_SMALL>
+          <INDEX_LARGE>4</INDEX_LARGE>
+          <ELEMENTS>
+            <ELEMENT>
+              <ELEMENT_NAME>Label</ELEMENT_NAME>
+              <TEXT>预览并打印文档</TEXT>
+            </ELEMENT>
+            <ELEMENT>
+              <ELEMENT_NAME>Button</ELEMENT_NAME>
+              <ID>
+                <NAME>ID_FILE_PRINT_DIRECT</NAME>
+                <VALUE>57608</VALUE>
+              </ID>
+              <TEXT>快速打印(&amp;Q)</TEXT>
+              <INDEX_SMALL>5</INDEX_SMALL>
+              <INDEX_LARGE>5</INDEX_LARGE>
+              <ALWAYS_DESCRIPTION>TRUE</ALWAYS_DESCRIPTION>
+            </ELEMENT>
+            <ELEMENT>
+              <ELEMENT_NAME>Button</ELEMENT_NAME>
+              <ID>
+                <NAME>ID_FILE_PRINT_PREVIEW</NAME>
+                <VALUE>57609</VALUE>
+              </ID>
+              <TEXT>打印预览(&amp;V)</TEXT>
+              <INDEX_SMALL>6</INDEX_SMALL>
+              <INDEX_LARGE>6</INDEX_LARGE>
+              <ALWAYS_DESCRIPTION>TRUE</ALWAYS_DESCRIPTION>
+            </ELEMENT>
+            <ELEMENT>
+              <ELEMENT_NAME>Button</ELEMENT_NAME>
+              <ID>
+                <NAME>ID_FILE_PRINT_SETUP</NAME>
+                <VALUE>57606</VALUE>
+              </ID>
+              <TEXT>打印设置(&amp;U)</TEXT>
+              <INDEX_SMALL>7</INDEX_SMALL>
+              <INDEX_LARGE>7</INDEX_LARGE>
+              <ALWAYS_DESCRIPTION>TRUE</ALWAYS_DESCRIPTION>
+            </ELEMENT>
+          </ELEMENTS>
+        </ELEMENT>
+[!endif]
+[!if APP_TYPE_MDI]
+        <ELEMENT>
+          <ELEMENT_NAME>Separator</ELEMENT_NAME>
+          <HORIZ>TRUE</HORIZ>
+        </ELEMENT>
+        <ELEMENT>
+          <ELEMENT_NAME>Button</ELEMENT_NAME>
+          <ID>
+            <NAME>ID_FILE_CLOSE</NAME>
+            <VALUE>57602</VALUE>
+          </ID>
+          <TEXT>关闭(&amp;C)</TEXT>
+          <INDEX_SMALL>8</INDEX_SMALL>
+          <INDEX_LARGE>8</INDEX_LARGE>
+        </ELEMENT>
+[!endif]
+        <ELEMENT>
+          <ELEMENT_NAME>Button_Main_Panel</ELEMENT_NAME>
+          <ID>
+            <NAME>ID_APP_EXIT</NAME>
+            <VALUE>57665</VALUE>
+          </ID>
+          <TEXT>退出(&amp;X)</TEXT>
+          <INDEX_SMALL>10</INDEX_SMALL>
+        </ELEMENT>
+      </ELEMENTS>
+      <RECENT_FILE_LIST>
+        <ENABLE>TRUE</ENABLE>
+        <LABEL>最近使用的文档</LABEL>
+      </RECENT_FILE_LIST>
+    </CATEGORY_MAIN>
+    <QAT_ELEMENTS>
+      <ELEMENT_NAME>QAT</ELEMENT_NAME>
+      <ITEMS>
+        <ITEM>
+          <ID>
+            <NAME>ID_FILE_NEW</NAME>
+            <VALUE>57600</VALUE>
+          </ID>
+        </ITEM>
+        <ITEM>
+          <ID>
+            <NAME>ID_FILE_OPEN</NAME>
+            <VALUE>57601</VALUE>
+          </ID>
+        </ITEM>
+        <ITEM>
+          <ID>
+            <NAME>ID_FILE_SAVE</NAME>
+            <VALUE>57603</VALUE>
+          </ID>
+        </ITEM>
+        <ITEM>
+          <ID>
+            <NAME>ID_FILE_PRINT_DIRECT</NAME>
+            <VALUE>57608</VALUE>
+          </ID>
+        </ITEM>
+      </ITEMS>
+    </QAT_ELEMENTS>
+    <TAB_ELEMENTS>
+      <ELEMENT_NAME>Group</ELEMENT_NAME>
+      <ELEMENTS>
+[!if ENABLE_VISUAL_STYLE_SWITCHING]
+        <ELEMENT>
+          <ELEMENT_NAME>Button</ELEMENT_NAME>
+          <TEXT>样式</TEXT>
+          <DEFAULT_COMMAND>FALSE</DEFAULT_COMMAND>
+          <KEYS>S</KEYS>
+          <ELEMENTS>
+            <ELEMENT>
+              <ELEMENT_NAME>Button</ELEMENT_NAME>
+              <ID>
+                <NAME>ID_VIEW_APPLOOK_OFF_2007_BLUE</NAME>
+                <VALUE>215</VALUE>
+              </ID>
+              <TEXT>Office 2007 (蓝色样式)(&amp;B)</TEXT>
+            </ELEMENT>
+            <ELEMENT>
+              <ELEMENT_NAME>Button</ELEMENT_NAME>
+              <ID>
+                <NAME>ID_VIEW_APPLOOK_OFF_2007_BLACK</NAME>
+                <VALUE>216</VALUE>
+              </ID>
+              <TEXT>Office 2007 (黑色样式)(&amp;L)</TEXT>
+            </ELEMENT>
+            <ELEMENT>
+              <ELEMENT_NAME>Button</ELEMENT_NAME>
+              <ID>
+                <NAME>ID_VIEW_APPLOOK_OFF_2007_SILVER</NAME>
+                <VALUE>217</VALUE>
+              </ID>
+              <TEXT>Office 2007 (银色样式)(&amp;S)</TEXT>
+            </ELEMENT>
+            <ELEMENT>
+              <ELEMENT_NAME>Button</ELEMENT_NAME>
+              <ID>
+                <NAME>ID_VIEW_APPLOOK_OFF_2007_AQUA</NAME>
+                <VALUE>218</VALUE>
+              </ID>
+              <TEXT>Office 2007 (水绿色样式)(&amp;A)</TEXT>
+            </ELEMENT>
+            <ELEMENT>
+              <ELEMENT_NAME>Button</ELEMENT_NAME>
+              <ID>
+                <NAME>ID_VIEW_APPLOOK_WINDOWS_7</NAME>
+                <VALUE>219</VALUE>
+              </ID>
+              <TEXT>Windows 7(&amp;D)</TEXT>
+            </ELEMENT>
+          </ELEMENTS>
+        </ELEMENT>
+[!endif]
+        <ELEMENT>
+          <ELEMENT_NAME>Button</ELEMENT_NAME>
+          <ID>
+            <NAME>ID_APP_ABOUT</NAME>
+            <VALUE>57664</VALUE>
+          </ID>
+          <KEYS>A</KEYS>
+          <INDEX_SMALL>0</INDEX_SMALL>
+          <INDEX_LARGE>-1</INDEX_LARGE>
+        </ELEMENT>
+      </ELEMENTS>
+    </TAB_ELEMENTS>
+    <CATEGORIES>
+      <CATEGORY>
+        <ELEMENT_NAME>Category</ELEMENT_NAME>
+        <NAME>主页</NAME>
+        <KEYS>H</KEYS>
+        <IMAGE_SMALL>
+          <ID>
+            <NAME>IDB_WRITESMALL</NAME>
+            <VALUE>110</VALUE>
+          </ID>
+        </IMAGE_SMALL>
+        <IMAGE_LARGE>
+          <ID>
+            <NAME>IDB_WRITELARGE</NAME>
+            <VALUE>111</VALUE>
+          </ID>
+        </IMAGE_LARGE>
+        <PANELS>
+          <PANEL>
+            <ELEMENT_NAME>Panel</ELEMENT_NAME>
+            <NAME>剪贴板</NAME>
+            <KEYS>D</KEYS>
+            <INDEX>1</INDEX>
+            <ELEMENTS>
+              <ELEMENT>
+                <ELEMENT_NAME>Button</ELEMENT_NAME>
+                <ID>
+                  <NAME>ID_EDIT_PASTE</NAME>
+                  <VALUE>57637</VALUE>
+                </ID>
+                <TEXT>粘贴</TEXT>
+                <KEYS>V</KEYS>
+                <INDEX_SMALL>0</INDEX_SMALL>
+                <INDEX_LARGE>0</INDEX_LARGE>
+              </ELEMENT>
+              <ELEMENT>
+                <ELEMENT_NAME>Button</ELEMENT_NAME>
+                <ID>
+                  <NAME>ID_EDIT_CUT</NAME>
+                  <VALUE>57635</VALUE>
+                </ID>
+                <TEXT>剪切</TEXT>
+                <KEYS>X</KEYS>
+                <INDEX_SMALL>1</INDEX_SMALL>
+              </ELEMENT>
+              <ELEMENT>
+                <ELEMENT_NAME>Button</ELEMENT_NAME>
+                <ID>
+                  <NAME>ID_EDIT_COPY</NAME>
+                  <VALUE>57634</VALUE>
+                </ID>
+                <TEXT>复制</TEXT>
+                <KEYS>C</KEYS>
+                <INDEX_SMALL>2</INDEX_SMALL>
+              </ELEMENT>
+              <ELEMENT>
+                <ELEMENT_NAME>Button</ELEMENT_NAME>
+                <ID>
+                  <NAME>ID_EDIT_SELECT_ALL</NAME>
+                  <VALUE>57642</VALUE>
+                </ID>
+                <TEXT>全选</TEXT>
+                <KEYS>A</KEYS>
+                <INDEX_SMALL>3</INDEX_SMALL>
+              </ELEMENT>
+            </ELEMENTS>
+          </PANEL>
+[!if CONTAINER || CONTAINER_SERVER]
+          <PANEL>
+            <ELEMENT_NAME>Panel</ELEMENT_NAME>
+            <NAME>插入</NAME>
+            <KEYS>I</KEYS>
+            <INDEX>-1</INDEX>
+            <ELEMENTS>
+              <ELEMENT>
+                <ELEMENT_NAME>Button</ELEMENT_NAME>
+                <ID>
+                  <NAME>ID_OLE_INSERT_NEW</NAME>
+                  <VALUE>57856</VALUE>
+                </ID>
+                <TEXT>插入对象...</TEXT>
+                <KEYS>I</KEYS>
+                <INDEX_SMALL>4</INDEX_SMALL>
+                <INDEX_LARGE>1</INDEX_LARGE>
+              </ELEMENT>
+            </ELEMENTS>
+          </PANEL>
+[!endif]
+          <PANEL>
+            <ELEMENT_NAME>Panel</ELEMENT_NAME>
+            <NAME>视图</NAME>
+            <INDEX>2</INDEX>
+            <ELEMENTS>
+              <ELEMENT>
+                <ELEMENT_NAME>Button_Check</ELEMENT_NAME>
+                <ID>
+                  <NAME>ID_VIEW_STATUS_BAR</NAME>
+                  <VALUE>59393</VALUE>
+                </ID>
+                <TEXT>状态栏</TEXT>
+              <KEYS>S</KEYS>
+              </ELEMENT>
+[!if ADV_DOCKING_CAPTION]
+              <ELEMENT>
+                <ELEMENT_NAME>Button_Check</ELEMENT_NAME>
+                <ID>
+                  <NAME>ID_VIEW_CAPTION_BAR</NAME>
+                  <VALUE>221</VALUE>
+                </ID>
+                <TEXT>标题栏</TEXT>
+              <KEYS>P</KEYS>
+              </ELEMENT>
+[!endif]
+            </ELEMENTS>
+          </PANEL>
+[!if RICH_EDIT_VIEW]
+          <PANEL>
+            <ELEMENT_NAME>Panel</ELEMENT_NAME>
+            <NAME>查找/替换</NAME>
+            <KEYS>f</KEYS>
+            <INDEX>3</INDEX>
+            <ELEMENTS>
+              <ELEMENT>
+                <ELEMENT_NAME>Button</ELEMENT_NAME>
+                <ID>
+                  <NAME>ID_EDIT_FIND</NAME>
+                  <VALUE>57636</VALUE>
+                </ID>
+                <TEXT>查找...</TEXT>
+                <KEYS>f</KEYS>
+                <INDEX_SMALL>5</INDEX_SMALL>
+                <INDEX_LARGE>2</INDEX_LARGE>
+              </ELEMENT>
+              <ELEMENT>
+                <ELEMENT_NAME>Button</ELEMENT_NAME>
+                <ID>
+                  <NAME>ID_EDIT_REPEAT</NAME>
+                  <VALUE>57640</VALUE>
+                </ID>
+                <TEXT>查找下一个</TEXT>
+                <KEYS>n</KEYS>
+                <INDEX_SMALL>6</INDEX_SMALL>
+              </ELEMENT>
+              <ELEMENT>
+                <ELEMENT_NAME>Button</ELEMENT_NAME>
+                <ID>
+                  <NAME>ID_EDIT_REPLACE</NAME>
+                  <VALUE>57641</VALUE>
+                </ID>
+                <TEXT>替换</TEXT>
+                <KEYS>r</KEYS>
+                <INDEX_SMALL>7</INDEX_SMALL>
+              </ELEMENT>
+            </ELEMENTS>
+          </PANEL>
+[!endif]
+[!if APP_TYPE_MDI]
+          <PANEL>
+            <ELEMENT_NAME>Panel</ELEMENT_NAME>
+            <NAME>窗口</NAME>
+            <KEYS>W</KEYS>
+            <INDEX>4</INDEX>
+            <ELEMENTS>
+              <ELEMENT>
+                <ELEMENT_NAME>Button</ELEMENT_NAME>
+                <ID>
+                  <NAME>ID_WINDOW_MANAGER</NAME>
+                  <VALUE>131</VALUE>
+                </ID>
+                <TEXT>窗口</TEXT>
+                <KEYS>W</KEYS>
+                <ALWAYS_LARGE>TRUE</ALWAYS_LARGE>
+                <INDEX_SMALL>8</INDEX_SMALL>
+                <INDEX_LARGE>3</INDEX_LARGE>
+                <ELEMENTS>
+                  <ELEMENT>
+                    <ELEMENT_NAME>Button</ELEMENT_NAME>
+                    <ID>
+                      <NAME>ID_WINDOW_NEW</NAME>
+                      <VALUE>57648</VALUE>
+                    </ID>
+                    <TEXT>新建窗口(&amp;N)</TEXT>
+                  </ELEMENT>
+                </ELEMENTS>
+              </ELEMENT>
+            </ELEMENTS>
+          </PANEL>
+[!endif]
+        </PANELS>
+      </CATEGORY>
+    </CATEGORIES>
+  </RIBBON_BAR>
+</AFX_RIBBON>

BIN
SATHelper/SATHelper/res/sort.bmp


BIN
SATHelper/SATHelper/res/sort_hc.bmp


BIN
SATHelper/SATHelper/res/writelarge.bmp


BIN
SATHelper/SATHelper/res/writesmall.bmp


+ 5 - 0
SATHelper/SATHelper/stdafx.cpp

@@ -0,0 +1,5 @@
+// pch.cpp: 与预编译标头对应的源文件
+
+#include "stdafx.h"
+
+// 当使用预编译的头时,需要使用此源文件,编译才能成功。

+ 30 - 0
SATHelper/SATHelper/stdafx.h

@@ -0,0 +1,30 @@
+// pch.h: 这是预编译标头文件。
+// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
+// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
+// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
+// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。
+
+#ifndef PCH_H
+#define PCH_H
+
+// 添加要在此处预编译的标头
+#include "framework.h"
+
+// 启停停靠窗口;
+#define __DOCKINGBAR__ 1
+// 启停导航栏;
+#define __OUTLOOKBAR__ 0
+// 启停标题栏;
+#define __CAPTIONBAR__ 0
+// 快速访问工具栏
+#define __QUICKACCESS_COMMAND__ 0
+// 输出窗口;
+#define __OUT_PUT_WIN__ 0
+// 文件、类窗口
+#define __FC_WIN__ 0
+// Pane使用对话框;
+#define __PANE_DLG__ 0
+// 禁用选项卡标题;
+#define __TAB_BAR__ 0
+
+#endif //PCH_H

+ 19 - 0
SATHelper/SATHelper/targetver.h

@@ -0,0 +1,19 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和
+// MFC C++ 库软件随附的相关电子文档。
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+#pragma once
+
+// 包括 SDKDDKVer.h 将定义可用的最高版本的 Windows 平台。
+
+// 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h,并将
+// 将 _WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。
+
+#include <SDKDDKVer.h>