亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? sortlistctrl.cpp

?? RFID溫度簽的源碼
?? CPP
字號(hào):
/*----------------------------------------------------------------------
Copyright (C)2001 MJSoft. All Rights Reserved.
          This source may be used freely as long as it is not sold for
					profit and this copyright information is not altered or removed.
					Visit the web-site at www.mjsoft.co.uk
					e-mail comments to info@mjsoft.co.uk
File:     SortListCtrl.cpp
Purpose:  Provides a sortable list control, it will sort text, numbers
          and dates, ascending or descending, and will even draw the
					arrows just like windows explorer!
----------------------------------------------------------------------*/

#include "stdafx.h"
#include "SortListCtrl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


LPCTSTR g_pszSection = _T("ListCtrls");


struct ItemData
{
public:
	ItemData() : arrpsz( NULL ), dwData( NULL ) {}

	LPTSTR* arrpsz;
	DWORD dwData;

private:
	// ban copying.
	ItemData( const ItemData& );
	ItemData& operator=( const ItemData& );
};


CSortListCtrl::CSortListCtrl()
	: m_iNumColumns( 0 )
	, m_iSortColumn( -1 )
	, m_bSortAscending( TRUE )
{
}


CSortListCtrl::~CSortListCtrl()
{
}


BEGIN_MESSAGE_MAP(CSortListCtrl, CListCtrl)
	//{{AFX_MSG_MAP(CSortListCtrl)
	ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnClick)
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSortListCtrl message handlers

void CSortListCtrl::PreSubclassWindow()
{
	// the list control must have the report style.
	ASSERT( GetStyle() & LVS_REPORT );

	CListCtrl::PreSubclassWindow();
	VERIFY( m_ctlHeader.SubclassWindow( GetHeaderCtrl()->GetSafeHwnd() ) );
}


BOOL CSortListCtrl::SetHeadings( UINT uiStringID )
{
	CString strHeadings;
	VERIFY( strHeadings.LoadString( uiStringID ) );
	return SetHeadings( strHeadings );
}


// the heading text is in the format column 1 text,column 1 width;column 2 text,column 3 width;etc.
BOOL CSortListCtrl::SetHeadings( const CString& strHeadings )
{
	int iStart = 0;

	for( ;; )
	{
		const int iComma = strHeadings.Find( _T(','), iStart );

		if( iComma == -1 )
			break;

		const CString strHeading = strHeadings.Mid( iStart, iComma - iStart );

		iStart = iComma + 1;

		int iSemiColon = strHeadings.Find( _T(';'), iStart );

		if( iSemiColon == -1 )
			iSemiColon = strHeadings.GetLength();

		const int iWidth = atoi( strHeadings.Mid( iStart, iSemiColon - iStart ) );
		
		iStart = iSemiColon + 1;

		if( InsertColumn( m_iNumColumns++, strHeading, LVCFMT_LEFT, iWidth ) == -1 )
			return FALSE;
	}

	return TRUE;
}


int CSortListCtrl::AddItem( LPCTSTR pszText, ... )
{
	const int iIndex = InsertItem( GetItemCount(), pszText );

	LPTSTR* arrpsz = new LPTSTR[ m_iNumColumns ];
	arrpsz[ 0 ] = new TCHAR[ lstrlen( pszText ) + 1 ];
	(void)lstrcpy( arrpsz[ 0 ], pszText );

 	va_list list;
	va_start( list, pszText );

	for( int iColumn = 1; iColumn < m_iNumColumns; iColumn++ )
	{
		pszText = va_arg( list, LPCTSTR );
		ASSERT_VALID_STRING( pszText );
		VERIFY( CListCtrl::SetItem( iIndex, iColumn, LVIF_TEXT, pszText, 0, 0, 0, 0 ) );

		arrpsz[ iColumn ] = new TCHAR[ lstrlen( pszText ) + 1 ];
		(void)lstrcpy( arrpsz[ iColumn ], pszText );
	}

	va_end( list );

	VERIFY( SetTextArray( iIndex, arrpsz ) );

	return iIndex;
}


