Sfoglia il codice sorgente

1、Debug版本,切换FolderBar时会出现绘制Bar失败;只有Release才会没问题,问题原因暂时未找到;
2、选中侧边栏Item时,默认的黄色选中图bmp未拉伸到跟ListCtrl一样长度;

sat23 4 anni fa
parent
commit
42b1ad6065

+ 5 - 0
CTSManager/CTSManager/CTSManager.cpp

@@ -90,6 +90,9 @@ BOOL CCTSManagerApp::InitInstance()
 
 	Global::GetConfig();
 
+	//GdiplusStartupInput gdiplusStartupInput;
+	//GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
+
 #if 0 // 用例演示;
 	// 创建mysql对象;
 	MYSQL* pConn = mysql_init(NULL); // 会调用mysql_library_init;
@@ -222,6 +225,8 @@ int CCTSManagerApp::ExitInstance()
 	if (pdb)
 		delete pdb;
 	pdb = NULL;
+	//Gdiplus::GdiplusShutdown(m_gdiplusToken);
+
 	return CWinAppEx::ExitInstance();
 }
 

+ 1 - 1
CTSManager/CTSManager/CTSManager.h

@@ -19,7 +19,7 @@ class CCTSManagerApp : public CWinAppEx
 public:
 	CCTSManagerApp() noexcept;
 
-
+	ULONG_PTR m_gdiplusToken;
 // 重写
 public:
 	virtual BOOL InitInstance();

+ 2 - 0
CTSManager/CTSManager/CTSManager.vcxproj

@@ -205,6 +205,7 @@
     <ClInclude Include="FileView.h" />
     <ClInclude Include="framework.h" />
     <ClInclude Include="Global.h" />
+    <ClInclude Include="ImageHelper.h" />
     <ClInclude Include="MainFrm.h" />
     <ClInclude Include="Navbar.h" />
     <ClInclude Include="NavListCtrl.h" />
@@ -229,6 +230,7 @@
     <ClCompile Include="EnBitmap.cpp" />
     <ClCompile Include="FileView.cpp" />
     <ClCompile Include="Global.cpp" />
+    <ClCompile Include="ImageHelper.cpp" />
     <ClCompile Include="MainFrm.cpp" />
     <ClCompile Include="Navbar.cpp" />
     <ClCompile Include="NavListCtrl.cpp" />

+ 6 - 0
CTSManager/CTSManager/CTSManager.vcxproj.filters

@@ -90,6 +90,9 @@
     <ClInclude Include="Global.h">
       <Filter>头文件</Filter>
     </ClInclude>
+    <ClInclude Include="ImageHelper.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="CTSManager.cpp">
@@ -149,6 +152,9 @@
     <ClCompile Include="Global.cpp">
       <Filter>源文件</Filter>
     </ClCompile>
+    <ClCompile Include="ImageHelper.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="CTSManager.rc">

+ 0 - 15
CTSManager/CTSManager/Database.cpp

@@ -1,21 +1,6 @@
 #include "pch.h"
 #include "Database.h"
 
-VOID _dprintf(CHAR* pszStr, ...)
-{
-	const int LOGLEN = 3072;
-	char szData[LOGLEN] = { 0 };
-	_stprintf_s(szData, _T("[%s %s]\n\t"), _T("Db"), CTime::GetCurrentTime().Format(_T("%H:%M:%S")).GetString());
-	int len = strlen(szData);
-	va_list args;
-	va_start(args, pszStr);
-	_vsnprintf_s(szData + len, LOGLEN - len, LOGLEN - len, pszStr, args);
-	va_end(args);
-	if (szData[strlen(szData)-1] != '\n')
-		strcat_s(szData, "\n");
-	OutputDebugStringA(szData);
-}
-
 #define CHECKDB if (m_pConn == NULL || !m_bConnected) return FALSE
 
 char* CDatabase::m_spImage = NULL;

+ 155 - 55
CTSManager/CTSManager/DrawerCtrl.cpp

@@ -10,11 +10,7 @@
 static char THIS_FILE[] = __FILE__;
 #endif
 
-/////////////////////////////////////////////////////////////////////////////
-// CDrawerCtrl
-
 IMPLEMENT_DYNCREATE(CDrawerCtrl, CWnd)
-
 CDrawerCtrl::CDrawerCtrl()
 {
 	//背景色
@@ -24,10 +20,10 @@ CDrawerCtrl::CDrawerCtrl()
 	//字体
 	m_pFont = NULL;
 	//目录高度
-	nFolderHeight = 20;
+	m_nFolderHeight = 20;
 
 	//当前选中目录索引
-	iSelFolder = -1;
+	m_nCurSelFolder = 1;
 	//最后高亮的目录索引
 	iLastFolderHighlighted = -1;
 	//当前鼠标滑过的目录
@@ -49,7 +45,6 @@ CDrawerCtrl::~CDrawerCtrl()
 	m_arFolder.RemoveAll();
 }
 
-
 BEGIN_MESSAGE_MAP(CDrawerCtrl, CWnd)
 	//{{AFX_MSG_MAP(CDrawerCtrl)
 	ON_WM_CREATE()
@@ -61,28 +56,25 @@ BEGIN_MESSAGE_MAP(CDrawerCtrl, CWnd)
 	//}}AFX_MSG_MAP
 	ON_WM_MOUSEMOVE()
 	ON_WM_TIMER()
+	ON_WM_MOUSEWHEEL()
 END_MESSAGE_MAP()
 
 
-/////////////////////////////////////////////////////////////////////////////
-// CDrawerCtrl message handlers
-
 void CDrawerCtrl::SetFolderImage(LPCTSTR lpszPath)
 {
-	ASSERT(lpszPath);
-	ASSERT(PathFileExists(lpszPath));
-	CEnBitmap bmpTemp;
-	bmpTemp.LoadImage(lpszPath);
-	bmpTemp.DrawImage(m_bmpNormalFolder, 1, 1, 1, 2);
-	bmpTemp.DrawImage(m_bmpHoverFolder, 1, 2, 1, 2);
-	bmpTemp.DeleteObject();
-
+	ASSERT(lpszPath || PathFileExists(lpszPath));
+ 	CEnBitmap bmpTemp;
+ 	bmpTemp.LoadImage(lpszPath);
+ 	bmpTemp.DrawImage(m_bmpNormalFolder, 1, 1, 1, 2);
+ 	bmpTemp.DrawImage(m_bmpHoverFolder, 1, 2, 1, 2);
+ 	bmpTemp.DeleteObject();
 };
 
 void CDrawerCtrl::SetSelIcon(LPCTSTR lpszIconPath)
 {
 	iSelcon = (HICON)::LoadImage(AfxGetApp()->m_hInstance, lpszIconPath, IMAGE_ICON, 16, 16, LR_LOADFROMFILE);
 }
