Browse Source

注意:字节编码选择多字节时,VS2009生成出来的程序界面风格偏向XP,选择UNICODE时风格偏向Win7.

Jeff 3 years ago
parent
commit
7cb5c6ab85

+ 65 - 0
Source/OGCAssistTool/OGCAssistTool/DlgLogin.cpp

@@ -28,6 +28,8 @@ void CDlgLogin::DoDataExchange(CDataExchange* pDX)
 
 BEGIN_MESSAGE_MAP(CDlgLogin, CDialogEx)
 	ON_WM_CTLCOLOR()
+	ON_BN_CLICKED(IDOK, &CDlgLogin::OnBnClickedOk)
+	ON_BN_CLICKED(IDCANCEL, &CDlgLogin::OnBnClickedCancel)
 END_MESSAGE_MAP()
 
 
@@ -94,3 +96,66 @@ HBRUSH CDlgLogin::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
 	// TODO:  如果默认的不是所需画笔,则返回另一个画笔
 	return hbr;
 }
+
+void CDlgLogin::OnBnClickedOk()
+{
+	// TODO: 在此添加控件通知处理程序代码
+	CString strAccount, strPassword, strLine;
+	GetDlgItemText(EDIT_LINE, strLine);
+	GetDlgItemText(EDIT_ACCOUNT, strAccount);
+	GetDlgItemText(EDIT_PASSWORD, strPassword);
+
+	if ( strAccount.IsEmpty() )
+	{
+		MessageBox(_T("请输入账号"), _T("提示"), MB_OK);
+		return;
+	}
+
+	if ( strPassword.IsEmpty() )
+	{
+		MessageBox(_T("请输入密码"), _T("提示"), MB_OK);
+		return;
+	}
+
+	if ( strLine.IsEmpty() )
+	{
+		MessageBox(_T("请输入线体"), _T("提示"), MB_OK);
+		return;
+	}
+
+	GLOBAL::strLine = strLine.GetString();
+	GLOBAL::strAccount = strAccount.GetString();
+	GLOBAL::strPassword = strPassword.GetString();
+	GLOBAL::bOffline = ((CButton*)GetDlgItem(CHECK_OFFLINE))->GetCheck();
+
+#pragma region 账号密码验证
+	// 获取账号密码;
+	// 默认账号密码:OGCAssist、OGC+当前PC日期年月日;
+	if ( true )
+	{
+		if ( strAccount != _T("Assist") )
+		{
+			MessageBox(_T("账号错误"), _T("提示"), MB_OK);
+			return;
+		}
+
+		CString strDynamicPassword;
+		strDynamicPassword.Format(_T("OGC%s"), CTime::GetCurrentTime().Format(_T("%y%m%d")));
+		if ( strPassword != strDynamicPassword )
+		{
+			MessageBox(_T("密码错误"), _T("提示"), MB_OK);
+			return;
+		}
+	}
+#pragma endregion
+
+	CDialogEx::OnOK();
+}
+
+void CDlgLogin::OnBnClickedCancel()
+{
+	// TODO: 在此添加控件通知处理程序代码
+
+
+	CDialogEx::OnCancel();
+}

+ 2 - 0
Source/OGCAssistTool/OGCAssistTool/DlgLogin.h

@@ -21,4 +21,6 @@ protected:
 public:
 	virtual BOOL OnInitDialog();
 	afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
+	afx_msg void OnBnClickedOk();
+	afx_msg void OnBnClickedCancel();
 };

+ 358 - 0
Source/OGCAssistTool/OGCAssistTool/ListSortCtrl.cpp

