浏览代码

1、NavBar中不能绑定m_NavQuarter和m_NavOthers两个控件的单击事件,因为NavBar不是这2控件的父窗口;只能由DrawerCtrl来绑定单击事件;
2、CChildFrameList全部接口静态化;
3、FormView切换时会闪烁,在ChildFrame中改变cs.style属性能有效解决闪烁问题;

sat23 4 年之前
父节点
当前提交
6679436297

+ 3 - 1
CTSManager/CTSManager/ChildFrameList.cpp

@@ -1,4 +1,6 @@
 #include "pch.h"
 #include "ChildFrameList.h"
 
-void* CChildFrameList::m_pChildViewHead = NULL;
+CDocument* CChildFrameList::m_pCurrentDoc = NULL;
+CFrameWnd* CChildFrameList::m_pCurrentFrame = NULL;
+TABVIEW* CChildFrameList::m_pChildViewHead = NULL;

+ 43 - 40
CTSManager/CTSManager/ChildFrameList.h

@@ -2,39 +2,39 @@
 
 #include "ChildFrm.h"
 
+typedef struct _TabView_ {
+	// 窗口名称;
+	TCHAR szName[MAX_PATH] = { 0 };
+	// 窗口句柄;
+	CWnd* pViewWnd = NULL;
+	// 下一个窗口;
+	_TabView_* pNextTab = NULL;
+}TABVIEW, * pTABVIEW;
+
 class CChildFrameList
 {
-	CDocument* m_pCurrentDoc;
-	CFrameWnd* m_pCurrentFrame;
+	// Template创建的Doc;
+	static CDocument* m_pCurrentDoc;
+	// MainFrame对象;
+	static CFrameWnd* m_pCurrentFrame;
 public:
-	CChildFrameList(CFrameWnd* pFrameWnd) {
-		m_pCurrentFrame = pFrameWnd;
-		m_pChildViewHead = NULL;
-	};
-
+	CChildFrameList() { };
 	virtual ~CChildFrameList() {};
 
-	typedef struct _TabView_ {
-		// 窗口名称;
-		TCHAR szName[MAX_PATH] = { 0 };
-		// 窗口句柄;
-		CWnd* pViewWnd = NULL;
-		// 下一个窗口;
-		_TabView_* pNextTab = NULL;
-	}TABVIEW, * pTABVIEW;
-
-	static void* m_pChildViewHead;
+	// 队列头指针;
+	static TABVIEW* m_pChildViewHead;
 
 public:
-	void SetDoc(CDocument* pDoc) { m_pCurrentDoc = pDoc; };
+	// 初始化;
+	inline static void Init(CFrameWnd* pCurrentFrame, CDocument* pDoc) { m_pCurrentFrame = pCurrentFrame;m_pCurrentDoc = pDoc; };
 
 	// 获取视图名称;
-	TCHAR* GetViewName(const CWnd* pViewWnd) const
+	static TCHAR* GetViewName(const CWnd* pViewWnd)
 	{
 		if (!pViewWnd || !m_pChildViewHead)
 			return NULL;
 
-		TABVIEW* pTabView = (TABVIEW*)m_pChildViewHead;
+		TABVIEW* pTabView = m_pChildViewHead;
 		do
 		{
 			if (pViewWnd == pTabView->pViewWnd)
@@ -46,12 +46,12 @@ public:
 	}
 
 	// 获取视图窗口句柄;
-	CWnd* GetViewWnd(const TCHAR* pViewName)
+	static CWnd* GetViewWnd(const TCHAR* pViewName)
 	{
 		if (!pViewName || !m_pChildViewHead)
 			return NULL;
 
-		TABVIEW* pTabView = (TABVIEW*)m_pChildViewHead;
+		TABVIEW* pTabView = m_pChildViewHead;
 		do
 		{
 			// 注意如果是中文比较,该函数是否会有问题;
@@ -64,7 +64,7 @@ public:
 	}
 
 	// 添加新的视图窗口;
-	void AppendView(const TCHAR* pszViewName, CRuntimeClass* pNewViewClass, UINT nIcon, UINT nID)
+	static void AppendView(const TCHAR* pszViewName, CRuntimeClass* pNewViewClass, UINT nIcon, UINT nID)
 	{
 		CChildFrame* pViewWnd = (CChildFrame*)GetViewWnd(pszViewName);
 		// 已存在;
@@ -90,7 +90,7 @@ public:
 			context.m_pNewViewClass = pNewViewClass;
 			context.m_pNewDocTemplate = m_pCurrentDoc->GetDocTemplate();
 
-			if (!pViewWnd->LoadFrame(nID, WS_CHILDWINDOW, m_pCurrentFrame, &context)) {
+			if (!pViewWnd->LoadFrame(nID, WS_MAXIMIZEBOX | WS_CHILDWINDOW, m_pCurrentFrame, &context)) {
 				delete pViewWnd;
 				return;
 			}
@@ -98,19 +98,20 @@ public:
 			pNewView->pViewWnd = (CWnd*)pViewWnd;
 			memcpy(pNewView->szName, pszViewName, MAX_PATH);
 			pNewView->pNextTab = (TABVIEW*)m_pChildViewHead;
-			m_pChildViewHead = (void*)pNewView;
+			m_pChildViewHead = pNewView;
 			pViewWnd->InitialUpdateFrame(NULL, true);  //真正创建
-			pViewWnd->ShowWindow(SW_MAXIMIZE);
+			//pViewWnd->ShowWindow(SW_MAXIMIZE);
+			//pViewWnd->MDIMaximize();
 		}
 	}
 
-	void CloseView(const TCHAR* pszViewName)
+	static void CloseView(const TCHAR* pszViewName)
 	{
 		if (!pszViewName || !m_pChildViewHead)
 			return;
 
 		// 查找视图;
-		TABVIEW* pLastTab = NULL, * pTabView = (TABVIEW*)m_pChildViewHead;
+		TABVIEW* pLastTab = NULL, * pTabView = m_pChildViewHead;
 		do
 		{
 			if (_tcsicmp(pTabView->szName, pszViewName) == 0) {
@@ -128,13 +129,13 @@ public:
 		} while (pTabView);
 	}
 
-	void CloseView(CWnd* pViewWnd)
+	static void CloseView(CWnd* pViewWnd)
 	{
 		if (!pViewWnd || !m_pChildViewHead)
 			return;
 
 		// 查找视图;
-		TABVIEW* pLastTab = NULL, * pTabView = (TABVIEW*)m_pChildViewHead;
+		TABVIEW* pLastTab = NULL, * pTabView = m_pChildViewHead;
 		do
 		{
 			if (pTabView->pViewWnd == pViewWnd) {
@@ -153,36 +154,38 @@ public:
 
 	}
 
-	void CloseAllView()
+	static void CloseAllView()
 	{
 		if (!m_pChildViewHead)
 			return;
 
-		TABVIEW* pTabView = (TABVIEW*)m_pChildViewHead;
+		TABVIEW* pLastTab = NULL, * pTabView = m_pChildViewHead;
 		do
 		{
+			pLastTab = pTabView;
 			pTabView->pViewWnd->SendMessage(WM_CLOSE);
 			m_pChildViewHead = pTabView->pNextTab;
-			// 删除对象;
-			delete pTabView; pTabView = NULL;
 			pTabView = pTabView->pNextTab;
+			// 删除对象;
+			delete pLastTab; pLastTab = NULL;
 		} while (pTabView);
 	}
 
-	BOOL SwitchView(const TCHAR* pszViewName)
+	static BOOL SwitchView(const TCHAR* pszViewName)
 	{
 		if (!pszViewName || !m_pChildViewHead)
 			return FALSE;
 
-		// 隐藏当前活动视图;
 		CWnd* pActiveWnd = m_pCurrentFrame->GetActiveFrame();
-		if (pActiveWnd)
-			pActiveWnd->ShowWindow(SW_HIDE);
-
 		// 是否已存在该视图;
 		CChildFrame* pViewWnd = (CChildFrame*)GetViewWnd(pszViewName);
 		// 已存在;
-		if (pViewWnd) {
+		if (pViewWnd && pActiveWnd != pViewWnd) {
+			// 隐藏上一个活动视图;
+			if (pActiveWnd)
+				pActiveWnd->ShowWindow(SW_HIDE);
+
+			pViewWnd->ShowWindow(SW_MAXIMIZE);
 			pViewWnd->MDIActivate();
 			return TRUE;
 		}

+ 5 - 2
CTSManager/CTSManager/ChildFrm.cpp

@@ -37,8 +37,11 @@ BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
 	if( !CMDIChildWndEx::PreCreateWindow(cs) )
 		return FALSE;
 
-	cs.style = WS_CHILD | WS_VISIBLE | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU
-		| FWS_ADDTOTITLE | WS_THICKFRAME;
+	//cs.style = WS_CHILD | WS_VISIBLE | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU  | FWS_ADDTOTITLE | WS_THICKFRAME;
+	/*
+	说明:去掉标题栏、系统菜单等样式,在切换窗口时就不会闪烁
+	*/
+	cs.style = WS_CHILD | WS_VISIBLE;
 
 	return TRUE;
 }

+ 60 - 0
CTSManager/CTSManager/DrawerCtrl.cpp

@@ -57,6 +57,8 @@ BEGIN_MESSAGE_MAP(CDrawerCtrl, CWnd)
 	ON_WM_MOUSEMOVE()
 	ON_WM_TIMER()
 	ON_WM_MOUSEWHEEL()
+	ON_NOTIFY(NM_CLICK, 50001, &CDrawerCtrl::OnNMClickNavQuarter)
+	ON_NOTIFY(NM_CLICK, 50002, &CDrawerCtrl::OnNMClickNavOthers)
 END_MESSAGE_MAP()
 
 
@@ -499,6 +501,28 @@ void CDrawerCtrl::OnTimer(UINT_PTR nIDEvent)
 	CWnd::OnTimer(nIDEvent);
 }
 
+CWnd* CDrawerCtrl::GetFolderWnd(const char* pszName)
+{
+	if (!pszName || pszName[0] == '\0')
+		return NULL;
+
+	CBm_arFolder* pFolder = NULL;
+	int nSize = m_arFolder.GetSize();
+	for (int i = 0; i < nSize; i++)
+	{
+		pFolder = (CBm_arFolder*)m_arFolder.GetAt(i);
+		if (pFolder)
+		{
+			if (_tcsicmp(pFolder->cName, pszName) == 0)
+			{
+				return pFolder->pChild;
+			}
+		}
+	}
+
+	return NULL;
+}
+
 BOOL CDrawerCtrl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
 {
 	if (GetFocus() != this)
@@ -558,3 +582,39 @@ BOOL CDrawerCtrl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
 
 	return CWnd::OnMouseWheel(nFlags, zDelta, pt);
 }
+
+
+void CDrawerCtrl::OnNMClickNavQuarter(NMHDR* pNMHDR, LRESULT* pResult)
+{
+	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
+	// TODO: 在此添加控件通知处理程序代码
+	if (pNMItemActivate->iItem != -1)
+	{
+		CListCtrl* pList = (CListCtrl*)GetFolderWnd(_T("季度"));
+		CChildFrameList::SwitchView(_T("季度"));
+		if (pList)
+		{
+			CString strText = pList->GetItemText(pNMItemActivate->iItem, 0);
+			//AfxMessageBox(strText);
+		}
+	}
+	*pResult = 0;
+}
+
+void CDrawerCtrl::OnNMClickNavOthers(NMHDR* pNMHDR, LRESULT* pResult)
+{
+	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
+	// TODO: 在此添加控件通知处理程序代码
+	NM_LISTVIEW* pNMList = (NM_LISTVIEW*)pNMHDR;
+	if (pNMItemActivate->iItem != -1)
+	{
+		CListCtrl* pList = (CListCtrl*)GetFolderWnd(_T("其他"));
+		if (pList)
+		{
+			CString strText = pList->GetItemText(pNMItemActivate->iItem, 0);
+			//AfxMessageBox(strText);
+			CChildFrameList::SwitchView(strText);
+		}
+	}
+	*pResult = 0;
+}

+ 5 - 1
CTSManager/CTSManager/DrawerCtrl.h

@@ -3,7 +3,7 @@
 /*  模 块 名:;
 /*  描    述:;
 /*
-/*  版    本:[V];	
+/*  版    本:[V];
 /*  作    者:[IT];
 /*  日    期:[8/19/2016];
 /*
@@ -24,6 +24,7 @@
 
 #include <afxcoll.h>
 #include "EnBitmap.h"
+#include "ChildFrameList.h"
 
 class CDrawerCtrl : public CWnd
 {
@@ -111,7 +112,10 @@ protected:
 	//}}AFX_MSG
 	DECLARE_MESSAGE_MAP()
 public:
+	CWnd* GetFolderWnd(const char* pszName);
 	afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
+	afx_msg void OnNMClickNavQuarter(NMHDR* pNMHDR, LRESULT* pResult);
+	afx_msg void OnNMClickNavOthers(NMHDR* pNMHDR, LRESULT* pResult);
 };
 
 

+ 1 - 1
CTSManager/CTSManager/EnBitmap.cpp

@@ -1098,7 +1098,7 @@ BOOL CEnBitmap::ExtendDraw(CDC* pDC, CRect rc, int nX, int nY, BOOL bTran, UINT
 	CEnBitmap bmp;
 	if (ExtendDrawImage(bmp, rc, nX, nY))
 	{
-#ifdef _DEBUG
+#if 0
 		CString strTime;
 		strTime.Format(_T("%ld.bmp"), GetTickCount());
 		CImageHelper::SaveBitmapToFile(bmp, strTime.GetString());

+ 4 - 4
CTSManager/CTSManager/MainFrm.cpp

@@ -52,7 +52,7 @@ static void DelAllMenu(HMENU hMenu)
 
 // CMainFrame 构造/析构
 
-CMainFrame::CMainFrame() noexcept :m_ChildFrameList(this)
+CMainFrame::CMainFrame() noexcept
 {
 	// TODO: 在此添加成员初始化代码
 	theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"), ID_VIEW_APPLOOK_VS_2008);
@@ -236,9 +236,9 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
 
 
 #if 1
-	m_ChildFrameList.SetDoc(m_pDoc);
-	m_ChildFrameList.AppendView(_T("品牌"), RUNTIME_CLASS(CFormViewBrand), IDR_MAINFRAME, IDD_FORMVIEW_BRAND);
-	m_ChildFrameList.AppendView(_T("季度"), RUNTIME_CLASS(CFormViewQuater), IDR_MAINFRAME, IDD_FORMVIEW_QUATER);
+	CChildFrameList::Init(this, m_pDoc);
+	CChildFrameList::AppendView(_T("品牌"), RUNTIME_CLASS(CFormViewBrand), IDR_MAINFRAME, IDD_FORMVIEW_BRAND);
+	CChildFrameList::AppendView(_T("季度"), RUNTIME_CLASS(CFormViewQuater), IDR_MAINFRAME, IDD_FORMVIEW_QUATER);
 #endif
 
 	return 0;

+ 0 - 1
CTSManager/CTSManager/MainFrm.h

@@ -70,7 +70,6 @@ protected:  // 控件条嵌入成员
 	CMFCShellTreeCtrl m_wndTree;
 	CCalendarBar      m_wndCalendar;
 #endif
-	CChildFrameList   m_ChildFrameList;
 
 // 生成的消息映射函数
 protected:

+ 3 - 2
CTSManager/CTSManager/Navbar.cpp

@@ -196,7 +196,7 @@ void CNavbar::InitNavCtrl()
 
 	//先创建ListCtrl (m_MyFriendListCtrl)
 	if (m_NavQuarter.Create(LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_OWNERDRAWFIXED | LVS_SHOWSELALWAYS | WS_CHILD,
-		CRect(0, 0, 0, 0), &m_DrawerCtrl, 10001))
+		CRect(0, 0, 0, 0), &m_DrawerCtrl, 50001))
 	{
 
 		m_NavQuarter.SetExtendedStyle(m_NavQuarter.GetExtendedStyle() | LVS_EX_FULLROWSELECT);
@@ -218,7 +218,7 @@ void CNavbar::InitNavCtrl()
 	}
 
 	if (m_NavOthers.Create(LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_OWNERDRAWFIXED | LVS_SHOWSELALWAYS | WS_CHILD,
-		CRect(0, 0, 0, 0), &m_DrawerCtrl, 10001))
+		CRect(0, 0, 0, 0), &m_DrawerCtrl, 50002))
 	{
 
 		m_NavOthers.SetExtendedStyle(m_NavOthers.GetExtendedStyle() | LVS_EX_FULLROWSELECT);
@@ -279,6 +279,7 @@ void CNavbar::OnUpdateSort(CCmdUI* pCmdUI)
 	pCmdUI->SetCheck(pCmdUI->m_nID == m_nCurrSort);
 }
 
+
 void CNavbar::OnClassAddMemberFunction()
 {
 	AfxMessageBox(_T("添加成员函数..."));

+ 2 - 0
CTSManager/CTSManager/Navbar.h

@@ -58,5 +58,7 @@ protected:
 	afx_msg void OnUpdateSort(CCmdUI* pCmdUI);
 
 	DECLARE_MESSAGE_MAP()
+
+
 };