+
 void CDrawerCtrl::SetFolderText(const int index, const char* text)
 {
 	ASSERT(index >= 0 && index < GetFolderCount());
@@ -105,7 +97,6 @@ int CDrawerCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
 {
 	if (CWnd::OnCreate(lpCreateStruct) == -1)
 		return -1;
-	// TODO: Add your specialized creation code here
 	return 0;
 }
 
@@ -113,13 +104,15 @@ void CDrawerCtrl::OnPaint()
 {
 	CRect rc;
 	GetClientRect(&rc);
-	CPaintDC dc(this);
+	_dprintf(_T("CDrawerCtrl::OnPaint,%d,客户区域[%d,%d,%d,%d]"), m_arFolder.GetSize(), rc.left, rc.top, rc.right, rc.bottom);
+	
 	CDC memDC;
+	CPaintDC dc(this);	
 	memDC.CreateCompatibleDC(&dc);
 	CBitmap bmp;
 	bmp.CreateCompatibleBitmap(&dc, rc.Width(), rc.Height());
 
-	CBitmap* oldbmp = memDC.SelectObject(&bmp);;
+	CBitmap* oldbmp = memDC.SelectObject(&bmp);
 	memDC.FillSolidRect(rc, m_crBackground);
 	int nFolders = m_arFolder.GetSize();
 
@@ -127,10 +120,12 @@ void CDrawerCtrl::OnPaint()
 	{
 		CRect rcFolder;
 		GetFolderRect(i, rcFolder);
+		_dprintf(_T("\t\tCDrawerCtrl::OnPaint,folder=%d【%d,%d,%d,%d】"),i, rcFolder.left, rcFolder.top, rcFolder.right, rcFolder.bottom);
 		DrawFolder(&memDC, i, &rcFolder);
 	}
 
 	dc.BitBlt(rc.left, rc.top, rc.Width(), rc.Height(), &memDC, 0, 0, SRCCOPY);//Copy
+	
 	memDC.DeleteDC();
 }
 
@@ -142,20 +137,33 @@ BOOL CDrawerCtrl::OnEraseBkgnd(CDC* pDC)
 bool CDrawerCtrl::GetFolderRect(const int iIndex, CRect& rect) const
 {
 	int max = m_arFolder.GetSize();
-	ASSERT(iIndex >= 0 && iIndex < max);
+	if (iIndex < 0 || iIndex >= max)
+		return false;
 
-	if (iIndex >= 0 && iIndex < max)
-	{
-		CRect rc;
-		GetClientRect(rc);
-		if (iIndex > iSelFolder)
-			rect.SetRect(rc.left, rc.bottom - ((max - iIndex)) * nFolderHeight, rc.right,
-				rc.bottom - (max - iIndex - 1) * nFolderHeight);
-		else
-			rect.SetRect(rc.left, rc.top + iIndex * nFolderHeight, rc.right,
-				rc.top + (1 + iIndex) * nFolderHeight);
+	CRect rc;
+	GetClientRect(rc);
+	if (iIndex > m_nCurSelFolder)
+		rect.SetRect(rc.left, rc.bottom - ((max - iIndex)) * m_nFolderHeight, rc.right, rc.bottom - (max - iIndex - 1) * m_nFolderHeight);
+	else
+		rect.SetRect(rc.left, rc.top + iIndex * m_nFolderHeight, rc.right, rc.top + (1 + iIndex) * m_nFolderHeight);
+
+	return true;
+}
+
+bool CDrawerCtrl::PtInFolderHeadRect(CPoint pt) const
+{
+	int max = m_arFolder.GetSize();
+	ASSERT(m_nCurSelFolder >= 0 && m_nCurSelFolder < max);
+
+	CRect rcClient;
+	GetClientRect(rcClient);
+
+	CRect rcTop, rcBottom;
+	rcTop.SetRect(rcClient.left, rcClient.top, rcClient.right, rcClient.top + (m_nCurSelFolder + 1) * m_nFolderHeight);
+	rcBottom.SetRect(rcClient.left, rcClient.bottom - (max - m_nCurSelFolder) * m_nFolderHeight, rcClient.right, rcClient.bottom);
+	if (rcTop.PtInRect(pt) || rcBottom.PtInRect(pt))
 		return true;
-	}
+
 	return false;
 }
 
@@ -204,11 +212,12 @@ void CDrawerCtrl::GetInsideRect(CRect& rect) const
 	if (m_arFolder.GetSize() > 0)
 	{
 		int max = m_arFolder.GetSize();
-		rect.top += nFolderHeight * (iSelFolder + 1);//+ 2;
-		rect.bottom -= (max - iSelFolder - 1) * nFolderHeight + 1;
+		rect.top += m_nFolderHeight * (m_nCurSelFolder + 1);//+ 2;
+		rect.bottom -= (max - m_nCurSelFolder - 1) * m_nFolderHeight + 1;
 		return;
 	}
 }
+
 int CDrawerCtrl::HitTestEx(const CPoint& point, int& index)
 {
 	int max = m_arFolder.GetSize(), t;
@@ -255,9 +264,9 @@ void CDrawerCtrl::OnLButtonDown(UINT nFlags, CPoint point)
 				{
 					CPoint pt(msg.lParam);
 					int idx, ht1 = HitTestEx(pt, idx);
-					if (ht1 == htFolder && idx != iSelFolder)
+					if (ht1 == htFolder && idx != m_nCurSelFolder)
 					{
-						//idx = (idx == iSelFolder)?(idx+1):idx;
+						//idx = (idx == m_nCurSelFolder)?(idx+1):idx;
 						if (idx < GetFolderCount())
 							SetSelFolder(idx);
 					}
@@ -276,22 +285,22 @@ void CDrawerCtrl::OnLButtonDown(UINT nFlags, CPoint point)
 	CWnd::OnLButtonDown(nFlags, point);
 }
 
-
 void CDrawerCtrl::SetSelFolder(const int index)
 {
 	ASSERT(index >= 0 && index < GetFolderCount());
-	if (index == iSelFolder) return;
+	if (index == m_nCurSelFolder) return;
 
 	CWnd* pc = GetFolderChild();
 	if (pc) pc->ShowWindow(SW_HIDE);
 
-	iSelFolder = index;
+	m_nCurSelFolder = index;
 
 	pc = GetFolderChild();
 	if (pc)
 	{
 		CRect rc;
 		GetInsideRect(rc);
+		_dprintf(_T("\t\t\t内部大小:%d,%d,%d,%d"), rc.left, rc.top, rc.right, rc.bottom);
 		pc->MoveWindow(rc);
 		pc->ShowWindow(SW_SHOW);
 	}
@@ -306,7 +315,7 @@ int CDrawerCtrl::GetFolderCount() const
 
 int CDrawerCtrl::GetSelFolder() const
 {
-	return iSelFolder;
+	return m_nCurSelFolder;
 }
 
 void CDrawerCtrl::RemoveFolder(const int index)
@@ -315,8 +324,8 @@ void CDrawerCtrl::RemoveFolder(const int index)
 	CBm_arFolder* pbf = (CBm_arFolder*)m_arFolder.GetAt(index);
 	delete pbf;
 	m_arFolder.RemoveAt(index);
-	if (iSelFolder >= index) iSelFolder = index - 1;
-	if (iSelFolder < 0 && GetFolderCount() > 0) iSelFolder = 0;
+	if (m_nCurSelFolder >= index) m_nCurSelFolder = index - 1;
+	if (m_nCurSelFolder < 0 && GetFolderCount() > 0) m_nCurSelFolder = 0;
 	Invalidate();
 }
 
@@ -354,7 +363,7 @@ CWnd* CDrawerCtrl::GetFolderChild(int iFolder)
 	if (GetFolderCount())
 	{
 		if (iFolder < 0)
-			iFolder = iSelFolder == -1 ? 0 : iSelFolder;
+			iFolder = m_nCurSelFolder == -1 ? 0 : m_nCurSelFolder;
 
 		CBm_arFolder* pbf = (CBm_arFolder*)m_arFolder.GetAt(iFolder);
 		return pbf->pChild;
@@ -362,16 +371,24 @@ CWnd* CDrawerCtrl::GetFolderChild(int iFolder)
 	return NULL;
 }
 
+void CDrawerCtrl::SetAutoFolder(IN const DWORD& dwTime)
+{
+	SetTimer(2, dwTime, NULL);
+}
+
 DWORD CDrawerCtrl::GetFolderData(int iFolder)
 {
-	if (iFolder < 0) iFolder = iSelFolder;
+	if (iFolder < 0) iFolder = m_nCurSelFolder;
 	CBm_arFolder* pbf = (CBm_arFolder*)m_arFolder.GetAt(iFolder);
 	return pbf->dwData;
 }
 
 void CDrawerCtrl::OnMouseMove(UINT nFlags, CPoint point)
 {
-	// TODO: 在此添加消息处理程序代码和/或调用默认值
+	if (GetFocus() != this && PtInFolderHeadRect(point))
+		SetFocus();
+
+	//_dprintf(_T("CDrawerCtrl::OnMouseMove"));
 	int ht = HitTestEx(point, iHoverFolder);
 
 	if (ht == htFolder)
@@ -380,30 +397,32 @@ void CDrawerCtrl::OnMouseMove(UINT nFlags, CPoint point)
 		SetTimer(1, 100, NULL);
 	}
 
+	m_curpoint = point;
 	CWnd::OnMouseMove(nFlags, point);
 }
 
-
 void CDrawerCtrl::DrawFolder(CDC* pDC, const int iIdx, CRect rect)
 {
+	_dprintf(_T("\t\tCDrawerCtrl::DrawFolder %d, %d = %d"), m_nCurSelFolder, iHoverFolder, iIdx);
 	if (iIdx < 0)	return;
 
 	CBm_arFolder* pBf = (CBm_arFolder*)m_arFolder.GetAt(iIdx);
 
 	if (iHoverFolder == iIdx)
 	{
-		if (m_bmpHoverFolder.m_hObject != NULL)
-			m_bmpHoverFolder.ExtendDraw(pDC, rect, 20, 5);
+ 		if (m_bmpHoverFolder.m_hObject != NULL)
+ 			m_bmpHoverFolder.ExtendDraw(pDC, rect, 20, 5);
 	}
 	else
 	{
-		if (m_bmpNormalFolder.m_hObject != NULL)
-			m_bmpNormalFolder.ExtendDraw(pDC, rect, 20, 5);
+ 		if (m_bmpNormalFolder.m_hObject != NULL)
+ 			m_bmpNormalFolder.ExtendDraw(pDC, rect, 20, 5);
 	}
 
-	if (iSelFolder == iIdx && iSelcon != NULL)
+	if (m_nCurSelFolder == iIdx && iSelcon != NULL)
 	{
-		::DrawIconEx(*pDC, rect.left + 2, rect.top + (nFolderHeight - 16) / 2, iSelcon, 16, 16, 0, NULL, DI_NORMAL);
+		_dprintf(_T("\t\t画图标 %d, %d = %d"), m_nCurSelFolder, iHoverFolder, iIdx);
+		::DrawIconEx(*pDC, rect.left + 2, rect.top + (m_nFolderHeight - 16) / 2, iSelcon, 16, 16, 0, NULL, DI_NORMAL);
 	}
 
 	//Draw Folder Name In Folder
@@ -439,14 +458,13 @@ void CDrawerCtrl::HighlightFolder(const int index)
 	}
 	iLastFolderHighlighted = index;
 }