@@ -0,0 +1,358 @@
+// ListSortCtrl.cpp : 实现文件
+//
+
+#include "stdafx.h"
+#include "ListSortCtrl.h"
+//#include "..\MD5\MD5.h"
+#include <strsafe.h>
+
+// CListSortCtrl
+bool CListSortCtrl::IsNumber( LPCTSTR pszText )
+{
+	ASSERT_VALID_STRING( pszText );
+	for( int i = 0; i < lstrlen( pszText ); i++ )
+		if( ! (_istdigit( pszText[ i ] )||pszText[ i ]=='.'||pszText[ i ]=='-') )
+			return false;
+
+	return true;
+}
+
+int CListSortCtrl::NumberCompare( LPCTSTR pszNumber1, LPCTSTR pszNumber2 )
+{
+	ASSERT_VALID_STRING( pszNumber1 );
+	ASSERT_VALID_STRING( pszNumber2 );
+
+	const float iNumber1 = _tstof( pszNumber1 );
+	const float iNumber2 = _tstof( pszNumber2 );
+
+	if( iNumber1 < iNumber2 )
+		return -1;
+
+	if( iNumber1 > iNumber2 )
+		return 1;
+
+	return 0;
+}
+
+bool CListSortCtrl::IsDate( LPCTSTR pszText )
+{
+	ASSERT_VALID_STRING( pszText );
+	// format should be 99/99/9999.
+	if( lstrlen( pszText ) != 10 )
+		return false;
+
+	return _istdigit( pszText[ 0 ] )
+		&& _istdigit( pszText[ 1 ] )
+		&& _istdigit( pszText[ 2 ] )
+		&& _istdigit( pszText[ 3 ] )
+		&& pszText[ 4 ] == _T('-')
+		&& _istdigit( pszText[ 5 ] )
+		&& _istdigit( pszText[ 6 ] )
+		&& pszText[ 7 ] == _T('-')
+		&& _istdigit( pszText[ 8 ] )
+		&& _istdigit( pszText[ 9 ] );
+}
+
+int CListSortCtrl::DateCompare( const CString& strDate1, const CString& strDate2 )
+{
+	if(strDate1.GetLength ()!=10)return -1;
+	if(strDate2.GetLength ()!=10)return -1;
+	const int iYear1 = _tstoi( strDate1.Mid( 0, 4 ) );
+	const int iYear2 = _tstoi( strDate2.Mid( 0, 4 ) );
+
+	if( iYear1 < iYear2 )
+		return -1;
+
+	if( iYear1 > iYear2 )
+		return 1;
+
+	const int iMonth1 = _tstoi( strDate1.Mid( 5, 2 ) );
+	const int iMonth2 = _tstoi( strDate2.Mid( 5, 2 ) );
+
+	if( iMonth1 < iMonth2 )
+		return -1;
+
+	if( iMonth1 > iMonth2 )
+		return 1;
+
+	const int iDay1 = _tstoi( strDate1.Mid( 8, 2 ) );
+	const int iDay2 = _tstoi( strDate2.Mid( 8, 2 ) );
+
+	if( iDay1 < iDay2 )
+		return -1;
+
+	if( iDay1 > iDay2 )
+		return 1;
+
+	return 0;
+}
+
+int  CListSortCtrl::CompareByLabel( const void *elem1, const void *elem2)
+{
+	CStringArray *p1 = (CStringArray*)elem1;
+	CStringArray *p2 = (CStringArray*)elem2;
+
+	if( IsDate( p1->ElementAt (CListSortCtrl::m_nCompareColumn) ) )
+		return CListSortCtrl::m_bSortAscending ? DateCompare( p1->ElementAt (CListSortCtrl::m_nCompareColumn), p2->ElementAt (CListSortCtrl::m_nCompareColumn) ) : DateCompare( p2->ElementAt (CListSortCtrl::m_nCompareColumn), p1->ElementAt (CListSortCtrl::m_nCompareColumn) );
+	else if( IsNumber( p1->ElementAt (CListSortCtrl::m_nCompareColumn) ) )
+		return CListSortCtrl::m_bSortAscending ? NumberCompare( p1->ElementAt (CListSortCtrl::m_nCompareColumn), p2->ElementAt (CListSortCtrl::m_nCompareColumn) ) : NumberCompare( p2->ElementAt (CListSortCtrl::m_nCompareColumn), p1->ElementAt (CListSortCtrl::m_nCompareColumn) );
+	else
+		// text.
+		return CListSortCtrl::m_bSortAscending ? lstrcmp( p1->ElementAt (CListSortCtrl::m_nCompareColumn), p2->ElementAt (CListSortCtrl::m_nCompareColumn) ) : lstrcmp( p2->ElementAt (CListSortCtrl::m_nCompareColumn), p1->ElementAt (CListSortCtrl::m_nCompareColumn) );
+
+	return true;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// 静态变量;
+INT CListSortCtrl::m_nCompareColumn = 0;
+BOOL CListSortCtrl::m_bSortAscending = FALSE;
+
+IMPLEMENT_DYNAMIC(CListSortCtrl, CListCtrl)
+
+CListSortCtrl::CListSortCtrl()
+:m_bSortSupport(TRUE)
+,m_nSortColumns(-1)
+,m_strSection(_T(""))
+,m_nNumColumns(0)
+,m_clrLightGrid(RGB(204,204,204))
+,m_clrDarkGrid(RGB(190,190,190))
+{
+	m_strSection = _T("");
+	m_nCompareColumn = -1;
+}
+
+CListSortCtrl::~CListSortCtrl()
+{
+	
+}
+
+BEGIN_MESSAGE_MAP(CListSortCtrl, CListCtrl)
+	ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, &CListSortCtrl::OnLvnColumnclick)
+	ON_NOTIFY_REFLECT(LVN_GETDISPINFO, &CListSortCtrl::OnLvnGetdispinfo)
+#ifndef __LIST_DRAW__
+	ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, &CListSortCtrl::OnNMCustomdraw)
+#endif
+	ON_WM_DESTROY()
+END_MESSAGE_MAP()
+
+// CListSortCtrl 消息处理程序
+void CListSortCtrl::PreSubclassWindow()
+{
+	// TODO: 在此添加专用代码和/或调用基类
+	ASSERT( GetStyle() & LVS_REPORT );
+	CListCtrl::PreSubclassWindow();
+	VERIFY( m_Ctrlheader.SubclassWindow( GetHeaderCtrl()->GetSafeHwnd() ) );
+}
+
+void CListSortCtrl::RemoveAll()
+{
+	DeleteAllItems();
+	for ( int i = 0; i < m_AryList.GetSize(); i++)
+	{
+		m_AryList.ElementAt(i).RemoveAll();
+	}
+	m_AryList.RemoveAll();
+}
+
+/************************************************************************/
+/*  函数:[10/21/2016 IT];
+/*  描述:;
+/*  参数:;
+/*  	[IN] :;
+/*  	[OUT] :;
+/*  	[IN/OUT] :;
+/*  返回:void;
+/*  注意:最后一个参数,必须以NULL结尾(请看示例);
+/*  示例:CListSortCtrl::SetHeadings(_T("示例1,100"),_T("示例2,100"),NULL);
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+BOOL CListSortCtrl::SetHeadings( IN LPCTSTR pszText, ... )
+{
+	if ( pszText == NULL ) return FALSE;
+
+	va_list list;
+	INT nCommaPos = 0; // 逗号位置;
+	CString strColumn = _T("");
+	va_start( list, pszText );
+	do 
+	{
+		strColumn = pszText;
+		if ( -1 != (nCommaPos = strColumn.Find(_T(","))))
+		{
+			m_strSection += strColumn.Left(nCommaPos);
+			if( InsertColumn( m_nNumColumns++, strColumn.Left(nCommaPos), LVCFMT_LEFT, _tstoi( strColumn.Mid( nCommaPos + 1) ) ) == -1 )
+			{
+				va_end( list );
+				return FALSE;
+			}
+		}
+
+		pszText = va_arg( list, LPCTSTR );
+	} while (pszText != NULL);
+
+	va_end( list );
+
+	LoadColumnInfo();
+	SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP);
+
+	SetListFont(_T("宋体"), 11);
+
+	return TRUE;
+}
+
+/************************************************************************/
+/*  函数:SetTextFont[3/6/2017 Jeff];
+/*  描述:设置文本字体;
+/*  参数:;
+/*  	[IN] nTextFontSize:字体大小;
+/*  	[IN] bBold:是否粗体;
+/*  	[IN] bItalic:是否斜体;
+/*  	[IN] strTextFontName:字体名称,如楷体;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+void CListSortCtrl::SetListFont(IN CString strFontName, IN int nFontSize, IN BOOL bBold, IN BOOL bItalic)
+{
+	LOGFONT lf;
+	CClientDC dc(this);
+	int dpy = GetDeviceCaps(dc, LOGPIXELSY); // Pixel per inch
+	lf.lfHeight = -MulDiv(nFontSize, dpy, 72);
+	lf.lfWeight = 0;
+	lf.lfEscapement = 0;
+	lf.lfOrientation = 0;
+	if (bBold)
+		lf.lfWeight = FW_BLACK;
+	else
+		lf.lfWeight = FW_NORMAL;
+	lf.lfItalic = bItalic;
+	lf.lfUnderline = FALSE;
+	lf.lfStrikeOut = 0;
+	lf.lfCharSet = ANSI_CHARSET;
+	lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
+	lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
+	lf.lfQuality = DEFAULT_QUALITY;
+	lf.lfPitchAndFamily = DEFAULT_PITCH | FF_ROMAN;
+
+	_tcscpy_s(lf.lfFaceName, strFontName);
+
+	// 创建字体;
+	//m_cfont = GetFont();// 局部变量会导致字体设置失败,必须是全局或成员变量;
+	VERIFY(m_cfont.CreateFontIndirect(&lf));
+	// 选入字体;
+	this->SetFont(&m_cfont);
+}
+
+void CListSortCtrl::OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult)
+{
+	// 不排序或无数据时退出;
+	if ( !m_bSortSupport || m_AryList.GetSize() == 0)
+		return;
+
+	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
+	m_bSortAscending = !m_bSortAscending;
+	for (int i = 0; i < m_nNumColumns; i++)
+	{
+		if( i == pNMLV->iSubItem )
+		{
+			SortByCol(i);
+			m_Ctrlheader.SetSortArrow( i, m_bSortAscending );
+		}
+	}
+	Invalidate();
+	
+	*pResult = 0;
+}
+
+void CListSortCtrl::OnLvnGetdispinfo(NMHDR *pNMHDR, LRESULT *pResult)
+{
+	NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
+	LV_ITEM *pItem = &pDispInfo->item;
+	ASSERT(pItem);
+	if (m_AryList.GetSize() > pItem->iItem && (pItem->mask & LVIF_TEXT) )//valid text buffer?
+	{
+		//_tcscpy_s(pItem->pszText, pItem->cchTextMax, m_AryList.ElementAt(pItem->iItem).ElementAt(pItem->iSubItem));
+		StringCbCopy(pItem->pszText, pItem->cchTextMax, m_AryList.ElementAt(pItem->iItem).ElementAt(pItem->iSubItem));
+	}
+	*pResult = 0;
+}
+
+#ifndef __LIST_DRAW__
+void CListSortCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
+{
+	NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
+	*pResult = 0;
+	if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
+	{
+		*pResult = CDRF_NOTIFYITEMDRAW;
+	}
+	else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
+	{
+		INT npos = pLVCD->nmcd.dwItemSpec;
+		if ( npos % 2 )
+			pLVCD->clrTextBk = m_clrLightGrid;
+		else 
+			pLVCD->clrTextBk = m_clrDarkGrid;
+
+		*pResult = CDRF_DODEFAULT;
+	}
+}
+#endif
+
+void CListSortCtrl::SortByCol(IN const int nColIndex)
+{
+	m_nCompareColumn = nColIndex;
+	::AfxGetApp()->DoWaitCursor(TRUE);
+	qsort( static_cast<void*>(&m_AryList[0]), m_AryList.GetSize(), sizeof(m_AryList[nColIndex]), CompareByLabel);
+	::AfxGetApp()->DoWaitCursor(FALSE);
+}
+
+void CListSortCtrl::LoadColumnInfo()
+{
+	ASSERT( m_nNumColumns > 0 );
+	UINT nBytes = 0;
+	BYTE* buf = NULL;
+	//CMD5 md5;
+	//md5.SetBYTEText((BYTE*)m_strSection.GetString(), m_strSection.GetLength()*sizeof(TCHAR));
+	//m_strSection = md5.GetMD5Digest();
+
+	if( AfxGetApp()->GetProfileBinary( _T("sortlist"), m_strSection, &buf, &nBytes ) )
+	{
+		if( nBytes > 0 )
+		{
+			CMemFile memFile( buf, nBytes );
+			CArchive ar( &memFile, CArchive::load );
+			m_Ctrlheader.Serialize( ar );
+			ar.Close();
+			m_Ctrlheader.Invalidate();
+		}
+		delete[] buf;
+	}
+}
+
+void CListSortCtrl::SaveColumnInfo()
+{
+	ASSERT( m_nNumColumns > 0 );
+	CMemFile memFile;
+	CArchive ar( &memFile, CArchive::store );
+	m_Ctrlheader.Serialize( ar );
+	ar.Close();
+	DWORD dwLen = memFile.GetLength();
+	BYTE* buf = memFile.Detach();	
+	VERIFY( AfxGetApp()->WriteProfileBinary( _T("sortlist"), m_strSection, buf, dwLen ) );
+	free( buf );
+}
+
+void CListSortCtrl::OnDestroy()
+{
+	SaveColumnInfo();
+	CListCtrl::OnDestroy();
+}

+ 98 - 0
Source/OGCAssistTool/OGCAssistTool/ListSortCtrl.h

@@ -0,0 +1,98 @@
+/************************************************************************/
+/*  Copyright (C), 2016-2020, [IT], 保留所有权利;
+/*  模 块 名:;
+/*  描    述:;
+/*
+/*  版    本:[V];	
+/*  作    者:[IT];
+/*  日    期:[10/21/2016];
+/*
+/*
+/*  注    意:;
+/*
+/*  修改记录:[IT];
+/*  修改日期:;
+/*  修改版本:;
+/*  修改内容:;
+/************************************************************************/
+#ifndef __LIST_SORT_CTRL__
+#define __LIST_SORT_CTRL__
+#pragma once
+
+// CListSortCtrl
+#include "SortHeaderCtrl.h"
+
+#ifdef _DEBUG
+#define ASSERT_VALID_STRING( str ) ASSERT( !IsBadStringPtr( str, 0xfffff ) )
+#else	//	_DEBUG
+#define ASSERT_VALID_STRING( str ) ( (void)0 )
+#endif	//	_DEBUG
+
+class CListSortCtrl : public CListCtrl
+{
+	DECLARE_DYNAMIC(CListSortCtrl)
+
+public:
+	CListSortCtrl();
+	virtual ~CListSortCtrl();
+
+protected:
+	DECLARE_MESSAGE_MAP()
+	virtual void PreSubclassWindow();
+
+public:
+	// 数据;
+	CArray<CStringArray, CStringArray> m_AryList;
+	// 是否支持排序;
+	BOOL		m_bSortSupport;
+	// 列表字体;
+	CFont		m_cfont;
+	LOGFONT		m_logfont;
+	// 浅色;
+	COLORREF	m_clrLightGrid;
+	// 深色;
+	COLORREF	m_clrDarkGrid;
+	// 排序的序;
+	static INT	m_nCompareColumn;
+	// 升降序;
+	static BOOL	m_bSortAscending;
+	// 列表头控件;
+	CSortHeaderCtrl	m_Ctrlheader;
+
+	// 设置list列信息;
+	BOOL SetHeadings( IN LPCTSTR pszText, ... );
+	// 设置字体;
+	void SetListFont(IN CString strFontName, IN int nFontSize, IN BOOL bBold = FALSE, IN BOOL bItalic =  FALSE);
+
+	static bool IsNumber( LPCTSTR pszText );
+	static int NumberCompare( LPCTSTR pszNumber1, LPCTSTR pszNumber2 );
+	static bool IsDate( LPCTSTR pszText );
+	static int DateCompare( const CString& strDate1, const CString& strDate2 );
+	static int __cdecl CompareByLabel( const void *elem1, const void *elem2);
+private:
+	// 列表注册表键名;
+	CString		m_strSection;
+	// 列数;
+	INT			m_nNumColumns;
+	// 要排序的列;
+	INT			m_nSortColumns;
+
+protected:
+	// 选择排序的列;
+	void SortByCol(IN const INT nColIndex);
+	// 加载列信息;
+	void LoadColumnInfo();
+	// 保存列信息;
+	void SaveColumnInfo();
+public:
+	void RemoveAll();
+	afx_msg void OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult);
+	afx_msg void OnLvnGetdispinfo(NMHDR *pNMHDR, LRESULT *pResult);
+#ifndef __LIST_DRAW__
+	afx_msg void OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult);
+#endif
+	afx_msg void OnDestroy();
+};
+
+
+#endif // __LIST_SORT_CTRL__

