Navbar.cpp 9.6 KB

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