+
 void CDrawerCtrl::OnTimer(UINT_PTR nIDEvent)
 {
-	// TODO: 在此添加消息处理程序代码和/或调用默认值
 	if (nIDEvent == 1)
 	{
 		CPoint pt(GetMessagePos()); ScreenToClient(&pt);
 		CRect rc; GetClientRect(&rc);
-
 		int ht = HitTestEx(pt, iHoverFolder);
 
 		if (ht != htFolder || !(rc.PtInRect(pt)))
@@ -454,7 +472,89 @@ void CDrawerCtrl::OnTimer(UINT_PTR nIDEvent)
 			HighlightFolder(-1);
 			KillTimer(1);
 		}
+	}
+
+	if (nIDEvent == 2)
+	{// 鼠标在folderheader上x毫秒自动打开;
+		if (GetFocus() != this && PtInFolderHeadRect(m_curpoint)) SetFocus();
 
+		int index, ht = HitTestEx(m_curpoint, index);
+
+		if (ht == htFolder)
+		{
+			bool bHigh = true;
+
+			if (::GetCapture() == NULL)
+			{
+				SetCapture();
+				ASSERT(this == GetCapture());
+				AfxLockTempMaps();
+				if (index < GetFolderCount())
+					SetSelFolder(index);
+				ReleaseCapture();
+				AfxUnlockTempMaps(FALSE);
+			}
+		}
 	}
 	CWnd::OnTimer(nIDEvent);
 }
+
+BOOL CDrawerCtrl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
+{
+	if (GetFocus() != this)
+		SetFocus();
+
+	if (m_nCurSelFolder <= 0 && m_nCurSelFolder >= m_arFolder.GetSize())
+		return FALSE;
+
+	ScreenToClient(&pt);
+	if (!PtInFolderHeadRect(pt))
+	{
+		return FALSE;
+	}
+
+	INT nIndex = m_nCurSelFolder;
+	if (::GetCapture() == NULL)
+	{
+		SetCapture();
+		AfxLockTempMaps();
+		CBm_arFolder* pChild = NULL;
+		if (zDelta > 0)
+		{// 向上滚动;
+			if (m_nCurSelFolder == 0)
+			{
+				ReleaseCapture();
+				AfxUnlockTempMaps(FALSE);
+				return TRUE;
+			}
+
+			nIndex--;
+			pChild = (CBm_arFolder*)m_arFolder.GetAt(nIndex);
+			if (pChild)
+			{
+				SetSelFolder(nIndex);
+			}
+		}
+		else
+		{// 向下滚动;
+			if (m_nCurSelFolder == GetFolderCount() - 1)
+			{
+				ReleaseCapture();
+				AfxUnlockTempMaps(FALSE);
+				return TRUE;
+			}
+
+			nIndex++;
+			pChild = (CBm_arFolder*)m_arFolder.GetAt(nIndex);
+			if (pChild)
+			{
+				SetSelFolder(nIndex);
+			}
+		}
+
+		ReleaseCapture();
+		AfxUnlockTempMaps(FALSE);
+	}
+
+	return CWnd::OnMouseWheel(nFlags, zDelta, pt);
+}

+ 28 - 3
CTSManager/CTSManager/DrawerCtrl.h

@@ -1,3 +1,20 @@
+/************************************************************************/
+/*  Copyright (C), 2016-2020, [IT], 保留所有权利;
+/*  模 块 名:;
+/*  描    述:;
+/*
+/*  版    本:[V];	
+/*  作    者:[IT];
+/*  日    期:[8/19/2016];
+/*
+/*
+/*  注    意:;
+/*
+/*  修改记录:[IT];
+/*  修改日期:;
+/*  修改版本:;
+/*  修改内容:;
+/************************************************************************/
 #ifndef __DRAWERCTRL__
 #define __DRAWERCTRL__
 
@@ -23,7 +40,10 @@ public:
 	CEnBitmap	m_bmpHoverFolder;
 
 	COLORREF	m_crBackground;
-	UINT		nFolderHeight;
+	// 图片高度;
+	UINT		m_nFolderHeight;
+	// 鼠标位置;
+	CPoint		m_curpoint;
 
 	COLORREF	m_crText;
 	CFont* m_pFont;
@@ -32,7 +52,8 @@ public:
 
 	int			iLastFolderHighlighted;
 	int			iHoverFolder;
-	int			iSelFolder;
+	// 当前选中的项;
+	int			m_nCurSelFolder;
 
 	HICON		iSelcon;
 
@@ -53,6 +74,7 @@ public:
 
 	// Implementation
 public:
+	void SetAutoFolder(IN const DWORD& dwTime = 800);
 	DWORD GetFolderData(int iFolder = -1);
 	CWnd* GetFolderChild(int iFolder = -1);
 	int AddFolderBar(const char* pFolder, CWnd* pSon, const DWORD exData = 0);
@@ -69,8 +91,9 @@ public:
 	void GetInsideRect(CRect& rect) const;
 	int AddFolder(const char* cFolderName, const DWORD exData);
 	bool GetFolderRect(const int iIndex, CRect& rect) const;
+	bool PtInFolderHeadRect(CPoint pt) const;
 	BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
-	void SetFolderHeight(UINT nHeight) { nFolderHeight = nHeight; };
+	void SetFolderHeight(UINT nHeight) { m_nFolderHeight = nHeight; };
 	virtual ~CDrawerCtrl();
 
 	// Generated message map functions
@@ -87,6 +110,8 @@ protected:
 	afx_msg void OnSize(UINT nType, int cx, int cy);
 	//}}AFX_MSG
 	DECLARE_MESSAGE_MAP()
+public:
+	afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
 };
 
 

+ 35 - 15
CTSManager/CTSManager/EnBitmap.cpp

@@ -3,6 +3,7 @@
 #include "pch.h"
 #include "EnBitmap.h"
 #include <AFXPRIV.H>
+#include "ImageHelper.h"
 
 #ifdef _DEBUG
 #undef THIS_FILE
@@ -442,9 +443,7 @@ BOOL CEnBitmap::Draw(CDC* pDC, LPRECT r)
 	CDC dc;
 	dc.CreateCompatibleDC(pDC);
 	CBitmap* bmp = dc.SelectObject(this);
-	pDC->BitBlt(r->left, r->top, r->right - r->left, r->bottom - r->top, &dc, 0, 0,
-		SRCCOPY);
-
+	pDC->BitBlt(r->left, r->top, r->right - r->left, r->bottom - r->top, &dc, 0, 0, SRCCOPY);
 	dc.SelectObject(bmp);
 	return TRUE;
 }
@@ -470,11 +469,8 @@ void CEnBitmap::TransparentBlt(CDC& dc, CRect rc, UINT colorTransparent)
 	::TransparentBlt(dc.GetSafeHdc(), rc.left, rc.top, rc.Width(), rc.Height(), pDC.GetSafeHdc(), 0, 0, GetWidth(), GetHeight(), colorTransparent);
 	::SelectObject(pDC.m_hDC, hOldBmp);
 	pDC.DeleteDC();
-
 }
 
-
-
 // DrawGreyScale    - Draws a bitmap in Grey scale
 // pDC              - Pointer to target device context
 // hDIB             - Handle of device-independent bitmap
@@ -613,8 +609,7 @@ void CEnBitmap::DrawGreyScale(CDC* pDC)
 //      nXSrc :         x coordinates of the upper left corner of the source rectangle into the bitmap
 //      nYSrc :         y coordinates of the upper left corner of the source rectangle into the bitmap
 //