+ 18 - 16
Source/OGCAssistTool/OGCAssistTool/OGCAssistTool.rc

@@ -118,22 +118,23 @@ STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
 EXSTYLE WS_EX_STATICEDGE
 FONT 8, "MS Shell Dlg", 400, 0, 0x1
 BEGIN
-    DEFPUSHBUTTON   "确定",IDOK,388,301,50,14
-    PUSHBUTTON      "取消",IDCANCEL,674,301,50,14
-    PUSHBUTTON      "调试",IDC_BUTTON1,7,301,50,14
-    GROUPBOX        "参数",IDC_STATIC,7,7,717,33
-    EDITTEXT        IDC_EDIT1,50,18,96,14,ES_AUTOHSCROLL
-    LTEXT           "线体:",IDC_STATIC,24,21,25,8
-    EDITTEXT        IDC_EDIT2,187,18,96,14,ES_AUTOHSCROLL
-    LTEXT           "BOM:",IDC_STATIC,159,21,24,8
-    CONTROL         "锁定",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,285,20,32,10
-    LTEXT           "?E标准值:",IDC_STATIC,425,20,42,8
-    LTEXT           "?E类型:",IDC_STATIC,330,21,34,8
-    COMBOBOX        IDC_COMBO1,364,18,48,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
-    EDITTEXT        IDC_EDIT3,463,17,50,14,ES_AUTOHSCROLL
-    CONTROL         "",IDC_SPIN1,"msctls_updown32",UDS_ARROWKEYS,513,17,11,14
-    EDITTEXT        IDC_EDIT4,570,18,96,14,ES_AUTOHSCROLL
-    LTEXT           "SN:",IDC_STATIC,542,21,18,8
+    GROUPBOX        "参数",IDC_STATIC,7,7,717,31
+    EDITTEXT        IDC_EDIT1,41,18,96,14,ES_AUTOHSCROLL
+    LTEXT           "线体:",IDC_STATIC,15,21,25,8
+    EDITTEXT        IDC_EDIT2,175,18,96,14,ES_AUTOHSCROLL
+    LTEXT           "BOM:",IDC_STATIC,151,21,24,8
+    CONTROL         "锁定",CHECK_LOCK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,274,20,32,10,WS_EX_TRANSPARENT
+    LTEXT           "▲E标准值:",IDC_STATIC,418,21,43,8
+    LTEXT           "▲E类型:",IDC_STATIC,318,21,35,8
+    COMBOBOX        IDC_COMBO1,353,18,48,80,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+    EDITTEXT        IDC_EDIT3,463,18,48,14,ES_AUTOHSCROLL
+    CONTROL         "",IDC_SPIN1,"msctls_updown32",UDS_ARROWKEYS,512,18,11,14
+    EDITTEXT        IDC_EDIT4,563,18,154,14,ES_AUTOHSCROLL
+    LTEXT           "SN:",IDC_STATIC,542,21,17,8
+    CONTROL         "",LIST_DEBUG_DATA,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,73,717,242
+    GROUPBOX        "结果:",IDC_STATIC,7,39,717,31
+    LTEXT           "▲E平均值:",IDC_STATIC,15,53,43,8
+    EDITTEXT        IDC_EDIT5,64,50,73,14,ES_AUTOHSCROLL
 END
 
 PAGE_LOG DIALOGEX 0, 0, 732, 322
