QuakeGod
2022-07-22 dd67df95a7303aee3bed65ffa935465f20ee8b32
提交 | 用户 | age
0ed438 1 
Q 2 #include "pch.h"
3 #include "framework.h"
4 #include "MainFrm.h"
5 #include "ClassView.h"
6 #include "Resource.h"
7 #include "MTerm1.h"
8
9 class CClassViewMenuButton : public CMFCToolBarMenuButton
10 {
11     friend class CClassView;
12
13     DECLARE_SERIAL(CClassViewMenuButton)
14
15 public:
16     CClassViewMenuButton(HMENU hMenu = nullptr) noexcept : CMFCToolBarMenuButton((UINT)-1, hMenu, -1)
17     {
18     }
19
20     virtual void OnDraw(CDC* pDC, const CRect& rect, CMFCToolBarImages* pImages, BOOL bHorz = TRUE,
21         BOOL bCustomizeMode = FALSE, BOOL bHighlight = FALSE, BOOL bDrawBorder = TRUE, BOOL bGrayDisabledButtons = TRUE)
22     {
23         pImages = CMFCToolBar::GetImages();
24
25         CAfxDrawState ds;
26         pImages->PrepareDrawImage(ds);
27
28         CMFCToolBarMenuButton::OnDraw(pDC, rect, pImages, bHorz, bCustomizeMode, bHighlight, bDrawBorder, bGrayDisabledButtons);
29
30         pImages->EndDrawImage(ds);
31     }
32 };
33
34 IMPLEMENT_SERIAL(CClassViewMenuButton, CMFCToolBarMenuButton, 1)
35
36 //////////////////////////////////////////////////////////////////////
37 // 构造/析构
38 //////////////////////////////////////////////////////////////////////
39
40 CClassView::CClassView() noexcept
41 {
42     m_nCurrSort = ID_SORTING_GROUPBYTYPE;
43 }
44
45 CClassView::~CClassView()
46 {
47 }
48
49 BEGIN_MESSAGE_MAP(CClassView, CDockablePane)
50     ON_WM_CREATE()
51     ON_WM_SIZE()
52     ON_WM_CONTEXTMENU()
53     ON_COMMAND(ID_CLASS_ADD_MEMBER_FUNCTION, OnClassAddMemberFunction)
54     ON_COMMAND(ID_CLASS_ADD_MEMBER_VARIABLE, OnClassAddMemberVariable)
55     ON_COMMAND(ID_CLASS_DEFINITION, OnClassDefinition)
56     ON_COMMAND(ID_CLASS_PROPERTIES, OnClassProperties)
57     ON_COMMAND(ID_NEW_FOLDER, OnNewFolder)
58     ON_WM_PAINT()
59     ON_WM_SETFOCUS()
60     ON_COMMAND_RANGE(ID_SORTING_GROUPBYTYPE, ID_SORTING_SORTBYACCESS, OnSort)
61     ON_UPDATE_COMMAND_UI_RANGE(ID_SORTING_GROUPBYTYPE, ID_SORTING_SORTBYACCESS, OnUpdateSort)
62 END_MESSAGE_MAP()
63
64 /////////////////////////////////////////////////////////////////////////////
65 // CClassView 消息处理程序
66
67 int CClassView::OnCreate(LPCREATESTRUCT lpCreateStruct)
68 {
69     if (CDockablePane::OnCreate(lpCreateStruct) == -1)
70         return -1;
71
72     CRect rectDummy;
73     rectDummy.SetRectEmpty();
74
75     // 创建视图: 
76     const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
77
78     if (!m_wndClassView.Create(dwViewStyle, rectDummy, this, 2))
79     {
80         TRACE0("未能创建类视图\n");
81         return -1;      // 未能创建
82     }
83
84     // 加载图像: 
85     m_wndToolBar.Create(this, AFX_DEFAULT_TOOLBAR_STYLE, IDR_SORT);
86     m_wndToolBar.LoadToolBar(IDR_SORT, 0, 0, TRUE /* 已锁定*/);
87
88     OnChangeVisualStyle();
89
90     m_wndToolBar.SetPaneStyle(m_wndToolBar.GetPaneStyle() | CBRS_TOOLTIPS | CBRS_FLYBY);
91     m_wndToolBar.SetPaneStyle(m_wndToolBar.GetPaneStyle() & ~(CBRS_GRIPPER | CBRS_SIZE_DYNAMIC | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT));
92
93     m_wndToolBar.SetOwner(this);
94
95     // 所有命令将通过此控件路由,而不是通过主框架路由: 
96     m_wndToolBar.SetRouteCommandsViaFrame(FALSE);
97
98     CMenu menuSort;
99     menuSort.LoadMenu(IDR_POPUP_SORT);
100
101     m_wndToolBar.ReplaceButton(ID_SORT_MENU, CClassViewMenuButton(menuSort.GetSubMenu(0)->GetSafeHmenu()));
102
103     CClassViewMenuButton* pButton =  DYNAMIC_DOWNCAST(CClassViewMenuButton, m_wndToolBar.GetButton(0));
104
105     if (pButton != nullptr)
106     {
107         pButton->m_bText = FALSE;
108         pButton->m_bImage = TRUE;
109         pButton->SetImage(GetCmdMgr()->GetCmdImage(m_nCurrSort));
110         pButton->SetMessageWnd(this);
111     }
112
113     // 填入一些静态树视图数据(此处只需填入虚拟代码,而不是复杂的数据)
114     FillClassView();
115
116     return 0;
117 }
118
119 void CClassView::OnSize(UINT nType, int cx, int cy)
120 {
121     CDockablePane::OnSize(nType, cx, cy);
122     AdjustLayout();
123 }
124
125 void CClassView::FillClassView()
126 {
127     HTREEITEM hRoot = m_wndClassView.InsertItem(_T("FakeApp 类"), 0, 0);
128     m_wndClassView.SetItemState(hRoot, TVIS_BOLD, TVIS_BOLD);
129
130     HTREEITEM hClass = m_wndClassView.InsertItem(_T("CFakeAboutDlg"), 1, 1, hRoot);
131     m_wndClassView.InsertItem(_T("CFakeAboutDlg()"), 3, 3, hClass);
132
133     m_wndClassView.Expand(hRoot, TVE_EXPAND);
134
135     hClass = m_wndClassView.InsertItem(_T("CFakeApp"), 1, 1, hRoot);
136     m_wndClassView.InsertItem(_T("CFakeApp()"), 3, 3, hClass);
137     m_wndClassView.InsertItem(_T("InitInstance()"), 3, 3, hClass);
138     m_wndClassView.InsertItem(_T("OnAppAbout()"), 3, 3, hClass);
139
140     hClass = m_wndClassView.InsertItem(_T("CFakeAppDoc"), 1, 1, hRoot);
141     m_wndClassView.InsertItem(_T("CFakeAppDoc()"), 4, 4, hClass);
142     m_wndClassView.InsertItem(_T("~CFakeAppDoc()"), 3, 3, hClass);
143     m_wndClassView.InsertItem(_T("OnNewDocument()"), 3, 3, hClass);
144
145     hClass = m_wndClassView.InsertItem(_T("CFakeAppView"), 1, 1, hRoot);
146     m_wndClassView.InsertItem(_T("CFakeAppView()"), 4, 4, hClass);
147     m_wndClassView.InsertItem(_T("~CFakeAppView()"), 3, 3, hClass);
148     m_wndClassView.InsertItem(_T("GetDocument()"), 3, 3, hClass);
149     m_wndClassView.Expand(hClass, TVE_EXPAND);
150
151     hClass = m_wndClassView.InsertItem(_T("CFakeAppFrame"), 1, 1, hRoot);
152     m_wndClassView.InsertItem(_T("CFakeAppFrame()"), 3, 3, hClass);
153     m_wndClassView.InsertItem(_T("~CFakeAppFrame()"), 3, 3, hClass);
154     m_wndClassView.InsertItem(_T("m_wndMenuBar"), 6, 6, hClass);
155     m_wndClassView.InsertItem(_T("m_wndToolBar"), 6, 6, hClass);
156     m_wndClassView.InsertItem(_T("m_wndStatusBar"), 6, 6, hClass);
157
158     hClass = m_wndClassView.InsertItem(_T("Globals"), 2, 2, hRoot);
159     m_wndClassView.InsertItem(_T("theFakeApp"), 5, 5, hClass);
160     m_wndClassView.Expand(hClass, TVE_EXPAND);
161 }
162
163 void CClassView::OnContextMenu(CWnd* pWnd, CPoint point)
164 {
165     CTreeCtrl* pWndTree = (CTreeCtrl*)&m_wndClassView;
166     ASSERT_VALID(pWndTree);
167
168     if (pWnd != pWndTree)
169     {
170         CDockablePane::OnContextMenu(pWnd, point);
171         return;
172     }
173
174     if (point != CPoint(-1, -1))
175     {
176         // 选择已单击的项: 
177         CPoint ptTree = point;
178         pWndTree->ScreenToClient(&ptTree);
179
180         UINT flags = 0;
181         HTREEITEM hTreeItem = pWndTree->HitTest(ptTree, &flags);
182         if (hTreeItem != nullptr)
183         {
184             pWndTree->SelectItem(hTreeItem);
185         }
186     }
187
188     pWndTree->SetFocus();
189     CMenu menu;
190     menu.LoadMenu(IDR_POPUP_SORT);
191
192     CMenu* pSumMenu = menu.GetSubMenu(0);
193
194     if (AfxGetMainWnd()->IsKindOf(RUNTIME_CLASS(CMDIFrameWndEx)))
195     {
196         CMFCPopupMenu* pPopupMenu = new CMFCPopupMenu;
197
198         if (!pPopupMenu->Create(this, point.x, point.y, (HMENU)pSumMenu->m_hMenu, FALSE, TRUE))
199             return;
200
201         ((CMDIFrameWndEx*)AfxGetMainWnd())->OnShowPopupMenu(pPopupMenu);
202         UpdateDialogControls(this, FALSE);
203     }
204 }
205
206 void CClassView::AdjustLayout()
207 {
208     if (GetSafeHwnd() == nullptr)
209     {
210         return;
211     }
212
213     CRect rectClient;
214     GetClientRect(rectClient);
215
216     int cyTlb = m_wndToolBar.CalcFixedLayout(FALSE, TRUE).cy;
217
218     m_wndToolBar.SetWindowPos(nullptr, rectClient.left, rectClient.top, rectClient.Width(), cyTlb, SWP_NOACTIVATE | SWP_NOZORDER);
219     m_wndClassView.SetWindowPos(nullptr, rectClient.left + 1, rectClient.top + cyTlb + 1, rectClient.Width() - 2, rectClient.Height() - cyTlb - 2, SWP_NOACTIVATE | SWP_NOZORDER);
220 }
221
222 BOOL CClassView::PreTranslateMessage(MSG* pMsg)
223 {
224     return CDockablePane::PreTranslateMessage(pMsg);
225 }
226
227 void CClassView::OnSort(UINT id)
228 {
229     if (m_nCurrSort == id)
230     {
231         return;
232     }
233
234     m_nCurrSort = id;
235
236     CClassViewMenuButton* pButton =  DYNAMIC_DOWNCAST(CClassViewMenuButton, m_wndToolBar.GetButton(0));
237
238     if (pButton != nullptr)
239     {
240         pButton->SetImage(GetCmdMgr()->GetCmdImage(id));
241         m_wndToolBar.Invalidate();
242         m_wndToolBar.UpdateWindow();
243     }
244 }
245
246 void CClassView::OnUpdateSort(CCmdUI* pCmdUI)
247 {
248     pCmdUI->SetCheck(pCmdUI->m_nID == m_nCurrSort);
249 }
250
251 void CClassView::OnClassAddMemberFunction()
252 {
253     AfxMessageBox(_T("添加成员函数..."));
254 }
255
256 void CClassView::OnClassAddMemberVariable()
257 {
258     // TODO: 在此处添加命令处理程序代码
259 }
260
261 void CClassView::OnClassDefinition()
262 {
263     // TODO: 在此处添加命令处理程序代码
264 }
265
266 void CClassView::OnClassProperties()
267 {
268     // TODO: 在此处添加命令处理程序代码
269 }
270
271 void CClassView::OnNewFolder()
272 {
273     AfxMessageBox(_T("新建文件夹..."));
274 }
275
276 void CClassView::OnPaint()
277 {
278     CPaintDC dc(this); // 用于绘制的设备上下文
279
280     CRect rectTree;
281     m_wndClassView.GetWindowRect(rectTree);
282     ScreenToClient(rectTree);
283
284     rectTree.InflateRect(1, 1);
285     dc.Draw3dRect(rectTree, ::GetSysColor(COLOR_3DSHADOW), ::GetSysColor(COLOR_3DSHADOW));
286 }
287
288 void CClassView::OnSetFocus(CWnd* pOldWnd)
289 {
290     CDockablePane::OnSetFocus(pOldWnd);
291
292     m_wndClassView.SetFocus();
293 }
294
295 void CClassView::OnChangeVisualStyle()
296 {
297     m_ClassViewImages.DeleteImageList();
298
299     UINT uiBmpId = theApp.m_bHiColorIcons ? IDB_CLASS_VIEW_24 : IDB_CLASS_VIEW;
300
301     CBitmap bmp;
302     if (!bmp.LoadBitmap(uiBmpId))
303     {
304         TRACE(_T("无法加载位图: %x\n"), uiBmpId);
305         ASSERT(FALSE);
306         return;
307     }
308
309     BITMAP bmpObj;
310     bmp.GetBitmap(&bmpObj);
311
312     UINT nFlags = ILC_MASK;
313
314     nFlags |= (theApp.m_bHiColorIcons) ? ILC_COLOR24 : ILC_COLOR4;
315
316     m_ClassViewImages.Create(16, bmpObj.bmHeight, nFlags, 0, 0);
317     m_ClassViewImages.Add(&bmp, RGB(255, 0, 0));
318
319     m_wndClassView.SetImageList(&m_ClassViewImages, TVSIL_NORMAL);
320
321     m_wndToolBar.CleanUpLockedImages();
322     m_wndToolBar.LoadBitmap(theApp.m_bHiColorIcons ? IDB_SORT_24 : IDR_SORT, 0, 0, TRUE /* 锁定*/);
323 }