123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356 |
-
- #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<STQuarter> vtQuarter;
- CDatabase::GetInstance()->QueryQuarter(vtQuarter);
- for ( std::vector<STQuarter>::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);
- }
|