@@ -242,6 +243,7 @@ BEGIN
     BEGIN
         LEFTMARGIN, 7
         RIGHTMARGIN, 724
+        VERTGUIDE, 137
         TOPMARGIN, 7
         BOTTOMMARGIN, 315
     END

+ 42 - 38
Source/OGCAssistTool/OGCAssistTool/OGCAssistTool.vcproj

@@ -185,10 +185,6 @@
 			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
 			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
 			>
-			<File
-				RelativePath=".\DlgLogin.cpp"
-				>
-			</File>
 			<File
 				RelativePath=".\OGCAssistTool.cpp"
 				>
@@ -197,22 +193,6 @@
 				RelativePath=".\OGCAssistToolDlg.cpp"
 				>
 			</File>
-			<File
-				RelativePath=".\PageConfig.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\PageDebug.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\PageLog.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\PageStatistics.cpp"
-				>
-			</File>
 			<File
 				RelativePath=".\stdafx.cpp"
 				>
@@ -240,69 +220,93 @@
 			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
 			>
 			<File
-				RelativePath=".\DlgLogin.h"
+				RelativePath=".\OGCAssistTool.h"
 				>
 			</File>
 			<File
-				RelativePath=".\OGCAssistTool.h"
+				RelativePath=".\OGCAssistToolDlg.h"
 				>
 			</File>
 			<File
-				RelativePath=".\OGCAssistToolDlg.h"
+				RelativePath=".\Resource.h"
 				>
 			</File>
 			<File
-				RelativePath=".\PageConfig.h"
+				RelativePath=".\stdafx.h"
 				>
 			</File>
 			<File
-				RelativePath=".\PageDebug.h"
+				RelativePath=".\targetver.h"
 				>
 			</File>
+		</Filter>
+		<Filter
+			Name="×ÊÔ´Îļþ"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+			>
 			<File
-				RelativePath=".\PageLog.h"
+				RelativePath=".\res\logo.bmp"
 				>
 			</File>
 			<File
-				RelativePath=".\PageStatistics.h"
+				RelativePath=".\res\OGCAssistTool.ico"
 				>
 			</File>
 			<File
-				RelativePath=".\Resource.h"
+				RelativePath=".\OGCAssistTool.rc"
 				>
 			</File>
 			<File
-				RelativePath=".\stdafx.h"
+				RelativePath=".\res\OGCAssistTool.rc2"
 				>
 			</File>
 			<File
-				RelativePath=".\targetver.h"
+				RelativePath=".\res\tab.bmp"
 				>
 			</File>
 		</Filter>
 		<Filter
-			Name="×ÊÔ´Îļþ"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+			Name="Page"
 			>
 			<File
-				RelativePath=".\res\logo.bmp"
+				RelativePath=".\DlgLogin.cpp"
 				>
 			</File>
 			<File
-				RelativePath=".\res\OGCAssistTool.ico"
+				RelativePath=".\DlgLogin.h"
 				>
 			</File>
 			<File
-				RelativePath=".\OGCAssistTool.rc"
+				RelativePath=".\PageConfig.cpp"
 				>
 			</File>
 			<File
-				RelativePath=".\res\OGCAssistTool.rc2"
+				RelativePath=".\PageConfig.h"
 				>
 			</File>
 			<File
-				RelativePath=".\res\tab.bmp"
+				RelativePath=".\PageDebug.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\PageDebug.h"
+				>
+			</File>
+			<File
+				RelativePath=".\PageLog.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\PageLog.h"
+				>
+			</File>
+			<File
+				RelativePath=".\PageStatistics.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\PageStatistics.h"
 				>
 			</File>
 		</Filter>

+ 19 - 2
Source/OGCAssistTool/OGCAssistTool/OGCAssistToolDlg.cpp

@@ -106,6 +106,10 @@ BOOL COGCAssistToolDlg::OnInitDialog()
 	// TODO: 在此添加额外的初始化代码
 	//SetBackgroundImage(IDB_LOGO);
 	//SetBackgroundColor(RGB(255,255,255));
+	if ( GLOBAL::bOffline )
+	{
+
+	}
 	InitTabCtrl();
 
 	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