-void CEnBitmap::DitherBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth,
-	int nHeight, HBITMAP hbm, int nXSrc, int nYSrc)
+void CEnBitmap::DitherBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HBITMAP hbm, int nXSrc, int nYSrc)
 {
 	ASSERT(hdcDest && hbm);
 	ASSERT(nWidth > 0 && nHeight > 0);
@@ -842,8 +837,7 @@ HPALETTE CEnBitmap::CreateReservedPalette(CDC* pDC)
 // nLoops			- How many loops to fade the image into color
 // nDelay			- Delay in milli-seconds between each loop
 //
-void CEnBitmap::FadeColorToGrayScale(CDC* pDC, int xDest, int yDest, int nLoops,
-	int nDelay)
+void CEnBitmap::FadeColorToGrayScale(CDC* pDC, int xDest, int yDest, int nLoops, int nDelay)
 {
 	CPalette pal;
 	CPalette* pOldPalette;
@@ -1056,10 +1050,9 @@ BOOL CEnBitmap::StretchDraw(CDC* pDC, LPRECT r, LPRECT sr)
 	else
 		pDC->StretchBlt(r->left, r->top, r->right - r->left, r->bottom - r->top, &dc, sr->left, sr->top, sr->right - sr->left, sr->bottom - sr->top, SRCCOPY);
 
-
 	dc.SelectObject(bmp);
-	return TRUE;
 
+	return TRUE;
 }
 
 BOOL CEnBitmap::DrawImage(CEnBitmap& bmp, int nX, int nY, int nCol, int nRow)
@@ -1105,6 +1098,11 @@ BOOL CEnBitmap::ExtendDraw(CDC* pDC, CRect rc, int nX, int nY, BOOL bTran, UINT
 	CEnBitmap bmp;
 	if (ExtendDrawImage(bmp, rc, nX, nY))
 	{
+#ifdef _DEBUG
+		CString strTime;
+		strTime.Format(_T("%ld.bmp"), GetTickCount());
+		CImageHelper::SaveBitmapToFile(bmp, strTime.GetString());
+#endif
 		if (bTran)
 			bmp.TransparentBlt(*pDC, &rc, colorTransparent);
 		else
@@ -1115,6 +1113,31 @@ BOOL CEnBitmap::ExtendDraw(CDC* pDC, CRect rc, int nX, int nY, BOOL bTran, UINT
 	return FALSE;
 }
 
+/************************************************************************/
+/*  函数:ExtendDrawImage[8/23/2016 IT];
+/*  描述:;
+/*  参数:;
+/*  	[OUT] bmp:返回图片对象;
+/*  	[IN] rc:画图的目标区域;
+/*  	[IN] nX:分割点x坐标;
+/*  	[IN] nY:分割点y坐标;
+/*  返回:BOOL;
+/*  注意:;
+/*  示例:;
+/*  (0,0)-------|----------|
+/*   |	        |	       |
+/*   | 左上     | 右上     |
+/*   |          |          |
+/*   ----------(x,y)-------|----x,y分割点坐标;
+/*   |          |          |
+/*   | 左下     | 右下     |
+/*   |          |          |
+/*   -----------|---------(r,b)-
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
 BOOL CEnBitmap::ExtendDrawImage(CEnBitmap& bmp, CRect rc, int nX, int nY)
 {
 	CBitmap* OldBmp;
@@ -1136,13 +1159,11 @@ BOOL CEnBitmap::ExtendDrawImage(CEnBitmap& bmp, CRect rc, int nX, int nY)
 	//dc.SetStretchBltMode(COLORONCOLOR);
 	if (nX != 0 && nY == 0)
 	{
-
 		//左上角
 		memDC.BitBlt(0, 0, nX, rc.Height(), &dc, 0, 0, SRCCOPY);
 		memDC.StretchBlt(nX, 0, rc.Width() - GetWidth(), rc.Height(), &dc, nX, 0, 1, GetHeight(), SRCCOPY);
 		//右上角
 		memDC.BitBlt(rc.right - (GetWidth() - nX), 0, GetWidth() - nX, rc.Height(), &dc, nX, 0, SRCCOPY);
-
 	}
 	else if (nX == 0 && nY != 0)
 	{
@@ -1151,7 +1172,6 @@ BOOL CEnBitmap::ExtendDrawImage(CEnBitmap& bmp, CRect rc, int nX, int nY)
 		memDC.StretchBlt(0, nY, GetWidth(), rc.Height() - GetHeight(), &dc, 0, nY, GetWidth(), 1, SRCCOPY);
 		//右上角
 		memDC.BitBlt(0, rc.bottom - (GetHeight() - nY), GetWidth(), GetHeight() - nY, &dc, 0, nY, SRCCOPY);
-
 	}
 	else
 	{

+ 561 - 0
CTSManager/CTSManager/ImageEx.cpp

@@ -0,0 +1,561 @@
+#include "pch.h"
+#include "ImageEx.h"
+#include "Macro.h"
+//////////////////////////////////////////////////////////////////////////////////
+
+//构造函数
+CImageEx::CImageEx()
+{
+	//设置变量
+	m_pImage=NULL;
+	ZeroMemory(m_strImageName, sizeof(m_strImageName) );
+	::SetRect(&m_rcNinePart,0,0,0,0);
+
+	return;
+}
+
+//析构函数
+CImageEx::~CImageEx()
+{
+	//销毁图片
+	DestroyImage(); 
+
+	return;
+}
+
+//是否加载
+bool CImageEx::IsNull()
+{
+	//加载判断
+	if (m_pImage==NULL) return true;
+	if (m_pImage->GetLastStatus()!=Ok) return true;
+
+	return false;
+}
+
+//获取宽度
+INT CImageEx::GetWidth()
+{
+	//加载判断
+	ASSERT(IsNull()==false);
+	if (IsNull()==true) return 0;
+
+	//获取宽度
+	return m_pImage->GetWidth();
+}
+
+//获取高度
+INT CImageEx::GetHeight()
+{
+	//加载判断
+	ASSERT(IsNull()==false);
+	if (IsNull()==true) return 0;
+
+	//获取高度
+	return m_pImage->GetHeight();
+}
+
+//销毁图片
+bool CImageEx::DestroyImage()
+{
+	//删除对象
+	if (m_pImage!=NULL) SafeDelete(m_pImage);
+
+	return true;
+}
+
+//加载图片
+bool CImageEx::LoadImage(LPCTSTR pszFileName)
+{
+	//加载判断
+	ASSERT(m_pImage==NULL);
+	if (m_pImage!=NULL) return false;
+
+	//加载文件
+	CT2CW strFileName(pszFileName);
+	m_pImage=Bitmap::FromFile((LPCWSTR)strFileName, TRUE);
+
+	//错误判断
+	if ((m_pImage==NULL)||(m_pImage->GetLastStatus()!=Ok)) 
+	{
+		DestroyImage();
+		return false;
+	}
+
+	return true;
+}
+
+//加载图片
+bool CImageEx::LoadImage(HINSTANCE hInstance, LPCTSTR pszResourceName,LPCTSTR pszResourceType/*=TEXT("IMAGE")*/)
+{
+	//加载判断
+	ASSERT(m_pImage==NULL);
+	if (m_pImage!=NULL) return false;
+
+	//查找资源
+	HRSRC hResource=FindResource(hInstance,pszResourceName,pszResourceType);
+	if (hResource==NULL) return false;
+
+	//读取资源
+	DWORD dwImageSize=SizeofResource(hInstance,hResource);
+	LPVOID pImageBuffer=LoadResource(hInstance,hResource);
+
+	//创建数据
+	IStream * pIStream=NULL;
+	if (CreateStreamOnHGlobal(NULL,TRUE,&pIStream)!=S_OK)
+	{
+		ASSERT(FALSE);
+		return false;
+	}
+
+	//写入数据
+	pIStream->Write(pImageBuffer,dwImageSize,NULL);
+
+	//创建位图
+	m_pImage=Bitmap::FromStream(pIStream);
+
+	//释放资源
+	SafeRelease(pIStream);
+
+	//错误判断
+	if ((m_pImage==NULL)||(m_pImage->GetLastStatus()!=Ok))
+	{
+		ASSERT(FALSE);
+		return false;
+	}
+
+	return true;
+}
+
+//绘画图像
+bool CImageEx::DrawImage(CDC * pDC, INT nXPos, INT nYPos)
+{
+	//加载判断
+	ASSERT(m_pImage!=NULL);
+	if (m_pImage==NULL) return false;
+
+	//创建屏幕
+	ASSERT(pDC!=NULL);
+	Graphics graphics(pDC->GetSafeHdc());
+
+	//获取属性
+	INT nImageWidth=m_pImage->GetWidth();
+	INT nImageHeight=m_pImage->GetHeight();
+
+	//构造位置
+	RectF rcDrawRect;
+	rcDrawRect.X=(REAL)nXPos;
+	rcDrawRect.Y=(REAL)nYPos;
+	rcDrawRect.Width=(REAL)nImageWidth;
+	rcDrawRect.Height=(REAL)nImageHeight;
+
+	//绘画图像
+	graphics.DrawImage(m_pImage,rcDrawRect,0,0,(REAL)nImageWidth,(REAL)nImageHeight,UnitPixel);
+
+	return true;
+}
+
+//绘画图像
+bool CImageEx::DrawImage( CDC * pDC, INT nXPos, INT nYPos, INT nDestWidth, INT nDestHeight )
+{
+	//加载判断
+	ASSERT(m_pImage!=NULL);
+	if (m_pImage==NULL) return false;
+
+	//创建屏幕
+	ASSERT(pDC!=NULL);
+	Graphics graphics(pDC->GetSafeHdc());
+
+	//构造位置
+	RectF rcDrawRect;
+	rcDrawRect.X=(REAL)nXPos;
+	rcDrawRect.Y=(REAL)nYPos;
+	rcDrawRect.Width=(REAL)nDestWidth;
+	rcDrawRect.Height=(REAL)nDestHeight;
+
+	//绘画图像
+	graphics.DrawImage(m_pImage,rcDrawRect,0,0,(REAL)GetWidth(),(REAL)GetHeight(),UnitPixel);
+
+	return true;
+}
+
+//绘画图像
+bool CImageEx::DrawImage( CDC * pDC, RECT &rc )
+{
+	//加载判断
+	ASSERT(m_pImage!=NULL);
+	if (m_pImage==NULL) return false;
+	
+	//创建屏幕
+	ASSERT(pDC!=NULL);
+	Graphics graphics(pDC->GetSafeHdc());
+
+	//构造位置
+	RectF rcDrawRect;
+	rcDrawRect.X=(REAL)rc.left;
+	rcDrawRect.Y=(REAL)rc.top;
+	rcDrawRect.Width=(REAL)(rc.right-rc.left);
+	rcDrawRect.Height=(REAL)(rc.bottom-rc.top);
+
+	//绘画图像
+	graphics.DrawImage(m_pImage,rcDrawRect,0,0,(REAL)GetWidth(),(REAL)GetHeight(),UnitPixel);
+
+	return true;
+}
+
+//绘画图像
+bool CImageEx::DrawImage(CDC * pDC, INT nXDest, INT nYDest, INT nDestWidth, INT nDestHeight, INT nXScr, INT nYSrc)
+{
+	//加载判断
+	ASSERT(m_pImage!=NULL);
+	if (m_pImage==NULL) return false;
+
+	//创建屏幕
+	ASSERT(pDC!=NULL);
+	Graphics graphics(pDC->GetSafeHdc());
+
+	//构造位置
+	RectF rcDrawRect;
+	rcDrawRect.X=(REAL)nXDest;
+	rcDrawRect.Y=(REAL)nYDest;
+	rcDrawRect.Width=(REAL)nDestWidth;
+	rcDrawRect.Height=(REAL)nDestHeight;
+
+	//绘画图像
+	graphics.DrawImage(m_pImage,rcDrawRect,(REAL)nXScr,(REAL)nYSrc,(REAL)nDestWidth,(REAL)nDestHeight,UnitPixel);
+
+	return true;
+}
+
+//绘画图像
+bool CImageEx::DrawImage(CDC * pDC, INT nXDest, INT nYDest, INT nDestWidth, INT nDestHeight, INT nXScr, INT nYSrc, INT nSrcWidth, INT nSrcHeight)
+{
+	//加载判断
+	ASSERT(m_pImage!=NULL);
+	if (m_pImage==NULL) return false;
+
+	//创建屏幕
+	ASSERT(pDC!=NULL);
+	Graphics graphics(pDC->GetSafeHdc());
+
+	//构造位置
+	RectF rcDrawRect;
+	rcDrawRect.X=(REAL)nXDest;
+	rcDrawRect.Y=(REAL)nYDest;
+	rcDrawRect.Width=(REAL)nDestWidth;
+	rcDrawRect.Height=(REAL)nDestHeight;
+
+	//绘画图像
+	graphics.DrawImage(m_pImage,rcDrawRect,(REAL)nXScr,(REAL)nYSrc,(REAL)nSrcWidth,(REAL)nSrcHeight,UnitPixel);
+
+	return true;
+}
+
+//混合绘画
+bool CImageEx::AlphaDrawImage(CDC * pDestDC, INT xDest, INT yDest, BYTE cbAlphaDepth)
+{
+	//透明绘画
+	AlphaDrawImage(pDestDC,xDest,yDest,GetWidth(),GetHeight(),0,0,cbAlphaDepth);
+
+	return true;
+}
+
+//混合绘画
+bool CImageEx::AlphaDrawImage(CDC * pDestDC, INT xDest, INT yDest, INT cxDest, INT cyDest, INT xSrc, INT ySrc, BYTE cbAlphaDepth)
+{
+	//加载判断
+	ASSERT(m_pImage!=NULL);
+	if (m_pImage==NULL) return false;
+
+	//创建屏幕
+	ASSERT(pDestDC!=NULL);
+	Graphics graphics(pDestDC->GetSafeHdc());
+
+	//构造位置
+	RectF rcDrawRect;
+	rcDrawRect.X=(REAL)xDest;
+	rcDrawRect.Y=(REAL)yDest;
+	rcDrawRect.Width=(REAL)cxDest;
+	rcDrawRect.Height=(REAL)cyDest;
+
+	//透明矩阵
+	ColorMatrix Matrix=
+	{
+		1.0f,0.0f,0.0f,0.0f,0.0f, 
+		0.0f,1.0f,0.0f,0.0f,0.0f, 
+		0.0f,0.0f,1.0f,0.0f,0.0f,
+		0.0f,0.0f,0.0f,cbAlphaDepth/255.0f,0.0f, 
+		0.0f,0.0f,0.0f,0.0f,1.0f
+	};
+
+	//设置属性
+	ImageAttributes Attributes; 
+	Attributes.SetColorMatrix(&Matrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap); 
+
+	//绘画图像
+	graphics.DrawImage(m_pImage,rcDrawRect,(REAL)xSrc,(REAL)ySrc,(REAL)cxDest,(REAL)cyDest,UnitPixel,&Attributes);
+
+	return true;
+}
+
+//混合绘画
+bool CImageEx::AlphaDrawImage(CDC * pDestDC, INT xDest, INT yDest, INT cxDest, INT cyDest, INT xSrc, INT ySrc, INT cxSrc, INT cySrc, BYTE cbAlphaDepth)
+{
+	//创建缓冲
+	if ((cxDest!=cxSrc)||(cyDest!=cySrc))
+	{
+		//加载判断
+		ASSERT(m_pImage!=NULL);
+		if (m_pImage==NULL) return false;
+
+		//创建屏幕
+		ASSERT(pDestDC!=NULL);
+		Graphics graphics(pDestDC->GetSafeHdc());
+
+		//构造位置
+		RectF rcDrawRect;
+		rcDrawRect.X=(REAL)xDest;
+		rcDrawRect.Y=(REAL)yDest;
+		rcDrawRect.Width=(REAL)cxDest;
+		rcDrawRect.Height=(REAL)cyDest;
+
+		//透明矩阵
+		ColorMatrix Matrix=
+		{
+			1.0f,0.0f,0.0f,0.0f,0.0f, 
+			0.0f,1.0f,0.0f,0.0f,0.0f, 
+			0.0f,0.0f,1.0f,0.0f,0.0f,
+			0.0f,0.0f,0.0f,cbAlphaDepth/255.0f,0.0f, 
+			0.0f,0.0f,0.0f,0.0f,1.0f
+		};
+
+		//设置属性
+		ImageAttributes Attributes; 
+		Attributes.SetColorMatrix(&Matrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap); 
+
+		//绘画图像
+		graphics.DrawImage(m_pImage,rcDrawRect,(REAL)xSrc,(REAL)ySrc,(REAL)cxSrc,(REAL)cySrc,UnitPixel,&Attributes);	
+	}
+	else
+	{
+		//普通调用
+		AlphaDrawImage(pDestDC,xDest,yDest,cxDest,cyDest,xSrc,ySrc,cbAlphaDepth);
+	}
+
+	return true;
+}
+
+bool CImageEx::Draw( CDC * pDC, INT x, INT y, INT cx, INT cy,INT nLeft,INT nTop,INT nRight,INT nBottom )
+{
+	int cxImage = GetWidth();
+	int cyImage = GetHeight();
+
+	// 左上
+	{
+		RECT rcDest = {x, y, x+nLeft, y+nTop};
+		RECT rcSrc = {0, 0, nLeft, nTop};
+		if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
+			DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top, 
+			rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
+	}
+
+	// 左边
+	{
+		RECT rcDest = {x, y+nTop, x+nLeft, (y+nTop)+(cy-nTop-nBottom)};
+		RECT rcSrc = {0, nTop, nLeft, nTop+(cyImage-nTop-nBottom)};
+		if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
+			DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top, 
+			rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
+	}
+
+	// 上边
+	{
+		RECT rcDest = {x+nLeft, y,x+(cx-nRight), y+nTop};
+		RECT rcSrc = {nLeft, 0, (cxImage-nLeft-nRight), nTop};
+ 		if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
+ 			DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top, 
+ 			rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
+	}
+
+	// 右上
+	{
+		RECT rcDest = {x+(cx-nRight), y, (x+(cx-nRight))+nRight, y+nTop};
+		RECT rcSrc = {cxImage-nRight, 0, (cxImage-nRight)+nRight, nTop};
+  		if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
+  			DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top, 
+  			rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
+	}
+
+	// 右边
+	{
+		RECT rcDest = {x+(cx-nRight), y+nTop, (x+(cx-nRight))+nRight, (y+nTop)+(cy-nTop-nBottom)};
+		RECT rcSrc = {cxImage-nRight, nTop, (cxImage-nRight)+nRight, nTop+(cyImage-nTop-nBottom)};
+  		if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
+  			DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top, 
+  			rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
+	}
+
+	// 下边
+	{
+		RECT rcDest = {x+nLeft, y+(cy-nBottom), (x+nLeft)+(cx-nLeft-nRight), (y+(cy-nBottom))+nBottom};
+		RECT rcSrc = {nLeft, cyImage-nBottom, nLeft+(cxImage-nLeft-nRight), (cyImage-nBottom)+nBottom};
+ 		if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
+ 			DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top, 
+ 			rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
+	}
+
+	// 右下
+	{
+		RECT rcDest = {x+(cx-nRight), y+(cy-nBottom), (x+(cx-nRight))+nRight, (y+(cy-nBottom))+nBottom};
+		RECT rcSrc = {cxImage-nRight, cyImage-nBottom, (cxImage-nRight)+nRight, (cyImage-nBottom)+nBottom};
+ 		if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
+ 			DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top, 
+ 			rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
+	}
+
+	// 左下
+	{
+		RECT rcDest = {x, y+(cy-nBottom), x+nLeft, (y+(cy-nBottom))+nBottom};
+		RECT rcSrc = {0, cyImage-nBottom, nLeft, (cyImage-nBottom)+nBottom};
+		if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
+			DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top, 
+			rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
+	}
+
+	// 中间
+	{
+		RECT rcDest = {x+nLeft, y+nTop, x+(cx-nRight), y+(cy-nBottom)};
+		RECT rcSrc = {nLeft, nTop, cxImage-nRight, cyImage-nBottom};
+
+  		if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
+  			DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top, 
+  			rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
+	}
+
+	return TRUE;
+}
+
+bool CImageEx::Draw( CDC * pDC, const RECT& rectDest, const RECT& rectSrc )
+{
+	return Draw(pDC,rectDest.left, rectDest.top, rectDest.right-rectDest.left, rectDest.bottom-rectDest.top, 
+		rectSrc.left, rectSrc.top,rectSrc.right, rectSrc.bottom);
+}
+
+bool CImageEx::Draw( CDC * pDC, const RECT& rectDest )
+{
+	return Draw(pDC,rectDest,m_rcNinePart);
+}
+
+void CImageEx::SetNinePart( CONST LPRECT lprcNinePart )
+{
+	if( lprcNinePart == NULL ) return;
+
+	::CopyRect(&m_rcNinePart,lprcNinePart);
+}
+
+HBITMAP CImageEx::ImageToBitmap(/*HDC hDC*/) 
+{ 
+	ASSERT(m_pImage != NULL);
+	if(m_pImage == NULL) return NULL;
+
+// 	INT nHeight = GetHeight();
+// 	INT nWidth = GetWidth();
+// 
+// 	if (nWidth <= 0 || nHeight <= 0) 
+// 	{ 
+// 		return NULL;
+// 	}
+// 
+// 	BITMAPINFO bmpInfo;
+// 	bmpInfo.bmiHeader.biHeight = -(LONG)nHeight;
+// 	bmpInfo.bmiHeader.biWidth = nWidth; 
+// 	bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+// 	bmpInfo.bmiHeader.biPlanes = 1; 
+// 	bmpInfo.bmiHeader.biBitCount = 32; 
+// 	bmpInfo.bmiHeader.biCompression = BI_RGB;
+// 	bmpInfo.bmiHeader.biSizeImage = 0;
+// 	bmpInfo.bmiHeader.biXPelsPerMeter = 0;
+// 	bmpInfo.bmiHeader.biYPelsPerMeter = 0;
+// 	bmpInfo.bmiHeader.biClrUsed = 0; 
+// 	bmpInfo.bmiHeader.biClrImportant = 0; 
+// 
+// 	BYTE* pbase = NULL; 
+// 	HBITMAP hBitmap = ::CreateDIBSection(hDC, &bmpInfo, DIB_RGB_COLORS, (void**)&pbase, 0, 0);
+// 	
+// 	if (!hBitmap) return NULL;
+// 	 
+// 	return hBitmap; 
+
+	m_pImage->GetHBITMAP(Color(0,0,0),&m_hBitmap);
+
+	return m_hBitmap;
+}
+
+bool CImageEx::DrawExtrude( CDC*pDC,const RECT& rectDest,bool bLeft,int nPixel )
+{
+	//加载判断
+	ASSERT(m_pImage!=NULL);
+	if (m_pImage==NULL) return false;
+
+	//创建屏幕
+	ASSERT(pDC!=NULL);
+	Graphics graphics(pDC->GetSafeHdc());
+
+	int nWidth = rectDest.right - rectDest.left;
+	int nHeight = rectDest.bottom - rectDest.top;
+
+	if ( bLeft )
+	{
+		DrawImage(pDC,rectDest.left,rectDest.top);
+
+		if(nWidth>GetWidth())
+			DrawImage(pDC,GetWidth(),rectDest.top,(nWidth-GetWidth()),GetHeight(),GetWidth()-nPixel,0,nPixel,GetHeight());
+	}
+	else
+	{
+		if ( nWidth <=GetWidth() )
+		{
+			DrawImage(pDC,rectDest.left,rectDest.top,nWidth,GetHeight(),GetWidth()-nWidth,0,nWidth,GetHeight());
+		}
+		else
+		{
+			DrawImage(pDC,rectDest.left,rectDest.top,nWidth-GetWidth(),GetHeight(),nPixel,0,nPixel,GetHeight());
+			DrawImage(pDC,nWidth-GetWidth(),rectDest.top);
+		}
+	}
+
+	return true;
+}
+
+bool CImageEx::SetGray()
+{
+	//加载判断
+	ASSERT(m_pImage!=NULL);
+	if (m_pImage==NULL) return false;
+
+	UINT nWidth = GetWidth();
+	UINT nHeight = GetHeight();
+
+	BitmapData bmpData;
+	Rect rect(0, 0, nWidth, nHeight);
+	m_pImage->LockBits(&rect, Gdiplus::ImageLockModeRead|Gdiplus::ImageLockModeWrite, PixelFormat32bppARGB, &bmpData);
+
+	int nValue = 0;
+	BYTE * pArray = (BYTE *)bmpData.Scan0;
+	UINT nBytes = (UINT)((nWidth * nHeight) << 2);
+
+	for (UINT i = 0; i < nBytes; i += 4)
+	{
+		nValue = (int)(pArray[i] * 0.1 + pArray[i+1] * 0.2 + pArray[i+2] * 0.7);
+
+		pArray[i] = nValue;
+		pArray[i+1] = nValue;
+		pArray[i+2] = nValue;
+	}
+
+	m_pImage->UnlockBits(&bmpData);
+
+	return true;
+}
+
+//////////////////////////////////////////////////////////////////////////////////

+ 95 - 0
CTSManager/CTSManager/ImageEx.h

@@ -0,0 +1,95 @@
+#ifndef IMAGE_HEAD_FILE
+#define IMAGE_HEAD_FILE
+
+#pragma once
+
+//#include "SkinUI.h"
+//系统头文件
+#include <GdiPlus.h>
+using namespace Gdiplus;
+//////////////////////////////////////////////////////////////////////////////////
+
+//图片对象
+class CImageEx
+{
+	//变量定义
+protected:
+	Bitmap *						m_pImage;							//图片对象
+	TCHAR							m_strImageName[MAX_PATH];			//图片名称
+	RECT							m_rcNinePart;
+	HBITMAP							m_hBitmap;
+
+	//函数定义
+public:
+	//构造函数
+	CImageEx();
+	//析构函数
+	virtual ~CImageEx();
+
+	//状态函数
+public:
+	//是否加载
+	bool IsNull();
+	//获取宽度
+	INT GetWidth();
+	//获取高度
+	INT GetHeight();
+
+	//设置函数
+public:
+	//九宫格绘图
+	void SetNinePart(CONST LPRECT lprcNinePart);
+	//转HBITMAP
+	HBITMAP ImageToBitmap(/*HDC hDC*/);
+	//灰度
+	bool SetGray();
+
+	//管理函数
+public:
+	//销毁图片
+	bool DestroyImage();
+	//加载图片
+	bool LoadImage(LPCTSTR pszFileName);
+	//加载图片
+	bool LoadImage(HINSTANCE hInstance, LPCTSTR pszResourceName,LPCTSTR pszResourceType=TEXT("IMAGE"));
+
+	//绘画函数
+public:
+	//绘画图像
+	bool DrawImage(CDC * pDC, INT nXPos, INT nYPos);
+	//绘画图像
+	bool DrawImage(CDC * pDC, INT nXPos, INT nYPos, INT nDestWidth, INT nDestHeight);
+	//绘画图像
+	bool DrawImage(CDC * pDC, RECT &rc);
+	//绘画图像
+	bool DrawImage(CDC * pDC, INT nXDest, INT nYDest, INT nDestWidth, INT nDestHeight, INT nXScr, INT nYSrc);
+	//绘画图像
+	bool DrawImage(CDC * pDC, INT nXDest, INT nYDest, INT nDestWidth, INT nDestHeight, INT nXScr, INT nYSrc, INT nSrcWidth, INT nSrcHeight);
+
+	//透明绘画
+public:
+	//混合绘画
+	bool AlphaDrawImage(CDC * pDestDC, INT xDest, INT yDest, BYTE cbAlphaDepth);
+	//混合绘画
+	bool AlphaDrawImage(CDC * pDestDC, INT xDest, INT yDest, INT cxDest, INT cyDest, INT xSrc, INT ySrc, BYTE cbAlphaDepth);
+	//混合绘画
+	bool AlphaDrawImage(CDC * pDestDC, INT xDest, INT yDest, INT cxDest, INT cyDest, INT xSrc, INT ySrc, INT cxSrc, INT cySrc, BYTE cbAlphaDepth);
+
+	//区域绘制
+public:
+	//绘画图像
+	bool Draw( CDC * pDC, INT x, INT y, INT cx, INT cy,INT nLeft,INT nTop,INT nRight,INT nBottom );
+	//绘画图像
+	bool Draw( CDC * pDC, const RECT& rectDest, const RECT& rectSrc );
+	//绘画图像
+	bool Draw( CDC * pDC, const RECT& rectDest );
+
+	//拉伸绘制
+public:
+	//
+	bool DrawExtrude(CDC*pDC,const RECT& rectDest,bool bLeft=false,int nPixel=1);
+};
+
+//////////////////////////////////////////////////////////////////////////////////
+
+#endif

+ 126 - 0
CTSManager/CTSManager/ImageHelper.cpp

@@ -0,0 +1,126 @@
+#include "pch.h"
+#include "ImageHelper.h"
+#include <shlwapi.h>
+
+bool CImageHelper::SaveBitmapToFile(HBITMAP hBitmap, const std::string& filename)
+{
+	//1. 创建位图文件
+	const auto file = CreateFileA(filename.c_str(), GENERIC_WRITE,
+		0, nullptr, CREATE_ALWAYS,
+		FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
+		nullptr);
+	if (file == INVALID_HANDLE_VALUE)
+	{
+		return false;
+	}
+
+	//2. 计算位图文件每个像素所占字节数
+	const auto bitCount = GetBitmapBitCount();
+
+	//3. 获取位图结构
+	BITMAP bitmap;
+	::GetObject(hBitmap, sizeof(bitmap), reinterpret_cast<LPSTR>(&bitmap));
+
+	//位图中像素字节大小(32字节对齐)
+	const DWORD bmBitsSize = ((bitmap.bmWidth * bitCount + 31) / 32) * 4 * bitmap.bmHeight;
+
+	//调色板大小
+	const DWORD paletteSize = 0;
+
+	//4. 构造位图信息头
+	BITMAPINFOHEADER  bmpInfoHeader; //位图信息头结构
+	bmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
+	bmpInfoHeader.biWidth = bitmap.bmWidth;
+	bmpInfoHeader.biHeight = bitmap.bmHeight;
+	bmpInfoHeader.biPlanes = 1;
+	bmpInfoHeader.biBitCount = bitCount;
+	bmpInfoHeader.biCompression = BI_RGB;
+	bmpInfoHeader.biSizeImage = 0;
+	bmpInfoHeader.biXPelsPerMeter = 0;
+	bmpInfoHeader.biYPelsPerMeter = 0;
+	bmpInfoHeader.biClrImportant = 0;
+	bmpInfoHeader.biClrUsed = 0;
+
+	//5. 构造位图文件头
+	BITMAPFILEHEADER bmpFileHeader;
+	bmpFileHeader.bfType = 0x4D42; //"BM"
+	//位图文件大小
+	const DWORD dibSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + paletteSize + bmBitsSize;
+	bmpFileHeader.bfSize = dibSize;
+	bmpFileHeader.bfReserved1 = 0;
+	bmpFileHeader.bfReserved2 = 0;
+	bmpFileHeader.bfOffBits = static_cast<DWORD>(sizeof(BITMAPFILEHEADER))
+		+ static_cast<DWORD>(sizeof(BITMAPINFOHEADER)) + paletteSize;
+
+	//6. 为位图内容分配内存 
+	const auto dib = GlobalAlloc(GHND, bmBitsSize + paletteSize + sizeof(BITMAPINFOHEADER)); //内存句柄
+	const auto lpBmpInfoHeader = static_cast<LPBITMAPINFOHEADER>(GlobalLock(dib)); //指向位图信息头结构
+	*lpBmpInfoHeader = bmpInfoHeader;
+
+	//7. 处理调色板
+	ProcessPalette(hBitmap, bitmap, paletteSize, lpBmpInfoHeader);
+
+	//8. 写入文件
+	DWORD written = 0; //写入文件字节数   
+	WriteFile(file, reinterpret_cast<LPSTR>(&bmpFileHeader), sizeof(BITMAPFILEHEADER),
+		&written, nullptr); //写入位图文件头
+	WriteFile(file, reinterpret_cast<LPSTR>(lpBmpInfoHeader), dibSize,
+		&written, nullptr); //写入位图文件其余内容
+
+	//9. 清理资源
+	GlobalUnlock(dib);
+	GlobalFree(dib);
+	CloseHandle(file);
+
+	return true;
+}
+
+//计算位图文件每个像素所占字节数
+WORD CImageHelper::GetBitmapBitCount()
+{
+	const auto dc = ::CreateDCA("DISPLAY", nullptr, nullptr, nullptr);
+	//当前分辨率下每像素所占字节数
+	const auto bits = ::GetDeviceCaps(dc, BITSPIXEL) * GetDeviceCaps(dc, PLANES);
+	::DeleteDC(dc);
+
+	//位图中每像素所占字节数
+	WORD bitCount;
+	if (bits <= 1)
+		bitCount = 1;
+	else if (bits <= 4)
+		bitCount = 4;
+	else if (bits <= 8)
+		bitCount = 8;
+	else
+		bitCount = 24;
+
+	return bitCount;
+}
+
+//处理调色板
+void CImageHelper::ProcessPalette(HBITMAP hBitmap, const BITMAP& bitmap,
+	DWORD paletteSize, LPBITMAPINFOHEADER lpBmpInfoHeader)
+{
+	HANDLE oldPalette = nullptr;
+	HDC dc = nullptr;
+	const auto palette = GetStockObject(DEFAULT_PALETTE);
+	if (palette != nullptr)
+	{
+		dc = ::GetDC(nullptr);
+		oldPalette = ::SelectPalette(dc, static_cast<HPALETTE>(palette), FALSE);
+		::RealizePalette(dc); //实现设备调色板
+	}
+
+	//获取该调色板下新的像素值
+	GetDIBits(dc, hBitmap, 0, static_cast<UINT>(bitmap.bmHeight),
+		reinterpret_cast<LPSTR>(lpBmpInfoHeader) + sizeof(BITMAPINFOHEADER) + paletteSize,
+		reinterpret_cast<BITMAPINFO*>(lpBmpInfoHeader), DIB_RGB_COLORS);
+
+	//恢复调色板
+	if (oldPalette != nullptr)
+	{
+		::SelectPalette(dc, static_cast<HPALETTE>(oldPalette), TRUE);
+		::RealizePalette(dc);
+		::ReleaseDC(nullptr, dc);
+	}
+}

+ 12 - 0
CTSManager/CTSManager/ImageHelper.h

@@ -0,0 +1,12 @@
+#pragma once
+
+class CImageHelper
+{
+public:
+	static bool SaveBitmapToFile(HBITMAP bitmap, const std::string& filename); //保存位图到文件
+
+private:
+	static WORD GetBitmapBitCount(); //计算位图文件每个像素所占字节数
+	static void ProcessPalette(HBITMAP hBitmap, const BITMAP& bitmap,
+		DWORD paletteSize, LPBITMAPINFOHEADER lpBmpInfoHeader); //处理调色板
+};

+ 53 - 0
CTSManager/CTSManager/Macro.h

@@ -0,0 +1,53 @@
+#ifndef MACRO_HEAD_FILE
+#define MACRO_HEAD_FILE
+
+//////////////////////////////////////////////////////////////////////////////////
+//常用常量
+
+//无效数值
+#define INVALID_BYTE				((BYTE)(0xFF))						//无效数值
+#define INVALID_WORD				((WORD)(0xFFFF))					//无效数值
+#define INVALID_DWORD				((DWORD)(0xFFFFFFFF))				//无效数值
+
+//////////////////////////////////////////////////////////////////////////////////
+
+//数组维数
+#define CountArray(Array) (sizeof(Array)/sizeof(Array[0]))
+
+//无效地址
+#define INVALID_IP_ADDRESS(IPAddress) (((IPAddress==0L)||(IPAddress==INADDR_NONE)))
+
+//////////////////////////////////////////////////////////////////////////////////
+
+//存储长度
+#ifdef _UNICODE
+#define CountStringBuffer CountStringBufferW
+#else
+#define CountStringBuffer CountStringBufferA
+#endif
+
+//存储长度
+#define CountStringBufferA(String) ((UINT)((lstrlenA(String)+1)*sizeof(CHAR)))
+#define CountStringBufferW(String) ((UINT)((lstrlenW(String)+1)*sizeof(WCHAR)))
+
+//////////////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////
+
+//接口释放
+#define SafeRelease(pObject) { if (pObject!=NULL) { pObject->Release(); pObject=NULL; } }
+
+//删除指针
+#define SafeDelete(pData) { try { delete pData; } catch (...) { ASSERT(FALSE); } pData=NULL; } 
+
+//关闭句柄
+#define SafeCloseHandle(hHandle) { if (hHandle!=NULL) { CloseHandle(hHandle); hHandle=NULL; } }
+
+//删除数组
+#define SafeDeleteArray(pData) { try { delete [] pData; } catch (...) { ASSERT(FALSE); } pData=NULL; } 
+
+//////////////////////////////////////////////////////////////////////////////////
+//打开链接
+#define OpenLink(String)	ShellExecute(NULL, TEXT("open"), String, NULL, NULL, SW_SHOWNORMAL);
+
+#endif

+ 8 - 16
CTSManager/CTSManager/NavListCtrl.cpp

@@ -32,7 +32,6 @@ CNavListCtrl::~CNavListCtrl()
 		::DestroyIcon(m_hTailIconMobile);
 }
 
-
 BEGIN_MESSAGE_MAP(CNavListCtrl, CListCtrl)
 	//{{AFX_MSG_MAP(CNavListCtrl)
 	ON_WM_NCCALCSIZE()
@@ -47,9 +46,6 @@ BEGIN_MESSAGE_MAP(CNavListCtrl, CListCtrl)
 	ON_WM_TIMER()
 END_MESSAGE_MAP()
 
-/////////////////////////////////////////////////////////////////////////////
-// CNavListCtrl message handlers
-
 void CNavListCtrl::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp)
 {
 	// TODO: Add your message handler code here and/or call default
@@ -57,11 +53,9 @@ void CNavListCtrl::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpn
 	CListCtrl::OnNcCalcSize(bCalcValidRects, lpncsp);
 }
 