void CSortListCtrl::FreeItemMemory( const int iItem )
{
	ItemData* pid = reinterpret_cast<ItemData*>( CListCtrl::GetItemData( iItem ) );

	LPTSTR* arrpsz = pid->arrpsz;

	for( int i = 0; i < m_iNumColumns; i++ )
		delete[] arrpsz[ i ];

	delete[] arrpsz;
	delete pid;

	VERIFY( CListCtrl::SetItemData( iItem, NULL ) );
}


BOOL CSortListCtrl::DeleteItem( int iItem )
{
	FreeItemMemory( iItem );
	return CListCtrl::DeleteItem( iItem );
}


BOOL CSortListCtrl::DeleteAllItems()
{
	for( int iItem = 0; iItem < GetItemCount(); iItem ++ )
		FreeItemMemory( iItem );

	return CListCtrl::DeleteAllItems();
}


bool IsNumber( LPCTSTR pszText )
{
	ASSERT_VALID_STRING( pszText );

	for( int i = 0; i < lstrlen( pszText ); i++ )
		if( !_istdigit( pszText[ i ] ) )
			return false;

	return true;
}


int NumberCompare( LPCTSTR pszNumber1, LPCTSTR pszNumber2 )
{
	ASSERT_VALID_STRING( pszNumber1 );
	ASSERT_VALID_STRING( pszNumber2 );

	const int iNumber1 = atoi( pszNumber1 );
	const int iNumber2 = atoi( pszNumber2 );

	if( iNumber1 < iNumber2 )
		return -1;
	
	if( iNumber1 > iNumber2 )
		return 1;

	return 0;
}


bool 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 ] )
		&& pszText[ 2 ] == _T('/')
		&& _istdigit( pszText[ 3 ] )
		&& _istdigit( pszText[ 4 ] )
		&& pszText[ 5 ] == _T('/')
		&& _istdigit( pszText[ 6 ] )
		&& _istdigit( pszText[ 7 ] )
		&& _istdigit( pszText[ 8 ] )
		&& _istdigit( pszText[ 9 ] );
}


int DateCompare( const CString& strDate1, const CString& strDate2 )
{
	const int iYear1 = atoi( strDate1.Mid( 6, 4 ) );
	const int iYear2 = atoi( strDate2.Mid( 6, 4 ) );

	if( iYear1 < iYear2 )
		return -1;

	if( iYear1 > iYear2 )
		return 1;

	const int iMonth1 = atoi( strDate1.Mid( 3, 2 ) );
	const int iMonth2 = atoi( strDate2.Mid( 3, 2 ) );

	if( iMonth1 < iMonth2 )
		return -1;

	if( iMonth1 > iMonth2 )
		return 1;

	const int iDay1 = atoi( strDate1.Mid( 0, 2 ) );
	const int iDay2 = atoi( strDate2.Mid( 0, 2 ) );

	if( iDay1 < iDay2 )
		return -1;

	if( iDay1 > iDay2 )
		return 1;

	return 0;
}


int CALLBACK CSortListCtrl::CompareFunction( LPARAM lParam1, LPARAM lParam2, LPARAM lParamData )
{
	CSortListCtrl* pListCtrl = reinterpret_cast<CSortListCtrl*>( lParamData );
	ASSERT( pListCtrl->IsKindOf( RUNTIME_CLASS( CListCtrl ) ) );

	ItemData* pid1 = reinterpret_cast<ItemData*>( lParam1 );
	ItemData* pid2 = reinterpret_cast<ItemData*>( lParam2 );

	ASSERT( pid1 );
	ASSERT( pid2 );

	LPCTSTR pszText1 = pid1->arrpsz[ pListCtrl->m_iSortColumn ];
	LPCTSTR pszText2 = pid2->arrpsz[ pListCtrl->m_iSortColumn ];

	ASSERT_VALID_STRING( pszText1 );
	ASSERT_VALID_STRING( pszText2 );

	if( IsNumber( pszText1 ) )
		return pListCtrl->m_bSortAscending ? NumberCompare( pszText1, pszText2 ) : NumberCompare( pszText2, pszText1 );
	else if( IsDate( pszText1 ) )
		return pListCtrl->m_bSortAscending ? DateCompare( pszText1, pszText2 ) : DateCompare( pszText2, pszText1 );
	else
		// text.
		return pListCtrl->m_bSortAscending ? lstrcmp( pszText1, pszText2 ) : lstrcmp( pszText2, pszText1 );
}


