From 35c8e63f00698fe05038f8d352e355566c4a3596 Mon Sep 17 00:00:00 2001 From: FPCLinkYZT114 Date: Sun, 1 Jun 2025 17:46:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A1=B9=E7=9B=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ChildFrm.cpp | 57 ++++++ ChildFrm.h | 35 ++++ ClassView.cpp | 323 ++++++++++++++++++++++++++++++ ClassView.h | 54 +++++ FileView.cpp | 257 ++++++++++++++++++++++++ FileView.h | 55 ++++++ MainFrm.cpp | 348 +++++++++++++++++++++++++++++++++ MainFrm.h | 59 ++++++ OutputWnd.cpp | 200 +++++++++++++++++++ OutputWnd.h | 59 ++++++ ProcessManager.cpp | 227 +++++++++++++++++++++ ProcessManager.h | 39 ++++ ProcessManager.rc | Bin 0 -> 32560 bytes ProcessManager.sln | 31 +++ ProcessManager.vcxproj | 255 ++++++++++++++++++++++++ ProcessManager.vcxproj.filters | 183 +++++++++++++++++ ProcessManagerDoc.cpp | 138 +++++++++++++ ProcessManagerDoc.h | 48 +++++ ProcessManagerView.cpp | 128 ++++++++++++ ProcessManagerView.h | 52 +++++ PropertiesWnd.cpp | 273 ++++++++++++++++++++++++++ PropertiesWnd.h | 62 ++++++ Resource.h | 84 ++++++++ ViewTree.cpp | 43 ++++ ViewTree.h | 23 +++ framework.h | 49 +++++ pch.cpp | 5 + pch.h | 13 ++ res/ProcessManager.ico | Bin 0 -> 67777 bytes res/ProcessManager.rc2 | Bin 0 -> 684 bytes res/ProcessManagerDoc.ico | Bin 0 -> 4710 bytes res/Toolbar.bmp | Bin 0 -> 1078 bytes res/Toolbar256.bmp | Bin 0 -> 5816 bytes res/class_view.ico | Bin 0 -> 1078 bytes res/class_view_hc.ico | Bin 0 -> 2478 bytes res/classview.bmp | Bin 0 -> 958 bytes res/classview_hc.bmp | Bin 0 -> 5096 bytes res/explorer.bmp | Bin 0 -> 238 bytes res/explorer_hc.bmp | Bin 0 -> 776 bytes res/file_view.ico | Bin 0 -> 1078 bytes res/file_view_hc.ico | Bin 0 -> 2166 bytes res/fileview.bmp | Bin 0 -> 478 bytes res/fileview_hc.bmp | Bin 0 -> 2216 bytes res/menuimages.bmp | Bin 0 -> 1078 bytes res/menuimages_hc.bmp | Bin 0 -> 5816 bytes res/output_wnd.ico | Bin 0 -> 1078 bytes res/output_wnd_hc.ico | Bin 0 -> 2166 bytes res/properties.bmp | Bin 0 -> 598 bytes res/properties_hc.bmp | Bin 0 -> 2936 bytes res/properties_wnd.ico | Bin 0 -> 1078 bytes res/properties_wnd_hc.ico | Bin 0 -> 2166 bytes res/sort.bmp | Bin 0 -> 358 bytes res/sort_hc.bmp | Bin 0 -> 1496 bytes res/userimages.bmp | Bin 0 -> 7976 bytes targetver.h | 8 + 55 files changed, 3108 insertions(+) create mode 100644 ChildFrm.cpp create mode 100644 ChildFrm.h create mode 100644 ClassView.cpp create mode 100644 ClassView.h create mode 100644 FileView.cpp create mode 100644 FileView.h create mode 100644 MainFrm.cpp create mode 100644 MainFrm.h create mode 100644 OutputWnd.cpp create mode 100644 OutputWnd.h create mode 100644 ProcessManager.cpp create mode 100644 ProcessManager.h create mode 100644 ProcessManager.rc create mode 100644 ProcessManager.sln create mode 100644 ProcessManager.vcxproj create mode 100644 ProcessManager.vcxproj.filters create mode 100644 ProcessManagerDoc.cpp create mode 100644 ProcessManagerDoc.h create mode 100644 ProcessManagerView.cpp create mode 100644 ProcessManagerView.h create mode 100644 PropertiesWnd.cpp create mode 100644 PropertiesWnd.h create mode 100644 Resource.h create mode 100644 ViewTree.cpp create mode 100644 ViewTree.h create mode 100644 framework.h create mode 100644 pch.cpp create mode 100644 pch.h create mode 100644 res/ProcessManager.ico create mode 100644 res/ProcessManager.rc2 create mode 100644 res/ProcessManagerDoc.ico create mode 100644 res/Toolbar.bmp create mode 100644 res/Toolbar256.bmp create mode 100644 res/class_view.ico create mode 100644 res/class_view_hc.ico create mode 100644 res/classview.bmp create mode 100644 res/classview_hc.bmp create mode 100644 res/explorer.bmp create mode 100644 res/explorer_hc.bmp create mode 100644 res/file_view.ico create mode 100644 res/file_view_hc.ico create mode 100644 res/fileview.bmp create mode 100644 res/fileview_hc.bmp create mode 100644 res/menuimages.bmp create mode 100644 res/menuimages_hc.bmp create mode 100644 res/output_wnd.ico create mode 100644 res/output_wnd_hc.ico create mode 100644 res/properties.bmp create mode 100644 res/properties_hc.bmp create mode 100644 res/properties_wnd.ico create mode 100644 res/properties_wnd_hc.ico create mode 100644 res/sort.bmp create mode 100644 res/sort_hc.bmp create mode 100644 res/userimages.bmp create mode 100644 targetver.h diff --git a/ChildFrm.cpp b/ChildFrm.cpp new file mode 100644 index 0000000..42b18c0 --- /dev/null +++ b/ChildFrm.cpp @@ -0,0 +1,57 @@ + +// ChildFrm.cpp: CChildFrame 类的实现 +// + +#include "pch.h" +#include "framework.h" +#include "ProcessManager.h" + +#include "ChildFrm.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + +// CChildFrame + +IMPLEMENT_DYNCREATE(CChildFrame, CMDIChildWndEx) + +BEGIN_MESSAGE_MAP(CChildFrame, CMDIChildWndEx) +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 消息处理程序 diff --git a/ChildFrm.h b/ChildFrm.h new file mode 100644 index 0000000..e043804 --- /dev/null +++ b/ChildFrm.h @@ -0,0 +1,35 @@ + +// 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: + DECLARE_MESSAGE_MAP() +}; diff --git a/ClassView.cpp b/ClassView.cpp new file mode 100644 index 0000000..f94efaa --- /dev/null +++ b/ClassView.cpp @@ -0,0 +1,323 @@ + +#include "pch.h" +#include "framework.h" +#include "MainFrm.h" +#include "ClassView.h" +#include "Resource.h" +#include "ProcessManager.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 /* 锁定*/); +} diff --git a/ClassView.h b/ClassView.h new file mode 100644 index 0000000..786c278 --- /dev/null +++ b/ClassView.h @@ -0,0 +1,54 @@ + +#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() +}; + diff --git a/FileView.cpp b/FileView.cpp new file mode 100644 index 0000000..753529a --- /dev/null +++ b/FileView.cpp @@ -0,0 +1,257 @@ + +#include "pch.h" +#include "framework.h" +#include "mainfrm.h" +#include "FileView.h" +#include "Resource.h" +#include "ProcessManager.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); +} + + diff --git a/FileView.h b/FileView.h new file mode 100644 index 0000000..e39a7c9 --- /dev/null +++ b/FileView.h @@ -0,0 +1,55 @@ + +#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() +}; + diff --git a/MainFrm.cpp b/MainFrm.cpp new file mode 100644 index 0000000..5990d6e --- /dev/null +++ b/MainFrm.cpp @@ -0,0 +1,348 @@ + +// MainFrm.cpp: CMainFrame 类的实现 +// + +#include "pch.h" +#include "framework.h" +#include "ProcessManager.h" + +#include "MainFrm.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + +// CMainFrame + +IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWndEx) + +const int iMaxUserToolbars = 10; +const UINT uiFirstUserToolBarId = AFX_IDW_CONTROLBAR_FIRST + 40; +const UINT uiLastUserToolBarId = uiFirstUserToolBarId + iMaxUserToolbars - 1; + +BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx) + ON_WM_CREATE() + ON_COMMAND(ID_WINDOW_MANAGER, &CMainFrame::OnWindowManager) + ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize) + ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::OnToolbarCreateNew) + ON_WM_SETTINGCHANGE() +END_MESSAGE_MAP() + +static UINT indicators[] = +{ + ID_SEPARATOR, // 状态行指示器 + ID_INDICATOR_CAPS, + ID_INDICATOR_NUM, + ID_INDICATOR_SCRL, +}; + +// CMainFrame 构造/析构 + +CMainFrame::CMainFrame() noexcept +{ + // TODO: 在此添加成员初始化代码 +} + +CMainFrame::~CMainFrame() +{ +} + +int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) +{ + if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1) + return -1; + + BOOL bNameValid; + + 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); + + if (!m_wndMenuBar.Create(this)) + { + TRACE0("未能创建菜单栏\n"); + return -1; // 未能创建 + } + + m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY); + + // 防止菜单栏在激活时获得焦点 + CMFCPopupMenu::SetForceMenuFocus(FALSE); + + if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || + !m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME)) + { + TRACE0("未能创建工具栏\n"); + return -1; // 未能创建 + } + + CString strToolBarName; + bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_STANDARD); + ASSERT(bNameValid); + m_wndToolBar.SetWindowText(strToolBarName); + + CString strCustomize; + bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE); + ASSERT(bNameValid); + m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); + + // 允许用户定义的工具栏操作: + InitUserToolbars(nullptr, uiFirstUserToolBarId, uiLastUserToolBarId); + + if (!m_wndStatusBar.Create(this)) + { + TRACE0("未能创建状态栏\n"); + return -1; // 未能创建 + } + m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)); + + // TODO: 如果您不希望工具栏和菜单栏可停靠,请删除这五行 + m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY); + m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); + EnableDocking(CBRS_ALIGN_ANY); + DockPane(&m_wndMenuBar); + DockPane(&m_wndToolBar); + + + // 启用 Visual Studio 2005 样式停靠窗口行为 + CDockingManager::SetDockingMode(DT_SMART); + // 启用 Visual Studio 2005 样式停靠窗口自动隐藏行为 + EnableAutoHidePanes(CBRS_ALIGN_ANY); + + // 加载菜单项图像(不在任何标准工具栏上): + 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); + + + // 设置用于绘制所有用户界面元素的视觉管理器 + CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); + + // 启用增强的窗口管理对话框 + EnableWindowsDialog(ID_WINDOW_MANAGER, ID_WINDOW_MANAGER, TRUE); + + // 启用工具栏和停靠窗口菜单替换 + EnablePaneMenu(TRUE, ID_VIEW_CUSTOMIZE, strCustomize, ID_VIEW_TOOLBAR); + + // 启用快速(按住 Alt 拖动)工具栏自定义 + CMFCToolBar::EnableQuickCustomization(); + + if (CMFCToolBar::GetUserImages() == nullptr) + { + // 加载用户定义的工具栏图像 + if (m_UserImages.Load(_T(".\\UserImages.bmp"))) + { + CMFCToolBar::SetUserImages(&m_UserImages); + } + } + + // 启用菜单个性化(最近使用的命令) + // TODO: 定义您自己的基本命令,确保每个下拉菜单至少有一个基本命令。 + CList lstBasicCommands; + + lstBasicCommands.AddTail(ID_FILE_NEW); + lstBasicCommands.AddTail(ID_FILE_OPEN); + lstBasicCommands.AddTail(ID_FILE_SAVE); + lstBasicCommands.AddTail(ID_FILE_PRINT); + lstBasicCommands.AddTail(ID_APP_EXIT); + lstBasicCommands.AddTail(ID_EDIT_CUT); + lstBasicCommands.AddTail(ID_EDIT_PASTE); + lstBasicCommands.AddTail(ID_EDIT_UNDO); + lstBasicCommands.AddTail(ID_APP_ABOUT); + lstBasicCommands.AddTail(ID_VIEW_STATUS_BAR); + lstBasicCommands.AddTail(ID_VIEW_TOOLBAR); + lstBasicCommands.AddTail(ID_SORTING_SORTALPHABETIC); + lstBasicCommands.AddTail(ID_SORTING_SORTBYTYPE); + lstBasicCommands.AddTail(ID_SORTING_SORTBYACCESS); + lstBasicCommands.AddTail(ID_SORTING_GROUPBYTYPE); + + CMFCToolBar::SetBasicCommands(lstBasicCommands); + + // 将文档名和应用程序名称在窗口标题栏上的顺序进行交换。这 + // 将改进任务栏的可用性,因为显示的文档名带有缩略图。 + ModifyStyle(0, FWS_PREFIXTITLE); + + return 0; +} + +BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) +{ + if( !CMDIFrameWndEx::PreCreateWindow(cs) ) + return FALSE; + // TODO: 在此处通过修改 + // CREATESTRUCT cs 来修改窗口类或样式 + + cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE + | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_MAXIMIZE | WS_SYSMENU; + + 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); + + UpdateMDITabbedBarsIcons(); +} + +// 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::OnViewCustomize() +{ + CMFCToolBarsCustomizeDialog* pDlgCust = new CMFCToolBarsCustomizeDialog(this, TRUE /* 扫描菜单*/); + pDlgCust->EnableUserDefinedToolbars(); + pDlgCust->Create(); +} + +LRESULT CMainFrame::OnToolbarCreateNew(WPARAM wp,LPARAM lp) +{ + LRESULT lres = CMDIFrameWndEx::OnToolbarCreateNew(wp,lp); + if (lres == 0) + { + return 0; + } + + CMFCToolBar* pUserToolbar = (CMFCToolBar*)lres; + ASSERT_VALID(pUserToolbar); + + BOOL bNameValid; + CString strCustomize; + bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE); + ASSERT(bNameValid); + + pUserToolbar->EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); + return lres; +} + + +BOOL CMainFrame::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle, CWnd* pParentWnd, CCreateContext* pContext) +{ + // 基类将执行真正的工作 + + if (!CMDIFrameWndEx::LoadFrame(nIDResource, dwDefaultStyle, pParentWnd, pContext)) + { + return FALSE; + } + + + // 为所有用户工具栏启用自定义按钮 + BOOL bNameValid; + CString strCustomize; + bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE); + ASSERT(bNameValid); + + for (int i = 0; i < iMaxUserToolbars; i ++) + { + CMFCToolBar* pUserToolbar = GetUserToolBarByIndex(i); + if (pUserToolbar != nullptr) + { + pUserToolbar->EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); + } + } + + return TRUE; +} + + +void CMainFrame::OnSettingChange(UINT uFlags, LPCTSTR lpszSection) +{ + CMDIFrameWndEx::OnSettingChange(uFlags, lpszSection); + m_wndOutput.UpdateFonts(); +} diff --git a/MainFrm.h b/MainFrm.h new file mode 100644 index 0000000..8f3cdf0 --- /dev/null +++ b/MainFrm.h @@ -0,0 +1,59 @@ + +// MainFrm.h: CMainFrame 类的接口 +// + +#pragma once +#include "FileView.h" +#include "ClassView.h" +#include "OutputWnd.h" +#include "PropertiesWnd.h" + +class CMainFrame : public CMDIFrameWndEx +{ + DECLARE_DYNAMIC(CMainFrame) +public: + CMainFrame() noexcept; + +// 特性 +public: + +// 操作 +public: + +// 重写 +public: + virtual BOOL PreCreateWindow(CREATESTRUCT& cs); + virtual BOOL LoadFrame(UINT nIDResource, DWORD dwDefaultStyle = WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, CWnd* pParentWnd = nullptr, CCreateContext* pContext = nullptr); + +// 实现 +public: + virtual ~CMainFrame(); +#ifdef _DEBUG + virtual void AssertValid() const; + virtual void Dump(CDumpContext& dc) const; +#endif + +protected: // 控件条嵌入成员 + CMFCMenuBar m_wndMenuBar; + CMFCToolBar m_wndToolBar; + CMFCStatusBar m_wndStatusBar; + CMFCToolBarImages m_UserImages; + CFileView m_wndFileView; + CClassView m_wndClassView; + COutputWnd m_wndOutput; + CPropertiesWnd m_wndProperties; + +// 生成的消息映射函数 +protected: + afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); + afx_msg void OnWindowManager(); + afx_msg void OnViewCustomize(); + afx_msg LRESULT OnToolbarCreateNew(WPARAM wp, LPARAM lp); + afx_msg void OnSettingChange(UINT uFlags, LPCTSTR lpszSection); + DECLARE_MESSAGE_MAP() + + BOOL CreateDockingWindows(); + void SetDockingWindowIcons(BOOL bHiColorIcons); +}; + + diff --git a/OutputWnd.cpp b/OutputWnd.cpp new file mode 100644 index 0000000..e3f4901 --- /dev/null +++ b/OutputWnd.cpp @@ -0,0 +1,200 @@ + +#include "pch.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(); + + } +} diff --git a/OutputWnd.h b/OutputWnd.h new file mode 100644 index 0000000..4d773c3 --- /dev/null +++ b/OutputWnd.h @@ -0,0 +1,59 @@ + +#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() +}; + diff --git a/ProcessManager.cpp b/ProcessManager.cpp new file mode 100644 index 0000000..807304c --- /dev/null +++ b/ProcessManager.cpp @@ -0,0 +1,227 @@ + +// ProcessManager.cpp: 定义应用程序的类行为。 +// + +#include "pch.h" +#include "framework.h" +#include "afxwinappex.h" +#include "afxdialogex.h" +#include "ProcessManager.h" +#include "MainFrm.h" + +#include "ChildFrm.h" +#include "ProcessManagerDoc.h" +#include "ProcessManagerView.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + + +// CProcessManagerApp + +BEGIN_MESSAGE_MAP(CProcessManagerApp, CWinAppEx) + ON_COMMAND(ID_APP_ABOUT, &CProcessManagerApp::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() + + +// CProcessManagerApp 构造 + +CProcessManagerApp::CProcessManagerApp() 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("ProcessManager.AppID.NoVersion")); + + // TODO: 在此处添加构造代码, + // 将所有重要的初始化放置在 InitInstance 中 +} + +// 唯一的 CProcessManagerApp 对象 + +CProcessManagerApp theApp; + + +// CProcessManagerApp 初始化 + +BOOL CProcessManagerApp::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(); + + EnableTaskbarInteraction(); + + // 使用 RichEdit 控件需要 AfxInitRichEdit2() + // AfxInitRichEdit2(); + + // 标准初始化 + // 如果未使用这些功能并希望减小 + // 最终可执行文件的大小,则应移除下列 + // 不需要的特定初始化例程 + // 更改用于存储设置的注册表项 + // TODO: 应适当修改该字符串, + // 例如修改为公司或组织名 + SetRegistryKey(_T("应用程序向导生成的本地应用程序")); + LoadStdProfileSettings(4); // 加载标准 INI 文件选项(包括 MRU) + + + InitContextMenuManager(); + + 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_ProcessManagerTYPE, + RUNTIME_CLASS(CProcessManagerDoc), + RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架 + RUNTIME_CLASS(CProcessManagerView)); + 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(SW_SHOWMAXIMIZED); + pMainFrame->UpdateWindow(); + + return TRUE; +} + +int CProcessManagerApp::ExitInstance() +{ + //TODO: 处理可能已添加的附加资源 + AfxOleTerm(FALSE); + + return CWinAppEx::ExitInstance(); +} + +// CProcessManagerApp 消息处理程序 + + +// 用于应用程序“关于”菜单项的 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 CProcessManagerApp::OnAppAbout() +{ + CAboutDlg aboutDlg; + aboutDlg.DoModal(); +} + +// CProcessManagerApp 自定义加载/保存方法 + +void CProcessManagerApp::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 CProcessManagerApp::LoadCustomState() +{ +} + +void CProcessManagerApp::SaveCustomState() +{ +} + +// CProcessManagerApp 消息处理程序 + + + diff --git a/ProcessManager.h b/ProcessManager.h new file mode 100644 index 0000000..ad4a326 --- /dev/null +++ b/ProcessManager.h @@ -0,0 +1,39 @@ + +// ProcessManager.h: ProcessManager 应用程序的主头文件 +// +#pragma once + +#ifndef __AFXWIN_H__ + #error "在包含此文件之前包含 'pch.h' 以生成 PCH" +#endif + +#include "resource.h" // 主符号 + + +// CProcessManagerApp: +// 有关此类的实现,请参阅 ProcessManager.cpp +// + +class CProcessManagerApp : public CWinAppEx +{ +public: + CProcessManagerApp() noexcept; + + +// 重写 +public: + virtual BOOL InitInstance(); + virtual int ExitInstance(); + +// 实现 + BOOL m_bHiColorIcons; + + virtual void PreLoadState(); + virtual void LoadCustomState(); + virtual void SaveCustomState(); + + afx_msg void OnAppAbout(); + DECLARE_MESSAGE_MAP() +}; + +extern CProcessManagerApp theApp; diff --git a/ProcessManager.rc b/ProcessManager.rc new file mode 100644 index 0000000000000000000000000000000000000000..0d400472a31a695011672ba1e10c90563e054010 GIT binary patch literal 32560 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 a8_M|Xxv6oRV_pk + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + {8ECA8E4B-DC1F-4D90-8B1F-20A7AE37E549} + MFCProj + ProcessManager + 10.0 + + + + Application + true + v143 + Unicode + Dynamic + + + Application + false + v143 + true + Unicode + Dynamic + + + Application + true + v143 + Unicode + Dynamic + + + Application + false + v143 + true + Unicode + Dynamic + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + Use + Level3 + true + _WINDOWS;_DEBUG;%(PreprocessorDefinitions) + pch.h + + + Windows + + + false + true + _DEBUG;%(PreprocessorDefinitions) + + + 0x0804 + _DEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + + + Use + Level3 + true + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + pch.h + + + Windows + + + false + true + _DEBUG;%(PreprocessorDefinitions) + + + 0x0804 + _DEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + + + Use + Level3 + true + true + true + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + pch.h + + + Windows + true + true + + + false + true + NDEBUG;%(PreprocessorDefinitions) + + + 0x0804 + NDEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + + + Use + Level3 + true + true + true + _WINDOWS;NDEBUG;%(PreprocessorDefinitions) + pch.h + + + Windows + true + true + + + false + true + NDEBUG;%(PreprocessorDefinitions) + + + 0x0804 + NDEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ProcessManager.vcxproj.filters b/ProcessManager.vcxproj.filters new file mode 100644 index 0000000..b36c312 --- /dev/null +++ b/ProcessManager.vcxproj.filters @@ -0,0 +1,183 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + + + 资源文件 + + + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + + + 资源文件 + + + \ No newline at end of file diff --git a/ProcessManagerDoc.cpp b/ProcessManagerDoc.cpp new file mode 100644 index 0000000..8d4c22b --- /dev/null +++ b/ProcessManagerDoc.cpp @@ -0,0 +1,138 @@ + +// ProcessManagerDoc.cpp: CProcessManagerDoc 类的实现 +// + +#include "pch.h" +#include "framework.h" +// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的 +// ATL 项目中进行定义,并允许与该项目共享文档代码。 +#ifndef SHARED_HANDLERS +#include "ProcessManager.h" +#endif + +#include "ProcessManagerDoc.h" + +#include + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + +// CProcessManagerDoc + +IMPLEMENT_DYNCREATE(CProcessManagerDoc, CDocument) + +BEGIN_MESSAGE_MAP(CProcessManagerDoc, CDocument) +END_MESSAGE_MAP() + + +// CProcessManagerDoc 构造/析构 + +CProcessManagerDoc::CProcessManagerDoc() noexcept +{ + // TODO: 在此添加一次性构造代码 + +} + +CProcessManagerDoc::~CProcessManagerDoc() +{ +} + +BOOL CProcessManagerDoc::OnNewDocument() +{ + if (!CDocument::OnNewDocument()) + return FALSE; + + // TODO: 在此添加重新初始化代码 + // (SDI 文档将重用该文档) + + return TRUE; +} + + + + +// CProcessManagerDoc 序列化 + +void CProcessManagerDoc::Serialize(CArchive& ar) +{ + if (ar.IsStoring()) + { + // TODO: 在此添加存储代码 + } + else + { + // TODO: 在此添加加载代码 + } +} + +#ifdef SHARED_HANDLERS + +// 缩略图的支持 +void CProcessManagerDoc::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 CProcessManagerDoc::InitializeSearchContent() +{ + CString strSearchContent; + // 从文档数据设置搜索内容。 + // 内容部分应由“;”分隔 + + // 例如: strSearchContent = _T("point;rectangle;circle;ole object;"); + SetSearchContent(strSearchContent); +} + +void CProcessManagerDoc::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 + +// CProcessManagerDoc 诊断 + +#ifdef _DEBUG +void CProcessManagerDoc::AssertValid() const +{ + CDocument::AssertValid(); +} + +void CProcessManagerDoc::Dump(CDumpContext& dc) const +{ + CDocument::Dump(dc); +} +#endif //_DEBUG + + +// CProcessManagerDoc 命令 diff --git a/ProcessManagerDoc.h b/ProcessManagerDoc.h new file mode 100644 index 0000000..d7db3e2 --- /dev/null +++ b/ProcessManagerDoc.h @@ -0,0 +1,48 @@ + +// ProcessManagerDoc.h: CProcessManagerDoc 类的接口 +// + + +#pragma once + + +class CProcessManagerDoc : public CDocument +{ +protected: // 仅从序列化创建 + CProcessManagerDoc() noexcept; + DECLARE_DYNCREATE(CProcessManagerDoc) + +// 特性 +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 ~CProcessManagerDoc(); +#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 +}; diff --git a/ProcessManagerView.cpp b/ProcessManagerView.cpp new file mode 100644 index 0000000..3740ba5 --- /dev/null +++ b/ProcessManagerView.cpp @@ -0,0 +1,128 @@ + +// ProcessManagerView.cpp: CProcessManagerView 类的实现 +// + +#include "pch.h" +#include "framework.h" +// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的 +// ATL 项目中进行定义,并允许与该项目共享文档代码。 +#ifndef SHARED_HANDLERS +#include "ProcessManager.h" +#endif + +#include "ProcessManagerDoc.h" +#include "ProcessManagerView.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + + +// CProcessManagerView + +IMPLEMENT_DYNCREATE(CProcessManagerView, CView) + +BEGIN_MESSAGE_MAP(CProcessManagerView, CView) + // 标准打印命令 + ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint) + ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint) + ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CProcessManagerView::OnFilePrintPreview) + ON_WM_CONTEXTMENU() + ON_WM_RBUTTONUP() +END_MESSAGE_MAP() + +// CProcessManagerView 构造/析构 + +CProcessManagerView::CProcessManagerView() noexcept +{ + // TODO: 在此处添加构造代码 + +} + +CProcessManagerView::~CProcessManagerView() +{ +} + +BOOL CProcessManagerView::PreCreateWindow(CREATESTRUCT& cs) +{ + // TODO: 在此处通过修改 + // CREATESTRUCT cs 来修改窗口类或样式 + + return CView::PreCreateWindow(cs); +} + +// CProcessManagerView 绘图 + +void CProcessManagerView::OnDraw(CDC* /*pDC*/) +{ + CProcessManagerDoc* pDoc = GetDocument(); + ASSERT_VALID(pDoc); + if (!pDoc) + return; + + // TODO: 在此处为本机数据添加绘制代码 +} + + +// CProcessManagerView 打印 + + +void CProcessManagerView::OnFilePrintPreview() +{ +#ifndef SHARED_HANDLERS + AFXPrintPreview(this); +#endif +} + +BOOL CProcessManagerView::OnPreparePrinting(CPrintInfo* pInfo) +{ + // 默认准备 + return DoPreparePrinting(pInfo); +} + +void CProcessManagerView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) +{ + // TODO: 添加额外的打印前进行的初始化过程 +} + +void CProcessManagerView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) +{ + // TODO: 添加打印后进行的清理过程 +} + +void CProcessManagerView::OnRButtonUp(UINT /* nFlags */, CPoint point) +{ + ClientToScreen(&point); + OnContextMenu(this, point); +} + +void CProcessManagerView::OnContextMenu(CWnd* /* pWnd */, CPoint point) +{ +#ifndef SHARED_HANDLERS + theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE); +#endif +} + + +// CProcessManagerView 诊断 + +#ifdef _DEBUG +void CProcessManagerView::AssertValid() const +{ + CView::AssertValid(); +} + +void CProcessManagerView::Dump(CDumpContext& dc) const +{ + CView::Dump(dc); +} + +CProcessManagerDoc* CProcessManagerView::GetDocument() const // 非调试版本是内联的 +{ + ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CProcessManagerDoc))); + return (CProcessManagerDoc*)m_pDocument; +} +#endif //_DEBUG + + +// CProcessManagerView 消息处理程序 diff --git a/ProcessManagerView.h b/ProcessManagerView.h new file mode 100644 index 0000000..6b52a76 --- /dev/null +++ b/ProcessManagerView.h @@ -0,0 +1,52 @@ + +// ProcessManagerView.h: CProcessManagerView 类的接口 +// + +#pragma once + + +class CProcessManagerView : public CView +{ +protected: // 仅从序列化创建 + CProcessManagerView() noexcept; + DECLARE_DYNCREATE(CProcessManagerView) + +// 特性 +public: + CProcessManagerDoc* 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 ~CProcessManagerView(); +#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 // ProcessManagerView.cpp 中的调试版本 +inline CProcessManagerDoc* CProcessManagerView::GetDocument() const + { return reinterpret_cast(m_pDocument); } +#endif + diff --git a/PropertiesWnd.cpp b/PropertiesWnd.cpp new file mode 100644 index 0000000..c9b6710 --- /dev/null +++ b/PropertiesWnd.cpp @@ -0,0 +1,273 @@ + +#include "pch.h" +#include "framework.h" + +#include "PropertiesWnd.h" +#include "Resource.h" +#include "MainFrm.h" +#include "ProcessManager.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); +} diff --git a/PropertiesWnd.h b/PropertiesWnd.h new file mode 100644 index 0000000..e056430 --- /dev/null +++ b/PropertiesWnd.h @@ -0,0 +1,62 @@ + +#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; +}; + diff --git a/Resource.h b/Resource.h new file mode 100644 index 0000000..13fdf46 --- /dev/null +++ b/Resource.h @@ -0,0 +1,84 @@ +//{{NO_DEPENDENCIES}} +// 生成的 Microsoft Visual C++ 包含文件。 +// 由 ProcessManager.rc 使用 +// +#define IDD_ABOUTBOX 100 +#define IDP_OLE_INIT_FAILED 100 +#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 IDS_TOOLBAR_STANDARD 124 +#define IDS_TOOLBAR_CUSTOMIZE 125 +#define ID_VIEW_CUSTOMIZE 126 +#define IDR_MAINFRAME 128 +#define IDR_MAINFRAME_256 129 +#define IDR_ProcessManagerTYPE 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 IDS_BUILD_TAB 300 +#define IDS_DEBUG_TAB 301 +#define IDS_FIND_TAB 302 +#define IDS_EXPLORER 305 +#define IDS_EDIT_MENU 306 + +// 新对象的下一组默认值 +// +#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 diff --git a/ViewTree.cpp b/ViewTree.cpp new file mode 100644 index 0000000..84996cb --- /dev/null +++ b/ViewTree.cpp @@ -0,0 +1,43 @@ + +#include "pch.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); + +#pragma warning(suppress : 26454) + if (pNMHDR && pNMHDR->code == TTN_SHOW && GetToolTips() != nullptr) + { + GetToolTips()->SetWindowPos(&wndTop, -1, -1, -1, -1, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOSIZE); + } + + return bRes; +} diff --git a/ViewTree.h b/ViewTree.h new file mode 100644 index 0000000..0267d80 --- /dev/null +++ b/ViewTree.h @@ -0,0 +1,23 @@ + +#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() +}; diff --git a/framework.h b/framework.h new file mode 100644 index 0000000..5672fb5 --- /dev/null +++ b/framework.h @@ -0,0 +1,49 @@ +#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 // MFC 核心组件和标准组件 +#include // MFC 扩展 + + +#include // MFC 自动化类 + + + +#ifndef _AFX_NO_OLE_SUPPORT +#include // MFC 对 Internet Explorer 4 公共控件的支持 +#endif +#ifndef _AFX_NO_AFXCMN_SUPPORT +#include // MFC 对 Windows 公共控件的支持 +#endif // _AFX_NO_AFXCMN_SUPPORT + +#include // 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 + + diff --git a/pch.cpp b/pch.cpp new file mode 100644 index 0000000..b6fb8f4 --- /dev/null +++ b/pch.cpp @@ -0,0 +1,5 @@ +// pch.cpp: 与预编译标头对应的源文件 + +#include "pch.h" + +// 当使用预编译的头时,需要使用此源文件,编译才能成功。 diff --git a/pch.h b/pch.h new file mode 100644 index 0000000..9660927 --- /dev/null +++ b/pch.h @@ -0,0 +1,13 @@ +// pch.h: 这是预编译标头文件。 +// 下方列出的文件仅编译一次,提高了将来生成的生成性能。 +// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。 +// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。 +// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。 + +#ifndef PCH_H +#define PCH_H + +// 添加要在此处预编译的标头 +#include "framework.h" + +#endif //PCH_H diff --git a/res/ProcessManager.ico b/res/ProcessManager.ico new file mode 100644 index 0000000000000000000000000000000000000000..d56fbcdfdf6eac0f4727c34770c26689271d96af GIT binary patch literal 67777 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 NK9A-8OQnhX{{?OVn?wKr literal 0 HcmV?d00001 diff --git a/res/ProcessManager.rc2 b/res/ProcessManager.rc2 new file mode 100644 index 0000000000000000000000000000000000000000..233c5653dd26782b1bdceb94aaa413be4458a97b GIT binary patch literal 684 zcmd5(PYVHY5Pb(HwO0qHEf*!bN4nm6-)GtY+(9SWlKI#g8PVG0X<__Q**aESq94;o=1!>Tk<#*mRz`-FoTb4})a z%*hxt${|Hlp%`)VvN&0>-TteejwP2%R?f?Gd1qE|qUjP6A literal 0 HcmV?d00001 diff --git a/res/ProcessManagerDoc.ico b/res/ProcessManagerDoc.ico new file mode 100644 index 0000000000000000000000000000000000000000..96365d434ce66a0721e4b81a6a511a7982cb42dc GIT binary patch literal 4710 zcmeH~J#17*5Xa|&lRKR(8T$~{NeCP&Xwqy&WebFD)xhr9n;?B@)W3 zOp!#1WH(#|qOcSxMc5h&pg>m;!y%t#KfOCe%H}uo-hKFNtV9Y;jWHZVl{N{sph^HCK|Wo4xyD=TORgrYJ~OyM&XI|Bu>(!isT z@n~3pz8obFF_1fzz4n+7z}{Uk0tJ}|{;`Aq%7{!>k__zzV@&Rh%PV{RJC$KRORDlH zy$`vV-#hd5lGt0NNmgUj{Jprk+Usfm59R*&!vE0u*dmNHU;Ucz1d(}m#1veHj}=^^ zmom(bWg8Be$Nz*%=Ln-)e-7^N^9`O4rUsiD3;WtSS{`kW>s~)>pO=@*w{c)Lw`G}b zs>58-*!s&yH>a}Y<>m77&0H?u&i6$}Ophg(1{gZ%bnOP;)X zCExtAP9g_;IDtbhI&==5L+4aS0o28#_dIy?9=%7e!xHof`UD|CpP;9cfIgrP=mUy? zJ|ait7%a1+bp&?=atv~uZJK4-O9o4~AeTd&o;jp8SJs<<;tdirfi)R%&u5U`j}u zkRSn5Lhb}(Lhgjz3At@KEH`@cC*)7auS=AWKcO}pUod*=pvy*8Z1!mAX>}Q?K_FiM zTL4EOpDnH8pauaPL2)oKTW$sgumrFKKm-!n7640NV8AJ$2w>q06NfbkU`#y)4{aQcBnlXjOG4vfC zVmF6$Y!-!s+4ngN3z6Fkhp`Zfp|HpF9rNqk-xXnC-`p%QjZ&#zKYjYNHM(sF@#8{F zH~H*t)^UMo)nPDxF~)^-Ax$^&DD3L+Oy{q3E5^mRn5K(`eO{eL>`O~acr7iZ>8;C` z>vd&y7>u_dc_~M0J#M#ojyOEq(tY~i!NWcDY)FqvB|QnggwMd^_c@v3xOkuUIlHF} z?{oP*WkK&c2U3GO3I@(J>u7mAx~K3?;uQrS-BXV4DcmLghxe3fo0mH8tp1z*%}lM^ zt<`GXLes9-Yc-C{S}j*(J9dJq#)f1&JNnLt@*&yoPT`?Js?}_FpwJ-IEZxoB^D)&d z@{;QhA!f#5JXEOMYN2QmwAC{EY@AJJcV~BI4MP^M=x6uJ&Xq#ezwEI`j9xE~XJ>pK ebf!9zJj>c|s^4=u%RGFh;Db)((f^2J&wm5njJ}%y literal 0 HcmV?d00001 diff --git a/res/Toolbar.bmp b/res/Toolbar.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d501723c1ceb781cccf04bc42408a2bee6b0eab4 GIT binary patch literal 1078 zcmb_byK2Kg5WFD46)N-_DGd%mbvRHJ@+(`2Y#@z5De^h$T}Yp#;yM?~%&rw%!DZII z_s!1Ct^M-)Tn3AG^p9vgT8;J){9rDyxEsA+?t8wt)o$n@0`>@NK8bGHkdKdb4m#tglAgQo-)Js1!#;+~GSl z37z4Z<|(I?jV44Q_xOeQ!(IFmLY86pVjciLPfC9(?0)$t7hw7W^>>N<@a4LVKPMb~ ze5>=j|BL>!3lPen5hUo~ANKN`l7C&3 z%0PPq3XFRT-e1OO0*EKjOA>DIfd!JKE>l7s8ZOWoALnDl7bEaBMvn{Ll0`lMj_p*2 zeyj@cEB=w(f%+@Ig9SfK=ePQ9c)El>T>d0F2ei{lnHqPg}It<8 literal 0 HcmV?d00001 diff --git a/res/Toolbar256.bmp b/res/Toolbar256.bmp new file mode 100644 index 0000000000000000000000000000000000000000..91a2553037e79916922307b86e41461d2b4add14 GIT binary patch literal 5816 zcmd5=d2kd}8qZekA6vCmnpM|wOKTlntrfS5ip!x0;zU`AgrhgWFcu&!C>g+oh7BYn zfE@y1a(6<4L%^hSkW3~7+XO?n;vgsk8t9N9BWI%m;R+8h5INHOd-Eop&IDQi*xK^d zH$C6$`QFjL-*>#8*TytF8Ww1SaeWRS5uXR~`AyhkxQ2x-$L|mQo_zv0aPj`STi%4h zQ(u1W*Rx02DM$&tDD=qxYHwRgSI>BJ(0zn0v~WevOfiRFylT?iq_NZIjj+8lBr2x= z%dbD%f6(Jk_j}||e}3ShM<00jv5;Nue)m1kL|b{x_~LO~;g~V`qekV79GNy^L`r02 z!q8!m1w)3+9sFX*sOH6EtEa!3&JCC}_^<3Ie(3Y|7lV3;aZgvUD)tD7%vm5(R6wj2 z(Q4_jF=?WMvqV^bPE3YWl_gPUty9-Kbr2C^5YpY{$yHJ&O_7t|2dg0`n;7Czp?B zcUFvk0m|OEXwUTFGluo+_v8~Hmc6E_k;tLIK%I&t`H%f8e5cj6}l|HSlyWsNQA<(rlr*QXuSCw`@m z-g7H*N5_kGq`&9lGxC{-Gh6=>D?a{wgt0{PJV9Sucqw%iD40JvdgQQySqYBIn*ZuK zE$4%OmqiXLeQntKR|X*pj3G?t~qFMQkl z!@)gf{Fi3C79YBlQC^ew`GNU<{k;}_$^reK`?}uTb?eow9Rrp2e(v+(E1RBYBYr~cfA0D!$bE|A;Qf6c~a6TpnNm`;;d2WM()%n2RkVVsDmd>8M%{HNS+-OjM zT411RDD9bV9T&$JO&$sg8t1-oIBDG0IsYi0^0Hw7lo-xhw*zZ3P0_?HYA&HC3KUrm z_`eAJRTAN)6ok1+n5@Z85t$qm7*QbDIi9m}QC2i0A11{`l%{fnZT;zze6j{R!kXyYd+6#q{6qo~OO zL39LM6VAqqcHrN*UZG0h)W>61r$I?U`rr^Qh+OR7a^62?_hqTHC7dx@$b5O z=ckTqKVCfBe)^~x|J1^=ywlfQZFj{zC$lS+kKf zqY#_%cdp-1c=men#oMm7u8fUaA?cni&WgI!vX4`WJ;{X?9~6`<$^9rXd+p+kf_Ud@ zO#WSNp1!m3>zT1^?%SO=ZnR$@XHH%?cIZs=m#FWc;Pa_da40qJ$E;_Iam(h;m^F1` zO!OP(`&4%a(DuosL1Ixryn#F24?_LWr+@-B5ctb&MAV1?3RGGJXsUNfhyo-c)B==a z9Cw&8uE3uJ$VGamMBJ;PIt17!LHu(j)5S$j7a~AGKrBS!X;ApRUWDPj@b}f0b#FQN zZ4_cN{u#1czHp@^yWsdD~1!AqM!6cSj9o#@VISmF+jG$<1yG?#^$$omNzty0&b2e(^G?FfsGP z5d6;<6$Ag{i{j1mn<+pdLM_0nnR!2k-uOvX$?9};ah)^GX542A4vKVIzgJfkBp*04 zyd9BF1&2MPAVo3{kz|G9PjtKm@Pf!e90C=*5!eNbAmLnUjpEHiSfU61y;^r&mYgE+ zXFst~hZ~CE=ep{pDaa+z?ZGAB|G0vt1S>7gK4qWsp?Q_&?bXz>cVox{d;|ZS@{RJL zqrl&wAgjbn#v&ZK;#;uN}?s~bR68Pir-+OM|pa8W1uDbQ zthQ>&yqO_3I4hc`ML9s}G$)V{dkHm^=nx(N`cw(I$glA}jdLkhJ8uzX;Lq8GkWuK` zY&O9muwqSD?0)~nv1sDN;CqTON-K}2A%IK>3Q&)rqY({sz$>8a&3~t9*QbU(l*6BW zOl^9%t>p!+Uu-kLXZE1LEY7NW^E`&0HD`h}YaF^{V-4`Xl9t|kZrWoMpd7~z7=S-0 zjIm~=Y)z)oWr1LHp=cra^Q2(ug0wz3)K^uWce$DC-1gAvb4shW7`PPF!p5(s&{~Xy_jwqmsh&eyCr}cO5 zx_K=-HuPNq_?xA*anr%ARr~77`&!=TPDO5VNm_!ZV3paXqkannEL^SG)L!YnP*QrX zaNQ59^R?`p6RVs@#pG`ilUm{y;%^G`sQ-^HDqbqG@(Y&({vmSzfogrxsoI>@(xuHG S&2I5zpnGulR`Zasu>SyP^l1wK literal 0 HcmV?d00001 diff --git a/res/class_view.ico b/res/class_view.ico new file mode 100644 index 0000000000000000000000000000000000000000..bf6b0ddcfc446d92c0f3a2732effbec9ef3f2415 GIT binary patch literal 1078 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 literal 0 HcmV?d00001 diff --git a/res/explorer.bmp b/res/explorer.bmp new file mode 100644 index 0000000000000000000000000000000000000000..01298bac300aad208847ae87cbf073acc0dc5dad GIT binary patch literal 238 zcmah=F%p0v42yT}`V8OU?sqIB8*F@u7rDxY3Dw!qBu!iPh+>up%nD;~^xU$_b9!?sU-tW?cn3=+(0{W3%Hvw{ E0FN+YJOBUy literal 0 HcmV?d00001 diff --git a/res/explorer_hc.bmp b/res/explorer_hc.bmp new file mode 100644 index 0000000000000000000000000000000000000000..697199df6294014e70dd69b5b0684c69ea96b2d4 GIT binary patch literal 776 zcmah`K}!Nr5Z>w%bSOIY6S_y;x^#=^R}@&kz@S4xAsy0OSFqiEnvk_cWCj~af!ZO0 zE@C1bI#gikMJ-KRch~IGXOD%#hHqwP_kHut?7XSj{ywg46NsbmA^0G?hZ{lUxVv7C z8y=wE{(z9M7;)I=rpLR(LQm{(tu(ZnSt;p-oR)j6J>P#kB+Ho_;4K+1-9{m0z-yz7d4b$4?a3zXV?=>G`+@r0mX=ILgTF#RqG;|GWbw14$QsiRNl>7q=JWFpXc zB+GtS6}pR(n-CY&g0crQuxrJBB3a`!tDR)E@M|4O_(jJJvRWjn(isL-MDi@88uMwx rmNpktrY+sTD@4u|KB{=tkYFX#E;tPYT(ZaqB|#)kOvt+bPB`uxM6C#M literal 0 HcmV?d00001 diff --git a/res/file_view.ico b/res/file_view.ico new file mode 100644 index 0000000000000000000000000000000000000000..0f93f52ab018501ccb5a69bc9ecf61a9a7650a2f GIT binary patch literal 1078 zcmeH{p-uxq7=-8AiluGXwRNXRLmvS{0}{uZ@B~W}lG?sOg9L@ftU&f5NNOst2LiWz z{}u?M28DpRn}7bD|8kdHW>>1zQC$ZaHXZ2*4Pmz)SJGiu8spXQ6jtg{rO31U5g9Ux zaVJz-rIb(`%#>mZj|R{rs){{R{IRanj~`8E8^d7|HsNXD6v=^|9xALe{m>7>s~ zRtMp+zf^qME(Yz=UERKn!fSHv-Q;0$kz76=_|Zx(x7}tdG<)wI+89ueQT&g!8B*`O n;7j>X!P{DDrqVO3_?_(ccqYy6rJGA>j$Wg)2|nk5(YEP3?l|SD literal 0 HcmV?d00001 diff --git a/res/file_view_hc.ico b/res/file_view_hc.ico new file mode 100644 index 0000000000000000000000000000000000000000..42ec43574f3251102f8afce3dbf246e9355717e5 GIT binary patch literal 2166 zcmeH{KWNiI6vtm`g*FsvPz%8hv4hz8mUNRA3qk|I(rTv;!r`EcOQSes>e9txDc;sW z1&25^?c$Wl!5(yKx+GJFN>SQCiUo!9^Ii~_PA(4mlKb<%_vd|n@9y^#$w;3R3d5rI zxliN@%Sm2JQ_`0xADhS0JUo;a z?`i~c6i*41*mE74Lvv_OHQphe;?X@FkM7Yux-JXo0X^UZ^ngwy5j~U`Q|| z80=Dd;dH7!nK#fJFSrW{HJ~NuE7CzK0{(-a5z2 zb$KI;i;J?fv?R;R%d)<{E;~Crvbnh_`}_OSZnx#&;6RR!j-=D+$l2MMoP1C6dSiq4 zxJq{Q9ngmT%+r0NC^XY_V9*X1`v(a^-OyfBJ55p;Eqc%%auW;93dc>8ts& z`sF9x?kqySy=s2t-u(S%2)FC?6&=4;sVpoM*Ge<>`c?H2ip6esZT7=p&is^4PrKcG zKHvW3Cwzq8eoyG+zUg{1oq^vyRim%-Po}n8t-UR5w`MlAJ=kisntOXDZq;(zY7Fnb QUr~FcdHC^wr2L`%1dB4V?EnA( literal 0 HcmV?d00001 diff --git a/res/fileview.bmp b/res/fileview.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a2d62d0cb7f2363a89c70891f234160ca7e5ddb0 GIT binary patch literal 478 zcmZWlF%H5o40I(1wtj<=H=wSFZ!mTOqz+^w5~}(YHjr5Q1ja1p6_u#OV9rje7WEqY z(u;d>z1hAqG8~Xsh&3WdWVApg+NX1S`Ad!ni=2yuj4ico3)Ta%MIyRG;86*Q6JF2( z9(dS0>`|n)s+O`b0my_qF+B4%$Cv&y0&}%*ga}9sd{1!FwGY Qbdl4@X`FftH!Cy#0ndjAV*mgE literal 0 HcmV?d00001 diff --git a/res/fileview_hc.bmp b/res/fileview_hc.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b60f48381c6875f87a042ddea6805e8472b0a016 GIT binary patch literal 2216 zcmbW1drVtZ9LHpHVU>k#N zGF}7OECRvtE{`%^-C*U>jYlc3@+j>nE#=igTcEe^_P(#ba@nDxBh#DTIr;V8@BMv0 z=XcKS?vKjW2o|p$Fuw}pH5lt)JR#Twvp^6D&o?~9kHs4>aRToDMML5BulH?VJy7Mx z7yoiO{X|^)m(f=~J$3fL@gMhwe)ZM|9|ym^XG`$*%|TnAdH#j98=hOcaTBVH60q>i zjA<2jH66{Wdkq6E5~Z}dw_e;ODeJ5*YOl-()IhQ8ez#+&&8}>=bvIz05^H;PU?6eS zm1{`_;_vI!f^;PxPo^r?B+AxZy!Gt4^373sFGgktg@mEXD3O+A5_3j;*5I4gdd7#{ z`hM3)k5eso47P%)qP7HCz$*YxSf+8)xbK0^J2m1NSGn~AE^Uud;Bnx9@ z!^y=}v18n^0q#gI_hARQtJ(9W#2#ER|4RPM##Hso;c;I?oJ1siGSGU5bXp1PEN+_g z8Am-68jpU^rR{ZUI-w6ew=0mv5)Wp^=VxFE{#BT#@EL;_-ZBh9->e*o%4v-?`f_oSXTYOt+kmZyJJ28A45!86-;8^>m8w}ZqixOsYU z;Tq4F$~~%dX}Xk6HOPYJp`2FAzCbyw+~P$!7Wl+FK8(rhkT@To@uSy zFr;d2Ko&d??R9~YXMmX@ynGIa5RMZPUlQgejX6@MxvOQhsf~&=T0ajT#|F7ilw63M z-qqv_F4P|mKf@ydiDj_KYqQ8AUzeVEi6wDUkA!yFNZTA~HP5t{p2DKh9j9l!_ z3oRdl`p_J}fKrYHi`%4!vMfUbAw&2WpPTl&A*Y;}QL8$6WH;iGmFKWD#gHURkvs;R zy@xzTdv7D+Nz5(DnRVsOQ(0yy#Ime=M#pa)%z?R~qxR>p{fMW%>IR7Y@HE9^@H6GI5epCO{Vj+mCBH0x z&MU$Q9w|n*ykBVJ00UKq1guFHM&iEFn~BCY5y!G{2aH&fUWY>y z*rjb^DT0Q6Ix)g(hVK#aq!o%wF|XL}dx*rGR#QngN)xh+F8-bu`&&*->K`k3BuCfZ z`h0!MPuswHOp*acR&6Is(_jI+hUt2&v(qNSXvCp+(JK1tO9R^i`67>p^4Q_h~(cG>6SFyBMsFp7u=G7fn zf2vp9S!v<_&E6B|qQihHXxr)@UyR=RPYGD82(_$gKw91{DgI}j6-xN|D6v5B7pNNe AlK=n! literal 0 HcmV?d00001 diff --git a/res/menuimages.bmp b/res/menuimages.bmp new file mode 100644 index 0000000000000000000000000000000000000000..777184138812bf02ddb1c2d3b3e40a9bc016b93b GIT binary patch literal 1078 zcmZ{jv1%JZ5QZ;tiUooF3Pw#_rpg1D1#c7dDj|g2p=uEa8i7Eq^#lf0hLmcqyyC#G zVEh27RH(arGjn%p?2&eMHM`&bv$L!FAK$+eW`FQ^v`o99eJXsSx#GvWmVI%~#;9jV z%SF>P5WRhizSj|rkA`p}5le#UAi9rfU6vwcS#9?FN0FfOld(k*siOxLyWKA7aKU~j z^L?LI^RFWFd9`_z3m>3ZSlNaHF6n$eC!+83vS%ifrgpdR3I3-h1fMnff&L2pyLlxf zF!I-L!LqK3;QSR`H|W=P{OSB-{-O!!dC|)MZsF6Ee?EQ_c}akY#QKHqAm$0IMZdDK z1klN}YuC?KKk}db4f3Lt@j96F6{b!y)jv1v;pfkGa6SJs`c%DTVNKt&kKTd~)+Wz{ zT3~I5V;QXRs!2Q!d~NE)Mt)hTyllH|=X_(TBprluSpDfz+jU(VV|_ZYLz?*Y;fVt9 zh+00TALKLZ;YnI8N~U}ZaQIX!uDs_^JAHFPq z!Ed*$c0})A^6{e2{rT%jbv?+B`j-ESN2JFe`25Onc0BrSdVfKN+y8C(C+0_6Qa*b` jEs@|+?Pkvxp8FhR)1>b!{qfki#RnUi2^1|8ZcDA77VMKMye2#Tl(imwQE23zao1I*xz)7$^eCY#OP8;thO$#VAWp1t?} z&hFX0%nh#|qHz<%*@qNcxMSUF@@qcAMDULIhEe z_a~PAy-WtZHZ0gjAp=g!nm!_Gq~An(~mQ!j))%VKgVD7fk#uxkJeeU3l5Y@ zZ+E-vZ(V8y>)3wx9%kCL)?2JmQJ2$(MQ*GsGd;N8*m0%4?T^|U7pj|UPBm4PWvq;`|EXlsG^#9ztFWDulK62X{~IEL-E*&#Ma zizK&O5F_%O>nh{t@<>@Nn>l4&Z~2Ju2wv-O}Ex7y?4xgTE^i zNk~PzoIg$b9$vDjN&HDPJ@~sK>s$rW5}^F6?)_GB{cvJ+5)u*nM$peatSxUpVYs;C zi=#`}rhAY7L3Mv&ZP4V+W=k{Mv_5@9Y1wh`FFX0GE=f_`?{uaS*)Y=4%Bw#5a@`BUsvp%HTccSg-pMEQGN z1!M_O{^Tuka&p+$fo?XNISZ|B+Tcw1%c2g=T9`-eQ~`gg6NP}48?gk?MD3J6JO8oO zwqC3`U2H@kAiGjm=clgb_Fs-a2BaZ?0-?8nLKs?2MktuE)^x2!ud!&=rYNTf8a3OW zy5KI7ulJ}~OwyhXw$8H8F6nlr?6$#z5ODmHlatvyrl+T~RZic(<8+=-VcJ)-duzqo zHAj9jU*S3^@)wo%Ru(=6A^chRFaq_REA?l8DI#~lcCcSa;`sOU^dR|={6imxgn)&Q zG=c-Cdk)JI2=yh3Jng(BY7YK@FJ0a@0_?>c|Hw%9cD7)_0`4(hwd#$(VhGs534dal zka2iyVnI;q0aS7RLH+@GoQ2vhoh#X~k$RDLmBU8|Z!_P`pEygbl+!-#NfpVXpQxEl zbVz4UvJs&4JPxt^wOVaZ+S}yh77`LdUrkY|%Z=X?J)^Oz9IXY>vkeiUKg55@_4LM{ zo$ahn-C5(Zv-g)bbdwNZwj%`CcCVf}i72p>AFl~_`TPfb`T3JzluC=>E$w6VQK8tW z;)z!lHI6@edszjPe@aTq@bdxV@&}IBzC#bs6o{g7=G(=@e(TaX@VDJ-=ejBKXW2sM zPCncSsDgjo?Y_y@XOn~@@>b4*7p3PPG!gjn!w1~n!*B&VS(@}EG!)RA~484d}8yUkbOfwOc=@~ zpDDVKp^Jz4P4`nxQPI29ZC_ip@vG|n+X|v*9L@ZO+Nq+*pSA+N;^C8afD)W}i0}ve z(K>}Kp6v{s7T}o*m{K@E0`2OC#h>JA;y)6OEe=X*Jum$tqu>^=qeSN+0#jfvqGj)G1 z&Cky#Mp~A&mFLtO7Mml2GR9M*q-tt!=j$Eg5< literal 0 HcmV?d00001 diff --git a/res/output_wnd.ico b/res/output_wnd.ico new file mode 100644 index 0000000000000000000000000000000000000000..d14f99150a44bf91fcf7cd6515faa024f419fb0c GIT binary patch literal 1078 zcmeH`u?@m76hzN4HTDRuP|8SIfP%ri0VA-AJ656e2IhU6bZMZWfJ^S*_diRPth3}a zDWxdGW0Fp2jAK1J>FA}IS%PQibf8L^z5B?RI5`iY(yEk#n$h~N)~thkHnQ@^Pu~C; z_$n;tmiz>_oEQ3iWHOFJrn^vSKg;=eZg%KEehq>Pt+uLAWAg!RPJS`1e(CGFF6K84 b)oLF5kv_Nkthx+rYESJ3uka2Fr@q4{hGyV^ literal 0 HcmV?d00001 diff --git a/res/output_wnd_hc.ico b/res/output_wnd_hc.ico new file mode 100644 index 0000000000000000000000000000000000000000..fdd27e85abee63b55cc208018e772307a1f6eca9 GIT binary patch literal 2166 zcmeH}u}@S%5QpdROgKXfG$fZ$oD@dtt>_Fr2@N&f#Q%WC;wowr6O!#H)WqT%B9+Zm z7Ba0z!&MX-Vsa3;Kw>d|GcQ-DSXf!;-tF$2-|pMrceDFmPNXGs((5fslrM84kLeei zP@dfvd3aCc30jZ(l-iOutw^7_cb7hcjP(0WN6V!QheP@p@cfEKQTX}8-lKR+)E3k$Nev?R;R z%d)bvBCD&bvbMG++uPf+xw$DD8ym8|zApXeE?ZkJFJ&bD)#SryBBRfr<;B|pMun=> zO0^~|Xa%jHmC$&GVv3?G7mBXviXOLB^om{yDtbky6GJz2LpKCNcVZ`YOXoscSiG=M z;ikfKoAxvXh5|!@p}>$xFccUH363PYq$ z;ZPV92Fo{=H7UfW`4DG%BRf#xU744u#=F8)F|8O>m@3|t!HRdqyW*YOk>2R|SNtpf zu|*aCN^U9)6^2S4V%x|{{(2O8+So>NVE7qq28ZF7TN@nYz~Hdp;D_aQbCbbhuow`A zVIBckj2n$fhG4MprLqotVz5}`BU$1!#4e!0;4nB04uiwsFywK9!C-J090r4dWvI-D z!C`P190r!AqQl@YI1CPe<8LhH+~`bF)=*-F!*lJJqw+{z%g)Y@?C$Q$-rk<<@9)d; z@v$5p9?HqdiHyf%IXgR(^Ye4Lyu6g#+grK#=JM*`fakbRcHjBbt}Ieby3O+1;sC#P3A z{(iRpWERgRc#e-oqoa3G27^KHj5?jp>FMYbrHOwUk2$|Dk%uAw3;wh=`4jmL>r|qB literal 0 HcmV?d00001 diff --git a/res/properties.bmp b/res/properties.bmp new file mode 100644 index 0000000000000000000000000000000000000000..72e2b298687e5e7aac2f870b0e99a8f04871246d GIT binary patch literal 598 zcmZvYJ#ND=427AZfVJfsJw{L%XqT=%M~0%%$RU6U* z@A27>FRyo&@lJgp59FTQ**(?lbC=7F;%2<&-WMuc(rsB58ZBRIO*@iD5QS^HUBaxy zDXsye@YdGc3{m2(<~GaOa`Cob9cnne@j1{@(E9)cUaj+Eh-rKZRD?!MT|j&x5;%<` zePf{?H3c+3{S}zs2@atiAAKqh3{bU$M+EGrvNDY!f6opE9zV>{!>`|Kk)?sq2>$# literal 0 HcmV?d00001 diff --git a/res/properties_hc.bmp b/res/properties_hc.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d18a7ca4940d757b291f94a51943544078a2f794 GIT binary patch literal 2936 zcmcJQYe*DP6vs~=r4KC9fcO?PHjiMpJ*oO|xM|NEOWGk0{U zMdKmZ7GfWdR|;Me@EQkGum{lL{KSzf7{Jc$c6+UQrC|h{)9LhDt(Q5@YSrUV>3bf% zSdeI*o3Pigr#5E?pRnZMb|W8L^t;=4!1R0Yw;n8FWz|YZ?(uj?-0JnBVMLwAL@u0l zCoe5MQ{748dAsdQ0#@dJcMlCZI7`;5`QeQw6DR)oYe?iFxt57DL!|BN>+9|9#T~In ze8O)u8ufa8dV0D}r(>3op=lepc=;*fd%F9SIg=($Mzx5D2pU9wDIki1AlqY~Y(BSa zooEg;yfvCkoOtu=IVT1|XM+_sW=c6kTEE|q+mSXfFff+-qe5rbv(%MkIfiPb8u5RL z0iBZhCCR~aXz2KgQk162k89_Yy_sF{22!s=S{;>Q9Kug-0eftOKg|126)MZxX3Z<% z9rtJiot;I+)wVjk1zSU7UV(v35q>0>0%)RaqA2wXvI#zX3hMfkg|pATomKS?GU{Oi z`-+kT%1_`aKbZ~H?=K!vTc2?*d8JvMhWyIlDE0S+U@i_ok;thd9a2H4UN>llh{ zdJlz7u)B%b=syir{PJrb^8MH1kE`*|v<=O)55+dVk8yp7X&H{bJ*-KqEI#@qCrtg@ zkL91rOzLu7#mv&orAOB$So7C0$}GP_=GSP!&jAl5&H7VvD82?I*O@KI5P|>V{J&Ya zhAi*tXhnYEX)hzr@cV-NA?qK4A2p-fhNIg*&gl3AM_gdO!R&%VB_!rwJgiu9HRc@kpv{o`V-k1U4iNM0@EIThVq+G*~09F{CMWzcBGB* z{D0Zq)m*R|rH-W~^xVD0XyOpnltGcV1kEIHCgHR}u%KlLrYxT+P5u!WQhZz4|Ce(4 zw4N_fPrgJw{R&mL;9{$Citv+LAV(-hFk#gHue)U9bz?^P=4DDX>Z|!BH#cI<7Rh0e zc$3H(#M5Y5XyN%$HtPAesV}}wef1q`+Mu?LZbbPBJobd2CWLYxR2_2VE$^(qpqZfN t*Qo!|vDTk#5!wGea^Oeg;16a;1Xda|8)kTC*T`3_&SCh~3I8er@Dp#buu}j4 literal 0 HcmV?d00001 diff --git a/res/properties_wnd.ico b/res/properties_wnd.ico new file mode 100644 index 0000000000000000000000000000000000000000..361176643ba208fed66b34bd7ea9a995e740330f GIT binary patch literal 1078 zcmeHGF%AMD5S%+rwsUy`mAPkF@SyEzc^c2Lq_AISk63DBjD-%&4m%JCWC0ee$T?Au zxURq%KuR;;7T|OMHhP)7kg@JH8o-X$rZ94d-a9oWeD83N5y=)-gg<`z1y}=LMbvpB zGx^Cne_WEs5bherpke@_&vN>@uk&HUZz?JREjrAsS^-3)*21r3HFQ*_MvaY?{zRPl F4(~hL6-595 literal 0 HcmV?d00001 diff --git a/res/properties_wnd_hc.ico b/res/properties_wnd_hc.ico new file mode 100644 index 0000000000000000000000000000000000000000..1e06b64a79cc625586deadc1cd0b17e2688e56be GIT binary patch literal 2166 zcmeIzdr(w$6u|MX_!dJ}FiXf5E25NeElp5iEv-PnU5JN(3U0opX=ELyq%4`#Vzh|0 zd`&nFk(NU#i;ZQ|B#JZ8YjCkCHG=`65!Bku*+gPa=b|G_Gx=|S)Nk+a-h1x7pL6$d z?pYXsA7*o)ZU=GB55j@KKr|l4iop;t5F+%LS*KN}aox>F5$Hlu(Y1}Pb(fl&8r>Qv zq<2BY*wd*mbuUtpg(=YNu z!D_~Cwh*x`7RxRx*2)xC9bQXw*;<0~UT0y!dTh>3%ztAuDeK>2#oNWK-mrzjk{ztu z`VJY}KVsdscUe@vo8T?Agzl&(@`LZOxSKJ(e}T!LbrN>yDyg5JVf=9+?&w8wYnn)? zyGTak?-YL9%Ca9Wv*Je|%P$JgoEMxeUA%O*i#@JlD$2G}Qc+3K?gQ-qu#)o1PpGc0 zrgmRBrw{FA!#5k)*;s+6?l5w!g7z;z<+ra6^5(%>HlAqb1)oOI>D9JMx^yP(%Hz>jwYJh+G*|Rp!=7f5pN5Bde0$U7wGX_(thEiyT|Aq z!mLtAtbzp%u-pr4#Kb1CP$qWviIW;}(I{@(#B-z1ghy#Vvq4rq6qG_q73@`i)C(T< zC)GEpKdZh&{jchM{d|-*O51G6&xX`0qaKaWe_zZ>y+ zZrndASp5X`lhwznPg1YByerignvhKvWS1S;??jHcG^ZPB_w;$~%eF!4ho~Q}euVmw z>I2l9MgKM zw`Mq|8Co=h*CbrB2$$`G&nf)j61v<%x98gLZ9JDD>Lb<1sZUYwQ2(s@V)Z*s!XAt8 zv0XUo6dGK@8MkoW)8~h&H@<-}>O<6rsSj5_NqwwI$h2tf+lAMhn#&~|b_=IHeZGHh zxOKR{zyC;`{=@ZGfK-RWk(ZaZcwuH{Z=B+oGe;L4PhO85OB}hmISbM={&qgY-|$a3 z^t>Z4chRB+eb+l2vqz`pT#vKIXF2Ra6a50TavmKVIxj9MXjagJw^#-Z7#KKeY-oH! zTyoGfQ}obD_uqHNu-igIL+8fL42vEzed?44BF(oO_aHbrJZ8r9sSia(j59*}{4p^x yF*6>XeCLG6jQEj6toPn?_g!ObkB1m>|IzzbJxY)K)6_cbKdxw?j}@168ul+9plGK6 literal 0 HcmV?d00001 diff --git a/res/sort.bmp b/res/sort.bmp new file mode 100644 index 0000000000000000000000000000000000000000..030730174d079ebd7a89e287aa96bac3d1aabe1f GIT binary patch literal 358 zcmZuru?@m75WGkfNEBuSO6H(v4eC^UBo}d)NG>vt>5@g*fsRNi%-P0HkU0D9egE&b zFV|azh&%O6o=8Pj*inI3)FelSzyt$u!NHlvBQPD+#1o>;nUSf%ypA#d6D6P9wZPiot3tna%}42A=pN z)qckVqiYhO=4B;B`)IzkHM3UVp=gqkE< z`2TS^X19Uj6W=R}u`V`BRTNUGT*~ZoE=E}@M4G-4&beN290uPI7Y)mrGD}%S!Zc#y zgm$8|h!l0hh(bej0KXh-+p=zbNxnGs5K@OM9p^P?6@tWsQr!fJQ8t9H4fv+@?@E|X zqO`DXAfLTuA0%jD3LB;nhTu}3%OU)Uae>d~wSD`PRIE#_TDw`bzPej#YZXOBaYGbAMNxJU1Qbwq zQ9%}gkc2>hMD|VAu-;u z_U^ENaW1@Gz)KTepJ9_>#4w&dhUuuvU+*r!K>zqikBg-EoTGT0crOpGd_4c*j6!GF zgt5Q$%%1(Aep^JXYaA;j{lo0vXr9rOt#@f44x!Y9RNCKI{%=ls`!l}Zp9yl+g^`%_ z=@@e(J<4xv0?B)LiIJM{Nr#}s%%hQcJ3|WQ_?9mYtoWooBhDu?a2p6C#*t1*{G|QA zXprpiW8&Val$~Q4KdX?Ec}P8R|3rGI^RSy73S>`oEScn4V;PeWB-T6-nm<@{x zP7j9d(REjYapaWZm4qakhc89(%D;K8g=WK0uGe=#^}U!a=RBVE4^Gq*fN7x>1fpGzL+QaU4Q zV9hgp=SzH70=^*zpBcngy}{8ukred&Lvo3{>y8VFPYM8|_z2LgBY#&%{0n_c?2XLQ6(lks8{$Ws|GCMag5*2;caul{u5mij7v) z%v;yAXj8}h4K35m%YX_Mqs$5OnGYXlkoN}#zH!cpNsV^n8}2S>@V0F9|F+R@E5~hR zjq}`EyGiv&RI;B1D%yj7`8j)Z7+*PjKq(jp(e&X2$5V&dd^n{f=D5vfdFwDAPRt0H zmhLx$9ymAS;R0H~Y?`}nw#(#<#7CsDjbHT2-@Qi4ir+jf4tp*+=)UlP+kyjbHg}>( zm*fLe;2E^qR^y3H>;9aw$9!xycD zMWxu3B?KO(91EKmK42EyLfV63;zSt}P^X(b^aX9`BD?=Kz2P>s!7jOFb1Xg?ehV&b z<4>oMSpsv#BRd;J~^;N@~i_@M=Ud*u@v+uwzwP6=qF}nuL zt{ywf!ECER02uN)DOS^qPwGNKD7!ed>G4l}`2kI#CT%awJ5#oFQ~z1&vzik9foBSh zKEb(6KcxBR)b1PkT;Snw53#+ISkpoP4+b_721!Fp!$0tFD~6_eBWG-mP(N3&uUr5& zq@2teGz{X8^57{sltV`$j|X_*_VhUBpjiPZu^g{1E(RXT*zBU5oPw;Zyo?MsjRpq8 zcyM}lMXM5|D3oH+WY@cjEQxt=cVt$E%r+nITJP zuA0zM$h~Adgq1oJ2(4*??_Ug9MhvWqz|F&P<4}BNC~o)=$L{d4lP?r`cy(c2@uex1 zH)qti8@(GRE4Z`;vV zlaR6o6I1oTUZg!I!%$SxC>f?-mW-Jv7(G`o%BXIXQKj1a_6g=(Ei+tcX2XO<`Oo7& zm@nU2wEZaBa|#`>MOQshIuk`Dpyw$lg@L}2keeUad{7S3AJde)(sy)8D>$mAtty2bR3qQk- z*_7g?o$WG7?gBgn@dzxc=uVv&sQ5KYusc(5geln05Li+L`UwJn0lU(~%VaQgdd3c)?0KKNPMGYjF)eE1TFKx9?>dPUHR9E;I!PB@`!s_V$@FH4af@VcrMDDnUeqz)hRMy?N#x7riz2-*vYLW73w z4EgAnMTR6-014Fvl5z9J%5!iz8{_6wIkmr&?PQYU~;;~=i&o>QHkBK=i8T+-_r{;@VbNP&`9YJgB zUFX(18F8#Nvl1e~e)PkhpPD2`-x3G939~kdN|ktA0^h`&_4VToYL770I~X9Lb8Re% zM8227P}wp;#X3=oqqy{bzqLm9FKTW7RB8BbY{Nc%9w(tPeIM4H+xA>>G`~gL z=IzuQo2mCt!z_6?g=b-=QR-8pv}eXmS(K@_ylkpP?UZHZZY){hxZ5wac}r~V zAl7GgkuG}I>1*2w%XR`rt1dAWc)0#9Kd>A3)Qcu&31mg{@qn^p2`ojy3wV%9rDVN$ z&qIHIUw3y`TU%RWV{>gS5KHoK>FN3DNCilUL?QdpkHCgj1!jwm=p%KtkiV-M@GQ-R zoeQ@jt;K}WtaklX)nv?y%KUYexBU@_iysPohKk?F>ILwSosW)RMW1iSp|_mAv|MX0 z3znkb*nD1ZAm!jds?{LPMp)!6>0sCRAAphpNDP!k_r@J+y=UHVdv?984lG5%K7pD! z`eCPY4{@cBfM1g)OK2Qay!Gh@trAR=im69qYQ8cmrn+ebCqD%HBELC;>K}!igW|40 z@oP7M)2yKj+Po7QT?bWrLw_6W&S+vCdmTP2%S{WGqF@g^;9>%f7@U|CoT(m^v7uIC zQ6<6Lo?^Env2u}Rfe5?Tu9zRd3l5KnICcAY<){JpwL$_{@#=ZNA$7hpv${!9 zHcHhqD=@U=7_ILyTF;xZs(-RY-R;b7K*E_Tz1A-IHm=Uhx#pcYeVPMhe>btGo7mq) z*!4&@c%%alAXiJ;H#drO3WQ^*G9*Sj7m_@{*G<+7IS&AXT)4fx-Rw37V#baLM8ErWa@Q6rC4rGbj{n9O!;_-p?hhFa1WMZ0ZY<%ZG zwBE?5Pz%P?03tz)dx@Ux7u;P2g4=4oJ*@WD)~GA}V8u%_ zmX{96gGfSD3yE)|vV(ewYaPVz&BV5P2~e@BT7vn+V}&BjzhNW~^R7HpsS-g~GbU*W zmOP_;_+NP@+dEts`4RoCDyLCf^7x_ewVYLM-1U{rYfAP*$CNWZSeI4QlI4 z7COD>!O%YSberHpA91diaOjnUa>bc^5rZ$f`BrS%Cf2SL%lasqK=WLh{6UZ(5R!@r zG$clZREngswI^f@i9{k2ipbhQ<_GWsBu++IgQU@9HvuFz1g^e_P98!#wfit=E&LPj zk9-%JW;Z%g2#}QMF0=)k+@?n z4BH{74d^M_Tc0|gb$5!~1@c3Kh}as*EENz%0)ja}M01HdUBszYVt0dNYn?>dF9{3h zjO1aiXY!o%rs=VjlhZrY8Ti;2gHyv=txo*;LjJHDYm8Zw+1DbgON37Z5%CfQh9eix zX49=%=4Uu03=q=M!1OIo-+1&(-TS4UTuE5J_(*KQdiS)Otpne6h{rccR4T+{TX0`4T?OFpB1UN#k;CSU^kFG zG?{<|-~m_2Sy0Yi&G_md@(e+HY?0oID$tF;M4!zlnY1`(Se7_`G4IDCh{BXfRvx0~ zqUGOnp>ts7%Zdn;3_t=>#F`&o%kN+2cjRrr_oB*h5$C0#F0CQreBouw!po~`0uGC+ zA_r3sal=-2-kn){*-SAW&>>4ar+wJ>&}-4yi8e1pdfLsH^^4y~Z??e&HWp@IPIau}KH^J5_|j-TvDQ6J^Y_OWN;>v+N#?XjRI7$G zE~U$xNwAmo4})yf8H`$8Q0*~k#cou*1+mv4+F}$n8~N!=opca;&)@R^_kk@b4Y~{o zXeyw+1SAyW4+u_&&H;GPTP+3vROjWq`$04-b{icY%DaLH5|xx6V)e)o6^OtOi6pLxFu6m6Enne8c5p3 zdu-lxTwUHwDn5wRLoyy(RL(n#jvhigRwL87jA`VQOra#^`7G?O_LktelHw>yRf3dT z3T%kGgN2P}1XWx3dB*vkQ{>Ggm;(>>BBJsC1#$&PBx9rE9Tku+p7s-f#7G{zVkye| z9>_NbRF6k!xu#eiarh{b5hs7#FPrmQy_HXw&7&M*xyAnmRFp*{Ly|a`$a(WsY!#mzT(DI zaecC==9%bCsGz`oFvAv)+tG4Tz0A)_@&1bXx6BP@xPcS8a1q()Z9;5rMM_K3l>~1sFsv*Myv32TC^r7IOAcoIDGy)3g7`YA8z`hFZU99OY@!YW)CxlQ`nJiw42%O`PE>y zx2QT=SQdo8I@RN~y2)BAKg40Az5L40uePnrTedEL*(TQNpHsGl(1w#hIx-T2^SsS! zVt?S(-WT^oi93C{CDsk`YuI=7na`X^v;VI0S1^!KT@R;j_Mk0xPG9JpZgGoh8%iU$ zsY#pvW#xu@?$`S&mu{&r-&}6Ft^C}z*NWTJBO@<(;>5Z2Ripia#!II4SC^Iqof@`H kJ<{dhy25