#include "pch.h" #include "framework.h" #include "MainFrm.h" #include "NavBar.h" #include "Resource.h" #include "CTSManager.h" #include "Database.h" class CNvaBarMenuButton : public CMFCToolBarMenuButton { friend class CNavbar; DECLARE_SERIAL(CNvaBarMenuButton) public: CNvaBarMenuButton(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(CNvaBarMenuButton, CMFCToolBarMenuButton, 1) ////////////////////////////////////////////////////////////////////// // 构造/析构 ////////////////////////////////////////////////////////////////////// CNavbar::CNavbar() noexcept { m_nCurrSort = ID_SORTING_GROUPBYTYPE; } CNavbar::~CNavbar() { } BEGIN_MESSAGE_MAP(CNavbar, 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) ON_WM_ERASEBKGND() END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CNavbar 消息处理程序 int CNavbar::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; // 加载图像: 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, CNvaBarMenuButton(menuSort.GetSubMenu(0)->GetSafeHmenu())); CNvaBarMenuButton* pButton = DYNAMIC_DOWNCAST(CNvaBarMenuButton, m_wndToolBar.GetButton(0)); if (pButton != nullptr) { pButton->m_bText = FALSE; pButton->m_bImage = TRUE; pButton->SetImage(GetCmdMgr()->GetCmdImage(m_nCurrSort)); pButton->SetMessageWnd(this); } InitNavCtrl(); return 0; } void CNavbar::OnSize(UINT nType, int cx, int cy) { CDockablePane::OnSize(nType, cx, cy); AdjustLayout(); } void CNavbar::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 CNavbar::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_DrawerCtrl.SetWindowPos(nullptr, rectClient.left + 1, rectClient.top + cyTlb + 1, rectClient.Width() - 2, rectClient.Height() - cyTlb - 2, SWP_NOACTIVATE | SWP_NOZORDER); } void CNavbar::InitNavCtrl() { TCHAR szPath[MAX_PATH] = { 0 }; m_DrawerCtrl.Create(WS_VISIBLE | WS_CHILD, CRect(0, 23, 320, 500), this, 10000); _stprintf_s(szPath, _T("%sSkin\\DefaultTheme\\Bar.bmp"), Global::g_szCurModuleDir); m_DrawerCtrl.SetFolderImage(szPath); _stprintf_s(szPath, _T("%sSkin\\DefaultTheme\\icon\\Find.ico"), Global::g_szCurModuleDir); m_DrawerCtrl.SetSelIcon(szPath); m_listImage.Create(40, 40, ILC_MASK | ILC_COLOR32, 1, 1); CBitmap* pBitmap = new CBitmap; CString strHead; for (int i = 1;i <= 134;i++) { strHead.Format("%sSkin\\NEWFACE\\%d.bmp", Global::g_szCurModuleDir, i); pBitmap->m_hObject = (HBITMAP)LoadImage(NULL, strHead, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); m_listImage.Add(pBitmap, RGB(255, 255, 255)/*mask color*/); } delete pBitmap; //先创建ListCtrl (m_MyFriendListCtrl) if (m_NavQuarter.Create(LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_OWNERDRAWFIXED | LVS_SHOWSELALWAYS | WS_CHILD, CRect(0, 0, 0, 0), &m_DrawerCtrl, 50001)) { m_NavQuarter.SetExtendedStyle(m_NavQuarter.GetExtendedStyle() | LVS_EX_FULLROWSELECT); m_NavQuarter.SetImageList(&m_listImage, LVSIL_SMALL); m_NavQuarter.InsertColumn(0, "季度", LVCFMT_LEFT); // 查询季度表; int i = 0; std::vector vtQuarter; CDatabase::GetInstance()->QueryQuarter(vtQuarter); for ( std::vector::iterator it = vtQuarter.begin(); it != vtQuarter.end(); it++ ) { LUSERITEM userInfo = { 0 }; userInfo.szNoticeMsg = _T("季度品牌"); m_NavQuarter.InsertItem(i, it->name.c_str(), i, &userInfo);//第三个参数 Index of the ImageList i++; } } if (m_NavOthers.Create(LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_OWNERDRAWFIXED | LVS_SHOWSELALWAYS | WS_CHILD, CRect(0, 0, 0, 0), &m_DrawerCtrl, 50002)) { m_NavOthers.SetExtendedStyle(m_NavOthers.GetExtendedStyle() | LVS_EX_FULLROWSELECT); m_NavOthers.SetImageList(&m_listImage, LVSIL_SMALL); m_NavOthers.InsertColumn(0, "名字", LVCFMT_LEFT); CString strTemp = _T(""); LUSERITEM userInfo = { 0 }; userInfo.szUserID = strTemp.GetBuffer(strTemp.GetLength()); strTemp.ReleaseBuffer(); userInfo.szNoticeMsg = _T("RTK2851!"); m_NavOthers.InsertItem(0, _T("机芯"), 0, &userInfo); m_NavOthers.InsertItem(1, _T("品牌"), 0, &userInfo); m_NavOthers.InsertItem(2, _T("分支"), 1, &userInfo); m_NavOthers.InsertItem(3, _T("日志"), 3, &userInfo); } m_DrawerCtrl.AddFolderBar(_T("季度"), &m_NavQuarter, 0); m_DrawerCtrl.AddFolderBar(_T("其他"), &m_NavOthers, 0);// 品牌\分支\日志 m_DrawerCtrl.SetSelFolder(0); //m_DrawerCtrl.SetAutoFolder(); } BOOL CNavbar::PreTranslateMessage(MSG* pMsg) { return CDockablePane::PreTranslateMessage(pMsg); } void CNavbar::OnSort(UINT id) { if (m_nCurrSort == id) { return; } m_nCurrSort = id; CNvaBarMenuButton* pButton = DYNAMIC_DOWNCAST(CNvaBarMenuButton, m_wndToolBar.GetButton(0)); if (pButton != nullptr) { pButton->SetImage(GetCmdMgr()->GetCmdImage(id)); m_wndToolBar.Invalidate(); m_wndToolBar.UpdateWindow(); } } void CNavbar::OnUpdateSort(CCmdUI* pCmdUI) { pCmdUI->SetCheck(pCmdUI->m_nID == m_nCurrSort); } void CNavbar::OnClassAddMemberFunction() { AfxMessageBox(_T("添加成员函数...")); } void CNavbar::OnClassAddMemberVariable() { // TODO: 在此处添加命令处理程序代码 } void CNavbar::OnClassDefinition() { // TODO: 在此处添加命令处理程序代码 } void CNavbar::OnClassProperties() { // TODO: 在此处添加命令处理程序代码 } void CNavbar::OnNewFolder() { AfxMessageBox(_T("新建文件夹...")); } void CNavbar::OnPaint() { CPaintDC dc(this); // 用于绘制的设备上下文 #if 1 CRect rectTree; m_DrawerCtrl.GetWindowRect(rectTree); ScreenToClient(rectTree); rectTree.InflateRect(1, 1); dc.Draw3dRect(rectTree, ::GetSysColor(COLOR_3DSHADOW), ::GetSysColor(COLOR_3DSHADOW)); #else // 如果CDockablePane无控件,改变大小时背景会刷新失败; // 所以要重载onpaint; CRect rc; GetClientRect(rc); CBrush brush; brush.CreateSolidBrush(CMFCVisualManager::GetInstance()->GetToolbarHighlightColor()); dc.FillRect(&rc, &brush); #endif } void CNavbar::OnSetFocus(CWnd* pOldWnd) { CDockablePane::OnSetFocus(pOldWnd); //m_wndClassView.SetFocus(); } void CNavbar::OnChangeVisualStyle() { 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_wndToolBar.CleanUpLockedImages(); m_wndToolBar.LoadBitmap(theApp.m_bHiColorIcons ? IDB_SORT_24 : IDR_SORT, 0, 0, TRUE /* 锁定*/); } BOOL CNavbar::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息处理程序代码和/或调用默认值 return TRUE; // 抽屉还是会偶尔显示不出来:建议右键->属性->兼容性:xp 3方式运行程序; //return CDockablePane::OnEraseBkgnd(pDC); }