-
 void CNavListCtrl::OnNMCustomdraw(NMHDR* pNMHDR, LRESULT* pResult)
 {
 	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
-
 	LPNMLVCUSTOMDRAW lpLVCustomDraw = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
 
 	lpLVCustomDraw->clrText = RGB(58, 25, 255); // white text
@@ -84,7 +78,6 @@ void CNavListCtrl::OnNMCustomdraw(NMHDR* pNMHDR, LRESULT* pResult)
 	}
 	*/
 
-
 	// TODO: 在此添加控件通知处理程序代码
 	* pResult = 0;
 	*pResult |= CDRF_NOTIFYPOSTPAINT;
@@ -99,7 +92,6 @@ int CNavListCtrl::InsertItem(int nItem, LPCTSTR szItemText, int nImageIndex, LUS
 		pDeqListItem->push_back(*UserInfo);
 	nItem = CListCtrl::InsertItem(nItem, szItemText, nImageIndex);
 	return nItem;
-
 }
 
 void CNavListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
@@ -171,6 +163,9 @@ void CNavListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
 		break;
 	}
 
+	// 黄色选中背景要跟控件长度一样;
+	rcHighlight.right = rcClient.right - 2;
+
 	// 画背景
 	CRect rcIconBG(rcIcon);
 	rcIconBG.right += 12;