@@ -162,9 +166,22 @@ HCURSOR COGCAssistToolDlg::OnQueryDragIcon()
 
 void COGCAssistToolDlg::InitTabCtrl()
 {
-	BOOL bResult;
 	static CFont font;// 必须全局或成员或静态,局部变量无效异常;
-	bResult = font.CreateFont(50, 20, 0, 0, 800, FALSE, 0, 0, 1, 0, 0, 0, 0, _T("Arial"));
+	VERIFY(font.CreateFont(
+		39,                        // nHeight
+		0,                         // nWidth
+		0,                         // nEscapement
+		0,                         // nOrientation
+		FW_NORMAL,                 // nWeight
+		FALSE,                     // bItalic
+		FALSE,                     // bUnderline
+		0,                         // cStrikeOut
+		ANSI_CHARSET,              // nCharSet
+		OUT_DEFAULT_PRECIS,        // nOutPrecision
+		CLIP_DEFAULT_PRECIS,       // nClipPrecision
+		DEFAULT_QUALITY,           // nQuality
+		DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
+		_T("Arial")));             
 	m_tabCtrl.SetFont(&font); 
 
 	m_ImageList.Create(IDB_TAB, 32, 1, RGB(255,255,255) );

+ 49 - 0
Source/OGCAssistTool/OGCAssistTool/PageDebug.cpp

@@ -23,10 +23,12 @@ CPageDebug::~CPageDebug()
 void CPageDebug::DoDataExchange(CDataExchange* pDX)
 {
 	CDialogEx::DoDataExchange(pDX);
+	DDX_Control(pDX, LIST_DEBUG_DATA, m_ctrlList);
 }
 
 
 BEGIN_MESSAGE_MAP(CPageDebug, CDialogEx)
+	ON_WM_CTLCOLOR()
 END_MESSAGE_MAP()
 
 
@@ -38,6 +40,53 @@ BOOL CPageDebug::OnInitDialog()
 
 	// TODO:  在此添加额外的初始化
 	SetBackgroundColor(RGB(255,255,255));
+	InitListCtrl();
 	return TRUE;  // return TRUE unless you set the focus to a control
 	// 异常: OCX 属性页应返回 FALSE
 }
+
+HBRUSH CPageDebug::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
+{
+	HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
+
+	// TODO:  在此更改 DC 的任何属性
+	switch ( pWnd->GetDlgCtrlID() ) 
+	{
+	case CHECK_LOCK:
+		{
+#if 1 // 透明控件处理;
+			pDC->SetBkMode(TRANSPARENT);
+
+			CRect rc;
+			pWnd->GetWindowRect(&rc);
+			ScreenToClient(&rc);
+
+			CDC* dc = GetDC();
+			pDC->BitBlt(0,0,rc.Width(),rc.Height(),dc,rc.left,rc.top,SRCCOPY);  //把父窗口背景图片先画到按钮上
+
+			ReleaseDC(dc);
+			hbr = (HBRUSH) ::GetStockObject(NULL_BRUSH);
+#endif
+		}
+		break;
+	default:
+		break; 
+	}
+
+	// TODO:  如果默认的不是所需画笔,则返回另一个画笔
+	return hbr;
+}
+
+void CPageDebug::InitListCtrl()
+{
+	m_ctrlList.InsertColumn( 0, _T("序号"));
+	m_ctrlList.SetColumnWidth( 0, 50 );
+	m_ctrlList.InsertColumn( 1, _T("R"));
+	m_ctrlList.SetColumnWidth( 1, 100 );
+	m_ctrlList.InsertColumn( 2, _T("G"));
+	m_ctrlList.SetColumnWidth( 2, 100);
+	m_ctrlList.InsertColumn( 3, _T("B"));
+	m_ctrlList.SetColumnWidth( 3, 100);
+	m_ctrlList.InsertColumn( 4, _T("▲E实际值"));
+	m_ctrlList.SetColumnWidth(4, 100);
+}

+ 4 - 0
Source/OGCAssistTool/OGCAssistTool/PageDebug.h

@@ -1,4 +1,5 @@
 #pragma once
+#include "afxcmn.h"
 
 
 // CDlgDebug ¶Ô»°¿ò
@@ -20,4 +21,7 @@ protected:
 	DECLARE_MESSAGE_MAP()
 public:
 	virtual BOOL OnInitDialog();
+	afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
+	CListCtrl m_ctrlList;
+	void InitListCtrl();
 };

+ 124 - 0
Source/OGCAssistTool/OGCAssistTool/SkinStatic.cpp

@@ -0,0 +1,124 @@
+
+#include "stdafx.h"
+#include "SkinStatic.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+// CSkinStatic
+
+CSkinStatic::CSkinStatic()
+{
+	m_nX=0;
+	m_nY=0;
+	m_strText="";
+	m_pFont = NULL;
+	//m_pFont.CreateFont(
+	//	15,                        // nHeight
+	//	0,                         // nWidth
+	//	0,                         // nEscapement
+	//	0,                         // nOrientation
+	//	FW_BOLD,                 // nWeight
+	//	FALSE,                     // bItalic
+	//	FALSE,                     // bUnderline
+	//	0,                         // cStrikeOut
+	//	ANSI_CHARSET,              // nCharSet
+	//	OUT_DEFAULT_PRECIS,        // nOutPrecision
+	//	CLIP_DEFAULT_PRECIS,       // nClipPrecision
+	//	DEFAULT_QUALITY,           // nQuality
+	//	DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
+	//	_T("Arial"));                 // lpszFacename
+}
+
+CSkinStatic::~CSkinStatic()
+{
+}
+
+
+BEGIN_MESSAGE_MAP(CSkinStatic, CStatic)
+	//{{AFX_MSG_MAP(CSkinStatic)
+	ON_WM_PAINT()
+	//}}AFX_MSG_MAP
+END_MESSAGE_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// CSkinStatic message handlers
+void CSkinStatic::LoadBitmap(LPCTSTR szImagePath)
+{
+	m_bmpStatic.LoadImage(szImagePath); 
+}
+
+void CSkinStatic::OnPaint() 
+{
+	CPaintDC dc(this); // device context for painting
+	CRect rcClient;
+	GetClientRect(&rcClient);
+	if (m_bmpStatic.m_hObject !=0)
+		m_bmpStatic.ExtendDraw(&dc,rcClient,m_nX,m_nY); 
+
+	CRect rc = rcClient;
+	rc.left = m_nTextStart;
+	DrawText(&dc, rc, m_strText);
+}
+
+BOOL CSkinStatic::OnCommand(WPARAM wParam, LPARAM lParam) 
+{
+	GetParent()->SendMessage(WM_COMMAND,wParam,lParam); 	
+	return CStatic::OnCommand(wParam, lParam);
+}
+
+void CSkinStatic::SetText(CString strText, int nStart, COLORREF cr)
+{
+	m_strText = strText;
+	m_nTextStart = nStart;
+	m_crText = cr;
+	Invalidate();
+}
+
+BOOL CSkinStatic::DrawText(CDC *pDC,CRect rc ,CString strText)
+{
+	CRect r;
+	CString str;
+	CRect rcButton;
+	if (strText.GetLength() )
+	{
+		if(m_pFont == NULL)
+			m_pFont = GetParent()->GetFont();
+
+		pDC->SelectObject(m_pFont);
+		pDC->SetTextColor(m_crText);
+		pDC->SetBkMode(TRANSPARENT);
+		pDC->DrawText( strText, rc, DT_SINGLELINE | DT_VCENTER );
+	}
+
+	return TRUE;
+}
+
+void CSkinStatic::Redraw(CDC *pDC)
+{
+	CRect rc = GetRectInParent();
+	if (m_bmpStatic.m_hObject !=0)
+		m_bmpStatic.ExtendDraw(pDC,rc,m_nX,m_nY); 
+	CRect rcText = rc;
+	rcText.left += m_nTextStart;
+	DrawText(pDC,rcText,m_strText);
+}
+
+CRect CSkinStatic::GetRectInParent()
+{
+	CRect rcWindowParent;
+	GetParent()->GetWindowRect(rcWindowParent);//client
+	CRect rcWindow;
+	GetWindowRect(&rcWindow);
+	CRect rect;
+	rect.left = rcWindow.left-rcWindowParent.left;
+	rect.top = rcWindow.top-rcWindowParent.top;
+	rect.right = rcWindow.right-rcWindowParent.left;
+	rect.bottom = rcWindow.bottom-rcWindowParent.top;
+
+	return rect;
+}