void CSortListCtrl::OnColumnClick( NMHDR* pNMHDR, LRESULT* pResult )
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	const int iColumn = pNMListView->iSubItem;

	// if it's a second click on the same column then reverse the sort order,
	// otherwise sort the new column in ascending order.
	Sort( iColumn, iColumn == m_iSortColumn ? !m_bSortAscending : TRUE );

	*pResult = 0;
}


void CSortListCtrl::Sort( int iColumn, BOOL bAscending )
{
	m_iSortColumn = iColumn;
	m_bSortAscending = bAscending;

	// show the appropriate arrow in the header control.
	m_ctlHeader.SetSortArrow( m_iSortColumn, m_bSortAscending );

	VERIFY( SortItems( CompareFunction, reinterpret_cast<DWORD>( this ) ) );
}


void CSortListCtrl::LoadColumnInfo()
{
	// you must call this after setting the column headings.
	ASSERT( m_iNumColumns > 0 );

	CString strKey;
	strKey.Format( _T("%d"), GetDlgCtrlID() );

	UINT nBytes = 0;
	BYTE* buf = NULL;
	if( AfxGetApp()->GetProfileBinary( g_pszSection, strKey, &buf, &nBytes ) )
	{
		if( nBytes > 0 )
		{
			CMemFile memFile( buf, nBytes );
			CArchive ar( &memFile, CArchive::load );
			m_ctlHeader.Serialize( ar );
			ar.Close();

			m_ctlHeader.Invalidate();
		}

		delete[] buf;
	}
}


void CSortListCtrl::SaveColumnInfo()
{
	ASSERT( m_iNumColumns > 0 );

	CString strKey;
	strKey.Format( _T("%d"), GetDlgCtrlID() );

	CMemFile memFile;

	CArchive ar( &memFile, CArchive::store );
	m_ctlHeader.Serialize( ar );
	ar.Close();

	DWORD dwLen = memFile.GetLength();
	BYTE* buf = memFile.Detach();	

	VERIFY( AfxGetApp()->WriteProfileBinary( g_pszSection, strKey, buf, dwLen ) );

	free( buf );
}


void CSortListCtrl::OnDestroy() 
{
	for( int iItem = 0; iItem < GetItemCount(); iItem ++ )
		FreeItemMemory( iItem );

	CListCtrl::OnDestroy();
}


BOOL CSortListCtrl::SetItemText( int nItem, int nSubItem, LPCTSTR lpszText )
{
	if( !CListCtrl::SetItemText( nItem, nSubItem, lpszText ) )
		return FALSE;

	LPTSTR* arrpsz = GetTextArray( nItem );
	LPTSTR pszText = arrpsz[ nSubItem ];
	delete[] pszText;
	pszText = new TCHAR[ lstrlen( lpszText ) + 1 ];
	(void)lstrcpy( pszText, lpszText );
	arrpsz[ nSubItem ] = pszText;

	return TRUE;
}


BOOL CSortListCtrl::SetItemData( int nItem, DWORD dwData )
{
	if( nItem >= GetItemCount() )
		return FALSE;

	ItemData* pid = reinterpret_cast<ItemData*>( CListCtrl::GetItemData( nItem ) );
	ASSERT( pid );
	pid->dwData = dwData;

	return TRUE;
}