@@ -213,7 +208,6 @@ void CNavListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
 			CPoint(rcIcon.left + 6, rcIcon.top + 6), ILD_TRANSPARENT | nOvlImageMask);
 	}
 
-
 	// Draw item label - Column 0
 	rcLabel.top += 5;
 	rcLabel.left += offset / 2 + 7;
@@ -222,7 +216,6 @@ void CNavListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
 	pDC->DrawText(sLabel, -1, rcLabel, DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP
 		| DT_END_ELLIPSIS);
 
-
 	LUSERITEM userInfo;
 	GetUserItemInfo(sLabel, &userInfo);
 	CSize size = pDC->GetTextExtent(sLabel);
@@ -328,8 +321,6 @@ void CNavListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
 
 	// Restore dc
 	pDC->RestoreDC(nSavedDC);
-
-
 }
 
 CRect CNavListCtrl::GetTailIconRect(int nItem, DWORD dwServeFlag)
@@ -372,13 +363,13 @@ CRect CNavListCtrl::GetTailIconRect(int nItem, DWORD dwServeFlag)
 	}
 	return rcIcon;
 }
+
 BOOL CNavListCtrl::GetUserItemInfo(LPCTSTR szItemText, LUSERITEM* userInfo)
 {
 	ASSERT(userInfo != NULL);
 
 	BOOL bRet = FALSE;
 	DEQUELVITEM* pDeqListItem = &m_DequeList;
-
 	DEQUELVITEM::iterator it, itbegin = pDeqListItem->begin(), itend = pDeqListItem->end();
 	for (it = itbegin; it != itend; it++)
 	{
@@ -389,8 +380,8 @@ BOOL CNavListCtrl::GetUserItemInfo(LPCTSTR szItemText, LUSERITEM* userInfo)
 			break;
 		}
 	}