+ 69 - 0
Source/OGCAssistTool/OGCAssistTool/SkinStatic.h

@@ -0,0 +1,69 @@
+/************************************************************************/
+/*  Copyright (C), 2016-2020, [IT], 保留所有权利;
+/*  模 块 名:;
+/*  描    述:;
+/*
+/*  版    本:[V];	
+/*  作    者:[IT];
+/*  日    期:[8/19/2016];
+/*
+/*
+/*  注    意:;
+/*
+/*  修改记录:[IT];
+/*  修改日期:;
+/*  修改版本:;
+/*  修改内容:;
+/************************************************************************/
+#ifndef __SKIN_STATIC_20160824__
+#define __SKIN_STATIC_20160824__
+
+#include "EnBitmap.h"	// Added by ClassView
+#pragma once
+
+class CSkinStatic : public CStatic
+{
+public:
+	CSkinStatic();
+	virtual ~CSkinStatic();
+protected:
+	virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
+
+public:
+	void	SetText(CString strText,int nStart = 0,COLORREF cr = RGB(0,0,0));
+	void	SetExtendPoint(int nX,int nY)
+	{
+		m_nX=nX;
+		m_nY=nY;
+	}
+
+	void	SetFont(CFont *pFont){m_pFont = pFont;}
+	BOOL	DrawText(CDC *pDC,CRect rc ,CString strText);
+	void	Redraw(CDC *pDC);
+	
+	void	LoadBitmap(LPCTSTR szImagePath);
+	int		Width()
+	{
+		return m_bmpStatic.GetWidth();
+	}
+
+	int		Height()
+	{
+		return m_bmpStatic.GetHeight();
+	}
+	CRect	GetRectInParent();
+
+	CEnBitmap	m_bmpStatic;
+	CString		m_strText;
+	CFont		*m_pFont;
+	int			m_nTextStart;
+	COLORREF	m_crText;
+
+protected:
+	int			m_nX;
+	int			m_nY;
+	afx_msg void OnPaint();
+	DECLARE_MESSAGE_MAP()
+};
+
+#endif // __SKIN_STATIC_20160824__

+ 352 - 0
Source/OGCAssistTool/OGCAssistTool/SortHeaderCtrl.cpp

