Navbar.cpp 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. 
  2. #include "pch.h"
  3. #include "framework.h"
  4. #include "MainFrm.h"
  5. #include "NavBar.h"
  6. #include "Resource.h"
  7. #include "CTSManager.h"
  8. #include "Database.h"
  9. class CNvaBarMenuButton : public CMFCToolBarMenuButton
  10. {
  11. friend class CNavbar;
  12. DECLARE_SERIAL(CNvaBarMenuButton)
  13. public:
  14. CNvaBarMenuButton(HMENU hMenu = nullptr) noexcept : CMFCToolBarMenuButton((UINT)-1, hMenu, -1)
  15. {
  16. }
  17. virtual void OnDraw(CDC* pDC, const CRect& rect, CMFCToolBarImages* pImages, BOOL bHorz = TRUE,
  18. BOOL bCustomizeMode = FALSE, BOOL bHighlight = FALSE, BOOL bDrawBorder = TRUE, BOOL bGrayDisabledButtons = TRUE)
  19. {
  20. pImages = CMFCToolBar::GetImages();
  21. CAfxDrawState ds;
  22. pImages->PrepareDrawImage(ds);
  23. CMFCToolBarMenuButton::OnDraw(pDC, rect, pImages, bHorz, bCustomizeMode, bHighlight, bDrawBorder, bGrayDisabledButtons);
  24. pImages->EndDrawImage(ds);
  25. }
  26. };
  27. IMPLEMENT_SERIAL(CNvaBarMenuButton, CMFCToolBarMenuButton, 1)
  28. //////////////////////////////////////////////////////////////////////
  29. // 构造/析构
  30. //////////////////////////////////////////////////////////////////////
  31. CNavbar::CNavbar() noexcept
  32. {
  33. m_nCurrSort = ID_SORTING_GROUPBYTYPE;
  34. }
  35. CNavbar::~CNavbar()
  36. {
  37. }
  38. BEGIN_MESSAGE_MAP(CNavbar, CDockablePane)
  39. ON_WM_CREATE()
  40. ON_WM_SIZE()
  41. ON_WM_CONTEXTMENU()
  42. ON_COMMAND(ID_CLASS_ADD_MEMBER_FUNCTION, OnClassAddMemberFunction)
  43. ON_COMMAND(ID_CLASS_ADD_MEMBER_VARIABLE, OnClassAddMemberVariable)
  44. ON_COMMAND(ID_CLASS_DEFINITION, OnClassDefinition)
  45. ON_COMMAND(ID_CLASS_PROPERTIES, OnClassProperties)
  46. ON_COMMAND(ID_NEW_FOLDER, OnNewFolder)
  47. ON_WM_PAINT()
  48. ON_WM_SETFOCUS()
  49. ON_COMMAND_RANGE(ID_SORTING_GROUPBYTYPE, ID_SORTING_SORTBYACCESS, OnSort)
  50. ON_UPDATE_COMMAND_UI_RANGE(ID_SORTING_GROUPBYTYPE, ID_SORTING_SORTBYACCESS, OnUpdateSort)
  51. END_MESSAGE_MAP()
  52. /////////////////////////////////////////////////////////////////////////////
  53. // CNavbar 消息处理程序
  54. int CNavbar::OnCreate(LPCREATESTRUCT lpCreateStruct)
  55. {
  56. if (CDockablePane::OnCreate(lpCreateStruct) == -1)
  57. return -1;
  58. CRect rectDummy;
  59. rectDummy.SetRectEmpty();
  60. // 创建视图:
  61. const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
  62. // 加载图像:
  63. m_wndToolBar.Create(this, AFX_DEFAULT_TOOLBAR_STYLE, IDR_SORT);
  64. m_wndToolBar.LoadToolBar(IDR_SORT, 0, 0, TRUE /* 已锁定*/);
  65. OnChangeVisualStyle();
  66. m_wndToolBar.SetPaneStyle(m_wndToolBar.GetPaneStyle() | CBRS_TOOLTIPS | CBRS_FLYBY);
  67. m_wndToolBar.SetPaneStyle(m_wndToolBar.GetPaneStyle() & ~(CBRS_GRIPPER | CBRS_SIZE_DYNAMIC | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT));
  68. m_wndToolBar.SetOwner(this);
  69. // 所有命令将通过此控件路由,而不是通过主框架路由:
  70. m_wndToolBar.SetRouteCommandsViaFrame(FALSE);
  71. CMenu menuSort;
  72. menuSort.LoadMenu(IDR_POPUP_SORT);
  73. m_wndToolBar.ReplaceButton(ID_SORT_MENU, CNvaBarMenuButton(menuSort.GetSubMenu(0)->GetSafeHmenu()));
  74. CNvaBarMenuButton* pButton = DYNAMIC_DOWNCAST(CNvaBarMenuButton, m_wndToolBar.GetButton(0));
  75. if (pButton != nullptr)
  76. {
  77. pButton->m_bText = FALSE;
  78. pButton->m_bImage = TRUE;
  79. pButton->SetImage(GetCmdMgr()->GetCmdImage(m_nCurrSort));
  80. pButton->SetMessageWnd(this);
  81. }
  82. InitNavCtrl();
  83. return 0;
  84. }
  85. void CNavbar::OnSize(UINT nType, int cx, int cy)
  86. {
  87. CDockablePane::OnSize(nType, cx, cy);
  88. AdjustLayout();
  89. }
  90. void CNavbar::OnContextMenu(CWnd* pWnd, CPoint point)
  91. {
  92. CTreeCtrl* pWndTree = (CTreeCtrl*)&m_wndClassView;
  93. ASSERT_VALID(pWndTree);
  94. if (pWnd != pWndTree)
  95. {
  96. CDockablePane::OnContextMenu(pWnd, point);
  97. return;
  98. }
  99. if (point != CPoint(-1, -1))
  100. {
  101. // 选择已单击的项:
  102. CPoint ptTree = point;
  103. pWndTree->ScreenToClient(&ptTree);
  104. UINT flags = 0;
  105. HTREEITEM hTreeItem = pWndTree->HitTest(ptTree, &flags);
  106. if (hTreeItem != nullptr)
  107. {
  108. pWndTree->SelectItem(hTreeItem);
  109. }
  110. }
  111. pWndTree->SetFocus();
  112. CMenu menu;
  113. menu.LoadMenu(IDR_POPUP_SORT);
  114. CMenu* pSumMenu = menu.GetSubMenu(0);
  115. if (AfxGetMainWnd()->IsKindOf(RUNTIME_CLASS(CMDIFrameWndEx)))
  116. {
  117. CMFCPopupMenu* pPopupMenu = new CMFCPopupMenu;
  118. if (!pPopupMenu->Create(this, point.x, point.y, (HMENU)pSumMenu->m_hMenu, FALSE, TRUE))
  119. return;
  120. ((CMDIFrameWndEx*)AfxGetMainWnd())->OnShowPopupMenu(pPopupMenu);
  121. UpdateDialogControls(this, FALSE);
  122. }
  123. }
  124. void CNavbar::AdjustLayout()
  125. {
  126. if (GetSafeHwnd() == nullptr)
  127. {
  128. return;
  129. }
  130. CRect rectClient;
  131. GetClientRect(rectClient);
  132. int cyTlb = m_wndToolBar.CalcFixedLayout(FALSE, TRUE).cy;
  133. m_wndToolBar.SetWindowPos(nullptr, rectClient.left, rectClient.top, rectClient.Width(), cyTlb, SWP_NOACTIVATE | SWP_NOZORDER);
  134. m_DrawerCtrl.SetWindowPos(nullptr, rectClient.left + 1, rectClient.top + cyTlb + 1, rectClient.Width() - 2, rectClient.Height() - cyTlb - 2, SWP_NOACTIVATE | SWP_NOZORDER);
  135. }
  136. void CNavbar::InitNavCtrl()
  137. {
  138. TCHAR szPath[MAX_PATH] = { 0 };
  139. m_DrawerCtrl.Create(WS_VISIBLE | WS_CHILD, CRect(0, 23, 320, 500), this, 10000);
  140. _stprintf_s(szPath, _T("%sSkin\\DefaultTheme\\Bar.bmp"), Global::g_szCurModuleDir);
  141. m_DrawerCtrl.SetFolderImage(szPath);
  142. _stprintf_s(szPath, _T("%sSkin\\DefaultTheme\\icon\\Find.ico"), Global::g_szCurModuleDir);
  143. m_DrawerCtrl.SetSelIcon(szPath);
  144. m_listImage.Create(40, 40, ILC_MASK | ILC_COLOR32, 1, 1);
  145. CBitmap* pBitmap = new CBitmap;
  146. CString strHead;
  147. for (int i = 1;i <= 134;i++)
  148. {
  149. strHead.Format("%sSkin\\NEWFACE\\%d.bmp", Global::g_szCurModuleDir, i);
  150. pBitmap->m_hObject = (HBITMAP)LoadImage(NULL, strHead, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  151. m_listImage.Add(pBitmap, RGB(255, 255, 255)/*mask color*/);
  152. }
  153. delete pBitmap;
  154. //先创建ListCtrl (m_MyFriendListCtrl)
  155. if (m_NavQuarter.Create(LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_OWNERDRAWFIXED | LVS_SHOWSELALWAYS | WS_CHILD, CRect(0, 0, 0, 0), &m_DrawerCtrl, 50001))
  156. {
  157. m_NavQuarter.SetExtendedStyle(m_NavQuarter.GetExtendedStyle() | LVS_EX_FULLROWSELECT);
  158. m_NavQuarter.SetImageList(&m_listImage, LVSIL_SMALL);
  159. m_NavQuarter.InsertColumn(0, "季度", LVCFMT_LEFT);
  160. // 查询季度表;
  161. int i = 0;
  162. std::vector<STQuarter> vtQuarter;
  163. CDatabase::GetInstance()->QueryQuarter(vtQuarter);
  164. for ( std::vector<STQuarter>::iterator it = vtQuarter.begin(); it != vtQuarter.end(); it++ )
  165. {
  166. LUSERITEM userInfo = { 0 };
  167. userInfo.szNoticeMsg = _T("季度品牌");
  168. m_NavQuarter.InsertItem(i, it->name.c_str(), i, &userInfo);//第三个参数 Index of the ImageList
  169. i++;
  170. }
  171. }
  172. if (m_NavOthers.Create(LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_OWNERDRAWFIXED | LVS_SHOWSELALWAYS | WS_CHILD, CRect(0, 0, 0, 0), &m_DrawerCtrl, 50002))
  173. {
  174. m_NavOthers.SetExtendedStyle(m_NavOthers.GetExtendedStyle() | LVS_EX_FULLROWSELECT);
  175. m_NavOthers.SetImageList(&m_listImage, LVSIL_SMALL);
  176. m_NavOthers.InsertColumn(0, "名字", LVCFMT_LEFT);
  177. CString strTemp = _T("");
  178. LUSERITEM userInfo = { 0 };
  179. userInfo.szUserID = strTemp.GetBuffer(strTemp.GetLength());
  180. strTemp.ReleaseBuffer();
  181. userInfo.szNoticeMsg = _T("RTK2851!");
  182. m_NavOthers.InsertItem(0, _T("机芯"), 0, &userInfo);
  183. m_NavOthers.InsertItem(1, _T("品牌"), 0, &userInfo);
  184. m_NavOthers.InsertItem(2, _T("分支"), 1, &userInfo);
  185. m_NavOthers.InsertItem(3, _T("日志"), 3, &userInfo);
  186. }
  187. m_DrawerCtrl.AddFolderBar(_T("季度"), &m_NavQuarter, 0);
  188. m_DrawerCtrl.AddFolderBar(_T("其他"), &m_NavOthers, 0);// 品牌\分支\日志
  189. m_DrawerCtrl.SetSelFolder(0);
  190. //m_DrawerCtrl.SetAutoFolder();
  191. }
  192. BOOL CNavbar::PreTranslateMessage(MSG* pMsg)
  193. {
  194. return CDockablePane::PreTranslateMessage(pMsg);
  195. }
  196. void CNavbar::OnSort(UINT id)
  197. {
  198. if (m_nCurrSort == id)
  199. {
  200. return;
  201. }
  202. m_nCurrSort = id;
  203. CNvaBarMenuButton* pButton = DYNAMIC_DOWNCAST(CNvaBarMenuButton, m_wndToolBar.GetButton(0));
  204. if (pButton != nullptr)
  205. {
  206. pButton->SetImage(GetCmdMgr()->GetCmdImage(id));
  207. m_wndToolBar.Invalidate();
  208. m_wndToolBar.UpdateWindow();
  209. }
  210. }
  211. void CNavbar::OnUpdateSort(CCmdUI* pCmdUI)
  212. {
  213. pCmdUI->SetCheck(pCmdUI->m_nID == m_nCurrSort);
  214. }
  215. void CNavbar::OnClassAddMemberFunction()
  216. {
  217. AfxMessageBox(_T("添加成员函数..."));
  218. }
  219. void CNavbar::OnClassAddMemberVariable()
  220. {
  221. // TODO: 在此处添加命令处理程序代码
  222. }
  223. void CNavbar::OnClassDefinition()
  224. {
  225. // TODO: 在此处添加命令处理程序代码
  226. }
  227. void CNavbar::OnClassProperties()
  228. {
  229. // TODO: 在此处添加命令处理程序代码
  230. }
  231. void CNavbar::OnNewFolder()
  232. {
  233. AfxMessageBox(_T("新建文件夹..."));
  234. }
  235. void CNavbar::OnPaint()
  236. {
  237. CPaintDC dc(this); // 用于绘制的设备上下文
  238. #if 1
  239. CRect rectTree;
  240. m_DrawerCtrl.GetWindowRect(rectTree);
  241. ScreenToClient(rectTree);
  242. rectTree.InflateRect(1, 1);
  243. dc.Draw3dRect(rectTree, ::GetSysColor(COLOR_3DSHADOW), ::GetSysColor(COLOR_3DSHADOW));
  244. #else
  245. // 如果CDockablePane无控件,改变大小时背景会刷新失败;
  246. // 所以要重载onpaint;
  247. CRect rc;
  248. GetClientRect(rc);
  249. CBrush brush;
  250. brush.CreateSolidBrush(CMFCVisualManager::GetInstance()->GetToolbarHighlightColor());
  251. dc.FillRect(&rc, &brush);
  252. #endif
  253. }
  254. void CNavbar::OnSetFocus(CWnd* pOldWnd)
  255. {
  256. CDockablePane::OnSetFocus(pOldWnd);
  257. //m_wndClassView.SetFocus();
  258. }
  259. void CNavbar::OnChangeVisualStyle()
  260. {
  261. UINT uiBmpId = theApp.m_bHiColorIcons ? IDB_CLASS_VIEW_24 : IDB_CLASS_VIEW;
  262. CBitmap bmp;
  263. if (!bmp.LoadBitmap(uiBmpId))
  264. {
  265. TRACE(_T("无法加载位图: %x\n"), uiBmpId);
  266. ASSERT(FALSE);
  267. return;
  268. }
  269. BITMAP bmpObj;
  270. bmp.GetBitmap(&bmpObj);
  271. UINT nFlags = ILC_MASK;
  272. nFlags |= (theApp.m_bHiColorIcons) ? ILC_COLOR24 : ILC_COLOR4;
  273. m_wndToolBar.CleanUpLockedImages();
  274. m_wndToolBar.LoadBitmap(theApp.m_bHiColorIcons ? IDB_SORT_24 : IDR_SORT, 0, 0, TRUE /* 锁定*/);
  275. }