-	return bRet;
 
+	return bRet;
 }
 
 void CNavListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
@@ -420,12 +411,12 @@ void CNavListCtrl::MeasureItem(LPMEASUREITEMSTRUCT lpMis)
 {
 	lpMis->itemHeight = 52;
 }
+
 void CNavListCtrl::OnSize(UINT nType, int cx, int cy)
 {
 	CListCtrl::OnSize(nType, cx, cy);
 	SetColumnWidth(0, cx);
 	RedrawWindow();
-	// TODO: 在此处添加消息处理程序代码
 }
 
 BOOL CNavListCtrl::OnEraseBkgnd(CDC* pDC)
@@ -481,7 +472,8 @@ void CNavListCtrl::OnTimer(UINT_PTR nIDEvent)
 	// TODO: 在此添加消息处理程序代码和/或调用默认值
 	if (nIDEvent == 1)
 	{
-		CPoint pt(GetMessagePos()); ScreenToClient(&pt);
+		CPoint pt(GetMessagePos()); 
+		ScreenToClient(&pt);
 		CRect rc; GetClientRect(&rc);
 		if (!rc.PtInRect(pt))
 		{

+ 3 - 2
CTSManager/CTSManager/Navbar.cpp

@@ -247,6 +247,7 @@ void CNavbar::InitNavCtrl()
 	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)
@@ -306,9 +307,9 @@ void CNavbar::OnNewFolder()
 void CNavbar::OnPaint()
 {
 	CPaintDC dc(this); // 用于绘制的设备上下文
-#if 0
+#if 1
 	CRect rectTree;
-	m_wndClassView.GetWindowRect(rectTree);
+	m_DrawerCtrl.GetWindowRect(rectTree);
 	ScreenToClient(rectTree);
 
 	rectTree.InflateRect(1, 1);

+ 14 - 0
CTSManager/CTSManager/pch.cpp

@@ -3,3 +3,17 @@
 #include "pch.h"
 
 // 当使用预编译的头时,需要使用此源文件,编译才能成功。
+VOID _dprintf(CHAR* pszStr, ...)
+{
+	const int LOGLEN = 3072;
+	char szData[LOGLEN] = { 0 };
+	_stprintf_s(szData, _T("[%s %s]\n\t"), _T("Db"), CTime::GetCurrentTime().Format(_T("%H:%M:%S")).GetString());
+	int len = strlen(szData);
+	va_list args;
+	va_start(args, pszStr);
+	_vsnprintf_s(szData + len, LOGLEN - len, LOGLEN - len, pszStr, args);
+	va_end(args);
+	if (szData[strlen(szData) - 1] != '\n')
+		strcat_s(szData, "\n");
+	OutputDebugStringA(szData);
+}

+ 3 - 0
CTSManager/CTSManager/pch.h

@@ -14,6 +14,7 @@
 #include <string>
 #include <vector>
 #include "Global.h"
+#include <windows.h>
 
 // 弃用函数;
 #define DEPRECATED 0
@@ -30,4 +31,6 @@
 // 标题栏;
 #define ENABLE_TITILBAR 0
 
+extern VOID _dprintf(CHAR* pszStr, ...);
+
 #endif //PCH_H