@@ -0,0 +1,352 @@
+#include "stdafx.h"
+#include "SortHeaderCtrl.h"
+
+CSortHeaderCtrl::CSortHeaderCtrl(): m_nSortColumn( -1 ), m_bSortAscending( TRUE )
+{
+	m_bPressMoused		= FALSE;
+	//m_clrColumText		= RGB(255,255,255);
+	//m_clr3DHighLight	= RGB(220, 220, 220);	//::GetSysColor(COLOR_3DHIGHLIGHT);
+	//m_clr3DShadow		= RGB(35, 35, 35);		//::GetSysColor(COLOR_3DSHADOW);
+	//m_clr3DFace			= RGB(128, 128, 128);	//::GetSysColor(COLOR_3DFACE);
+
+	m_clrColumText		= RGB(7,30,129);
+	m_clr3DHighLight	= RGB(107, 201, 255);	//::GetSysColor(COLOR_3DHIGHLIGHT);
+	m_clr3DShadow		= RGB(37, 121, 176);		//::GetSysColor(COLOR_3DSHADOW);
+	m_clr3DFace			= RGB(105, 201, 255);	//::GetSysColor(COLOR_3DFACE);
+}
+
+CSortHeaderCtrl::~CSortHeaderCtrl()
+{
+}
+
+BEGIN_MESSAGE_MAP(CSortHeaderCtrl, CHeaderCtrl)
+	ON_WM_PAINT()
+	ON_WM_ERASEBKGND()
+END_MESSAGE_MAP()
+
+/************************************************************************/
+/*  函数:SetSortArrow[10/20/2016 IT];
+/*  描述:设置要排序的列以及排序方式(升序或降序);
+/*  参数:;
+/*  	[IN] :;
+/*  	[OUT] :;
+/*  	[IN/OUT] :;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+void CSortHeaderCtrl::SetSortArrow( IN const int nSortColumn, IN const BOOL bSortAscending )
+{
+	m_nSortColumn = nSortColumn;
+	m_bSortAscending = bSortAscending;
+
+	// 设置项自绘风格;
+	HD_ITEM hditem;
+	hditem.mask = HDI_FORMAT;
+	// 获取列信息;
+	VERIFY( GetItem( nSortColumn, &hditem ) );
+	// 设置自绘风格;
+	hditem.fmt |= HDF_OWNERDRAW;
+	// 设置列信息;
+	VERIFY( SetItem( nSortColumn, &hditem ) );
+
+	// 更新表头以便重绘;
+	Invalidate();
+}
+
+BOOL CSortHeaderCtrl::OnEraseBkgnd(CDC* pDC)
+{
+	return TRUE;
+}
+
+void CSortHeaderCtrl::OnPaint()
+{
+	CPaintDC dc(this); // device context for painting
+
+	int nItems = GetItemCount();
+	ASSERT(nItems >= 0);
+	dc.SetBkColor(m_clr3DFace);
+	dc.SetTextColor(m_clrColumText);
+
+	CRect rectClip;
+	if (dc.GetClipBox(&rectClip) == ERROR)
+		return;
+	dc.FillSolidRect(rectClip, m_clr3DFace);
+
+	// 获取当前鼠标位置;
+	POINT point;
+	GetCursorPos(&point);
+	ScreenToClient(&point);
+
+	CRect rectItem;
+	for(int i = 0; i < nItems; i++)
+	{
+		TCHAR szText[256];
+		HD_ITEM hditem;
+
+		hditem.mask = HDI_TEXT | HDI_FORMAT | HDI_ORDER;
+		hditem.pszText = szText;
+		hditem.cchTextMax = 255;
+		GetItem( i, &hditem );
+
+		DRAWITEMSTRUCT DrawItemStruct;
+		GetItemRect(i, &rectItem);
+
+		DrawItemStruct.CtlType        = ODT_BUTTON;
+		DrawItemStruct.hDC            = dc.GetSafeHdc();
+		DrawItemStruct.itemAction     = ODA_DRAWENTIRE; 
+		DrawItemStruct.hwndItem       = GetSafeHwnd(); 
+		DrawItemStruct.rcItem         = rectItem;
+		DrawItemStruct.itemID         = i;
+		if ( rectItem.PtInRect(point) && m_bPressMoused )
+			DrawItemStruct.itemState = ODS_SELECTED;
+		DrawItemEx(&DrawItemStruct);
+	}
+}
+
+/************************************************************************/
+/*  函数:DrawItemEx[10/19/2016 IT];
+/*  描述:自绘函数;
+/*  参数:;
+/*  	[IN] :;
+/*  	[OUT] :;
+/*  	[IN/OUT] :;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+void CSortHeaderCtrl::DrawItemEx( IN LPDRAWITEMSTRUCT lpDrawItemStruct )
+{
+	// 定义设备上下文;
+	CDC dc;	
+	// 附加设备上下文句柄;
+	VERIFY( dc.Attach( lpDrawItemStruct->hDC ) );
+
+	// 保存设备上下文;
+	const int nSavedDC = dc.SaveDC();
+
+	// 获取当前列区域;
+	CRect rc( lpDrawItemStruct->rcItem );
+
+	// 实现列单元格3D效果;
+	dc.Draw3dRect(rc, m_clr3DHighLight, m_clr3DShadow);
+	rc.InflateRect(-1,-1);
+	dc.FillSolidRect(rc, m_clr3DFace);
+	dc.SetBkMode(TRANSPARENT);
+
+	// 设置文本颜色;
+	dc.SetTextColor(m_clrColumText);
+
+	// 恢复原大小;
+	rc = lpDrawItemStruct->rcItem;
+
+	// 获取当前的列的项目信息;
+	TCHAR szText[ 256 ];
+	HD_ITEM hditem;
+	hditem.mask = HDI_TEXT | HDI_FORMAT;
+	hditem.pszText = szText;
+	hditem.cchTextMax = 255;
+	VERIFY( GetItem( lpDrawItemStruct->itemID, &hditem ) );
+
+	// 设置列的文本绘制格式;
+	UINT uFormat = DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER | DT_END_ELLIPSIS ;
+
+	if( hditem.fmt & HDF_CENTER)
+		uFormat |= DT_CENTER;
+	else if( hditem.fmt & HDF_RIGHT)
+		uFormat |= DT_RIGHT;
+	else
+		uFormat |= DT_LEFT;
+
+	// 如果鼠标在列区域按下,则重新调整列区域;
+	if( lpDrawItemStruct->itemState == ODS_SELECTED )
+	{
+		rc.left++;
+		rc.top += 2;
+		rc.right++;
+		// 释放鼠标按下标志;
+		m_bPressMoused = FALSE;
+	}
+
+	// 箭头图标区域(rcIcon);
+	CRect rcIcon( lpDrawItemStruct->rcItem );
+	const int nOffset = ( rcIcon.bottom - rcIcon.top ) / 4;
+
+	// adjust the rect further if the sort arrow is to be displayed.
+	if( lpDrawItemStruct->itemID == (UINT)m_nSortColumn )
+		rc.right -= 3 * nOffset;
+
+	rc.left += nOffset;
+	rc.right -= nOffset;
+
+	// 绘制列文本;
+	if( rc.left < rc.right )
+		dc.DrawText( szText, -1, rc, uFormat );
+
+	// 绘制排序箭头;
+	if( lpDrawItemStruct->itemID == (UINT)m_nSortColumn )
+	{
+		// 定义绘制箭头的画笔;
+		CPen penLight( PS_SOLID, 1, GetSysColor( COLOR_3DHILIGHT ) );
+		CPen penShadow( PS_SOLID, 1, GetSysColor( COLOR_3DSHADOW ) );
+		CPen* pOldPen = dc.SelectObject( &penLight );
+
+		if( m_bSortAscending )
+		{
+			// 绘制向上的箭头;
+			dc.MoveTo( rcIcon.right - 2 * nOffset, nOffset);
+			dc.LineTo( rcIcon.right - nOffset, rcIcon.bottom - nOffset - 1 );
+			dc.LineTo( rcIcon.right - 3 * nOffset - 2, rcIcon.bottom - nOffset - 1 );
+			dc.SelectObject( &penShadow );
+			dc.MoveTo( rcIcon.right - 3 * nOffset - 1, rcIcon.bottom - nOffset - 1 );
+			dc.LineTo( rcIcon.right - 2 * nOffset, nOffset - 1);		
+		}
+		else
+		{
+			// 绘制向下的箭头;
+			dc.MoveTo( rcIcon.right - nOffset - 1, nOffset );
+			dc.LineTo( rcIcon.right - 2 * nOffset - 1, rcIcon.bottom - nOffset );
+			dc.SelectObject( &penShadow );
+			dc.MoveTo( rcIcon.right - 2 * nOffset - 2, rcIcon.bottom - nOffset );
+			dc.LineTo( rcIcon.right - 3 * nOffset - 1, nOffset );
+			dc.LineTo( rcIcon.right - nOffset - 1, nOffset );		
+		}
+
+		// 恢复原来选择的画笔;
+		dc.SelectObject( pOldPen );
+	}
+
+	// 恢复之前的设备上下文;
+	VERIFY( dc.RestoreDC( nSavedDC ) );
+
+	// 返回之前,分离设备上下文句柄;
+	dc.Detach();
+}
+
+/************************************************************************/
+/*  函数:[10/20/2016 IT];
+/*  描述:;
+/*  参数:;
+/*  	[IN] :;
+/*  	[OUT] :;
+/*  	[IN/OUT] :;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+void CSortHeaderCtrl::Serialize( CArchive& ar )
+{
+	try
+	{
+		if( ar.IsStoring() )
+		{
+			const int nItemCount = GetItemCount();
+			if( nItemCount != -1 )
+			{
+				ar << nItemCount;
+
+				HD_ITEM hdItem = { 0 };
+				hdItem.mask = HDI_WIDTH | HDI_ORDER;
+				for( int i = 0; i < nItemCount; i++ )
+				{
+					VERIFY( GetItem( i, &hdItem ) );
+					ar << hdItem.cxy;
+					ar << hdItem.iOrder;
+				}
+			}
+		}
+		else
+		{
+			int nItemCount;
+			ar >> nItemCount;
+
+			if( GetItemCount() != nItemCount )
+				TRACE( _T("Different number of columns in registry.") );
+			else
+			{
+				HD_ITEM hdItem = { 0 };
+				hdItem.mask = HDI_WIDTH | HDI_ORDER;
+
+				for( int i = 0; i < nItemCount; i++ )
+				{
+					ar >> hdItem.cxy;
+					ar >> hdItem.iOrder;
+					VERIFY( SetItem( i, &hdItem ) );
+				}
+			}
+		}
+	}
+	catch(...)
+	{
+	}
+}
+
+BOOL CSortHeaderCtrl::PreTranslateMessage(MSG* pMsg)
+{
+	// TODO: 在此添加专用代码和/或调用基类
+	if ( pMsg->message == WM_LBUTTONDOWN )
+	{
+		m_bPressMoused = TRUE;
+	}
+
+	return CHeaderCtrl::PreTranslateMessage(pMsg);
+}
+
+/************************************************************************/
+/*  函数:SetTextFont[3/6/2017 Jeff];
+/*  描述:设置文本字体;
+/*  参数:;
+/*  	[IN] nTextFontSize:字体大小;
+/*  	[IN] bBold:是否粗体;
+/*  	[IN] bItalic:是否斜体;
+/*  	[IN] strTextFontName:字体名称,如楷体;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+void CSortHeaderCtrl::SetListFont(IN CString strFontName, IN int nFontSize, IN BOOL bBold, IN BOOL bItalic)
+{
+	LOGFONT lf;
+	CClientDC dc(this);
+	int dpy = GetDeviceCaps(dc, LOGPIXELSY); // Pixel per inch
+	lf.lfHeight = -MulDiv(nFontSize, dpy, 72);
+	lf.lfWeight = 0;
+	lf.lfEscapement = 0;
+	lf.lfOrientation = 0;
+	if (bBold)
+		lf.lfWeight = FW_BLACK;
+	else
+		lf.lfWeight = FW_NORMAL;
+	lf.lfItalic = bItalic;
+	lf.lfUnderline = FALSE;
+	lf.lfStrikeOut = 0;
+	lf.lfCharSet = ANSI_CHARSET;
+	lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
+	lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
+	lf.lfQuality = DEFAULT_QUALITY;
+	lf.lfPitchAndFamily = DEFAULT_PITCH | FF_ROMAN;
+
+	_tcscpy_s(lf.lfFaceName, strFontName);
+
+	// 创建字体;
+	//m_cfont = GetFont();// 局部变量会导致字体设置失败,必须是全局或成员变量;
+	VERIFY(m_cfont.CreateFontIndirect(&lf));
+	// 选入字体;
+	this->SetFont(&m_cfont);
+}

+ 61 - 0
Source/OGCAssistTool/OGCAssistTool/SortHeaderCtrl.h

@@ -0,0 +1,61 @@
+/************************************************************************/
+/*  Copyright (C), 2016-2020, [IT], 保留所有权利;
+/*  模 块 名:;
+/*  描    述:;
+/*
+/*  版    本:[V];	
+/*  作    者:[IT];
+/*  日    期:[10/21/2016];
+/*
+/*
+/*  注    意:;
+/*
+/*  修改记录:[IT];
+/*  修改日期:;
+/*  修改版本:;
+/*  修改内容:;
+/************************************************************************/
+#ifndef __SORT_HEADER_CTRL___
+#define __SORT_HEADER_CTRL___
+
+#pragma once
+
+class CSortHeaderCtrl : public CHeaderCtrl
+{
+public:
+	CSortHeaderCtrl();
+	virtual ~CSortHeaderCtrl();
+public:
+	virtual void Serialize(CArchive& ar);
+	void SetSortArrow( IN const int nSortColumn, IN const BOOL bAscending );
+
+	// 设置字体;
+	void SetListFont(IN CString strFontName, IN int nFontSize, IN BOOL bBold = FALSE, IN BOOL bItalic =  FALSE);
+protected:
+	// 自绘函数;
+	void DrawItemEx( IN LPDRAWITEMSTRUCT lpDrawItemStruct );
+
+	CFont	m_cfont;
+	// 排序列;
+	int		m_nSortColumn;
+	// 升(TRUE)降(FALSE)序;
+	BOOL	m_bSortAscending;
+	// 列头字体颜色;
+	COLORREF m_clrColumText;
+	// 列头3D高亮色;
+	COLORREF m_clr3DHighLight;
+	// 列头3D阴影;
+	COLORREF m_clr3DShadow;
+	// 列头3D;
+	COLORREF m_clr3DFace;
+	// 是否按下鼠标;
+	BOOL	 m_bPressMoused;
+
+	DECLARE_MESSAGE_MAP()
+public:
+	afx_msg void OnPaint();
+	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
+	virtual BOOL PreTranslateMessage(MSG* pMsg);
+};
+
+#endif // __SORT_HEADER_CTRL___