DWORD CSortListCtrl::GetItemData( int nItem ) const
{
	ASSERT( nItem < GetItemCount() );

	ItemData* pid = reinterpret_cast<ItemData*>( CListCtrl::GetItemData( nItem ) );
	ASSERT( pid );
	return pid->dwData;
}


BOOL CSortListCtrl::SetTextArray( int iItem, LPTSTR* arrpsz )
{
	ASSERT( CListCtrl::GetItemData( iItem ) == NULL );
	ItemData* pid = new ItemData;
	pid->arrpsz = arrpsz;
	return CListCtrl::SetItemData( iItem, reinterpret_cast<DWORD>( pid ) );
}


LPTSTR* CSortListCtrl::GetTextArray( int iItem ) const
{
	ASSERT( iItem < GetItemCount() );

	ItemData* pid = reinterpret_cast<ItemData*>( CListCtrl::GetItemData( iItem ) );
	return pid->arrpsz;
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲午夜电影网| 亚洲一区二区三区在线| 欧美丰满美乳xxx高潮www| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 欧洲亚洲精品在线| 91久久免费观看| 欧美日韩一区中文字幕| 欧美日韩精品电影| 欧美精品丝袜久久久中文字幕| 欧美日韩国产美女| 91精品国产福利在线观看| 日韩欧美专区在线| 久久久久久久久久久久久久久99| 久久精品夜夜夜夜久久| 国产欧美日韩视频一区二区| 中文字幕一区在线| 亚洲一区二区综合| 蜜乳av一区二区三区| 韩国精品一区二区| 成人激情图片网| 91福利国产精品| 欧美一级高清片| 欧美国产日韩精品免费观看| 中文字幕永久在线不卡| 亚洲国产精品久久久久婷婷884 | 美腿丝袜亚洲综合| 国产成人av影院| 色网综合在线观看| 欧美精选一区二区| 欧美精品一区二区三区蜜桃视频| 亚洲国产成人午夜在线一区| 亚洲女与黑人做爰| 免费一级欧美片在线观看| 国产经典欧美精品| 欧美四级电影在线观看| 26uuu欧美| 亚洲日本va午夜在线影院| 午夜精品久久久久久| 国产一区二区三区免费在线观看| 国产成人自拍在线| 欧美亚洲高清一区| 久久久噜噜噜久噜久久综合| 亚洲综合一区二区三区| 精品一区二区三区日韩| 91福利视频久久久久| 精品国产凹凸成av人网站| 亚洲视频在线观看一区| 麻豆国产精品一区二区三区| 99精品欧美一区二区蜜桃免费| 欧美日韩国产系列| 国产精品欧美精品| 久久99热这里只有精品| 色婷婷国产精品综合在线观看| 欧美大胆人体bbbb| 亚洲综合丁香婷婷六月香| 韩国女主播成人在线| 色综合久久久久综合体| 久久色.com| 日韩精品成人一区二区三区| eeuss影院一区二区三区| 精品少妇一区二区三区在线播放| 亚洲免费色视频| 国产精品一区二区三区四区| 欧美视频你懂的| 亚洲欧美日韩一区| 懂色av噜噜一区二区三区av| 91精品国产全国免费观看| 亚洲人妖av一区二区| 国产成人在线看| 日韩欧美一级片| 午夜精品久久久久久久蜜桃app| 不卡av在线免费观看| 日韩欧美国产三级电影视频| 亚洲午夜精品在线| 99久久久精品| 国产精品美女久久久久aⅴ | 国产乱对白刺激视频不卡| 欧美麻豆精品久久久久久| 综合激情网...| 国产寡妇亲子伦一区二区| 精品裸体舞一区二区三区| 日韩一区精品视频| 欧美午夜理伦三级在线观看| 亚洲欧美偷拍卡通变态| 成人av综合在线| 欧美激情一区二区三区四区 | 欧美一级日韩不卡播放免费| 一区二区三区日韩在线观看| 99riav一区二区三区| 国产精品毛片无遮挡高清| 国产一区二区三区日韩| 精品国产一区二区三区av性色| 日本不卡高清视频| 欧美一级日韩免费不卡| 日韩高清不卡一区| 3751色影院一区二区三区| 亚洲大片一区二区三区| 欧美写真视频网站| 午夜精品视频在线观看| 欧美日韩在线播放三区四区| 亚洲一区二区3| 欧美日韩国产经典色站一区二区三区| 一区二区三区在线影院| 欧美性猛交一区二区三区精品| 一区二区三区欧美视频| 欧美在线free| 天堂在线亚洲视频| 91精品国产91久久综合桃花| 久色婷婷小香蕉久久| 精品久久久久一区二区国产| 激情成人综合网| 久久久不卡网国产精品一区| 国产盗摄精品一区二区三区在线| 国产欧美日韩三区| 色综合一个色综合亚洲| 亚洲图片欧美视频| 日韩一级完整毛片| 国产福利一区二区三区| 中文字幕在线观看一区| 色噜噜狠狠色综合欧洲selulu| 亚洲一区二区在线观看视频| 在线成人高清不卡| 国产一区二区在线免费观看| 国产精品乱人伦| 欧美在线一二三四区| 捆绑变态av一区二区三区| 日本一区二区三区国色天香| 91在线观看美女| 日韩成人av影视| 国产亲近乱来精品视频| 91免费观看国产| 午夜av区久久| 久久你懂得1024| 色综合久久99| 麻豆极品一区二区三区| 国产婷婷一区二区| 91丨九色porny丨蝌蚪| 亚洲gay无套男同| 精品国产91久久久久久久妲己| 成人国产亚洲欧美成人综合网| 亚洲丶国产丶欧美一区二区三区| 日韩精品在线一区二区| 91原创在线视频| 久久电影国产免费久久电影| 亚洲日本欧美天堂| 欧美成人精精品一区二区频| 91视频免费播放| 美国毛片一区二区| 亚洲欧美国产毛片在线| 日韩免费视频一区| av在线播放成人| 久久精品国产一区二区| 亚洲欧美国产77777| 欧美大白屁股肥臀xxxxxx| 色诱亚洲精品久久久久久| 九一九一国产精品| 亚洲精品综合在线| 久久精品综合网| 欧美绝品在线观看成人午夜影视| 国产精品主播直播| 丝袜亚洲另类欧美| 中文字幕在线免费不卡| xfplay精品久久| 欧美三级欧美一级| 成人午夜免费视频| 狠狠色丁香久久婷婷综合_中 | 欧美午夜电影在线播放| 国产精品自拍三区| 午夜影院久久久| 国产精品久久久一本精品| 日韩一区二区三区视频在线| 99精品热视频| 成人一区二区在线观看| 美国一区二区三区在线播放| 一区二区三区日韩精品视频| 欧美国产国产综合| 亚洲精品一区在线观看| 8x福利精品第一导航| 成人激情免费网站| 国产麻豆日韩欧美久久| 美女高潮久久久| 天天综合网 天天综合色| 一区二区三区中文免费| 中文字幕一区二区三区av| 国产欧美一区二区精品婷婷 | 亚洲电影激情视频网站| 亚洲激情第一区| 最新高清无码专区| 国产精品免费久久久久| 久久久久久久久伊人| 精品蜜桃在线看| 日韩欧美国产综合| 欧美一级高清大全免费观看| 在线不卡欧美精品一区二区三区| 色狠狠一区二区三区香蕉| 一本到不卡精品视频在线观看| 波多野结衣在线aⅴ中文字幕不卡| 粉嫩av一区二区三区粉嫩| 国产精品一卡二卡在线观看| 国产剧情一区在线|