+ 4 - 1
Source/OGCAssistTool/OGCAssistTool/resource.h

@@ -23,10 +23,13 @@
 #define CHECK_OFFLINE                   1003
 #define IDC_EDIT2                       1003
 #define IDC_CHECK1                      1004
+#define CHECK_LOCK                      1004
 #define IDC_COMBO1                      1005
 #define IDC_EDIT3                       1006
 #define IDC_SPIN1                       1007
 #define IDC_EDIT4                       1008
+#define LIST_DEBUG_DATA                 1009
+#define IDC_EDIT5                       1010
 
 // Next default values for new objects
 // 
@@ -34,7 +37,7 @@
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_NEXT_RESOURCE_VALUE        133
 #define _APS_NEXT_COMMAND_VALUE         32771
-#define _APS_NEXT_CONTROL_VALUE         1008
+#define _APS_NEXT_CONTROL_VALUE         1010
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif

+ 17 - 0
Source/OGCAssistTool/OGCAssistTool/stdafx.cpp

@@ -6,3 +6,20 @@
 #include "stdafx.h"
 
 
+namespace GLOBAL
+{
+	bool bOffline = false;
+#ifdef _UNICODE
+	CString strLine = _T("");
+	CString strAccount = _T("");
+	CString strPassword = _T("");
+	CString strBatchNumber = _T("");
+#else
+	std::string strLine = "";
+	std::string strAccount = "";
+	std::string strPassword = "";
+	std::string strBatchNumber = "";
+#endif
+	int nDeltaEType = DeltaE00;
+	double dDeltaEVaule = 0.0;
+};

+ 40 - 3
Source/OGCAssistTool/OGCAssistTool/stdafx.h

@@ -36,9 +36,46 @@
 #endif // _AFX_NO_AFXCMN_SUPPORT
 
 #include <afxcontrolbars.h>     // 功能区和控件条的 MFC 支持
-
-
-
+#include <string>
+
+// DeltaE76
+// DeltaE94
+// DeltaE00
+typedef enum {
+	DeltaE00 = 0,
+	DeltaE76 = 1,
+	DeltaE94 = 2
+}DETYPE;
+
+// 全局变量空间;
+namespace GLOBAL
+{
+	// 是否离线模式;
+	extern bool bOffline;
+#ifdef _UNICODE
+	// 线体名称;
+	extern CString strLine;
+	// 账号;
+	extern CString strAccount;
+	// 密码;
+	extern CString strPassword;
+	// 批次号;
+	extern CString strBatchNumber;
+#else
+	// 线体名称;
+	extern std::string strLine;
+	// 账号;
+	extern std::string strAccount;
+	// 密码;
+	extern std::string strPassword;
+	// 批次号;
+	extern std::string strBatchNumber;
+#endif
+	// 当前▲E类型;
+	extern int nDeltaEType;
+	// 当前▲E标准值;
+	extern double dDeltaEVaule;
+};