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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sortlistctrl.cpp

?? monlibs
?? CPP
字號:
#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;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品国产一区二区三| 亚洲免费三区一区二区| 麻豆视频一区二区| 日韩欧美一二区| 亚洲同性同志一二三专区| 亚洲国产美国国产综合一区二区| 色av一区二区| 天涯成人国产亚洲精品一区av| 欧美日韩国产bt| 国精产品一区一区三区mba视频| 国产亚洲精品精华液| www.亚洲色图| 亚洲123区在线观看| 日韩一区二区电影在线| 国产精品一区在线观看你懂的| 国产精品不卡在线| 欧美乱妇15p| 国产一区三区三区| 亚洲天堂av一区| 91麻豆精品国产91| 国产成人aaa| 一区二区三区91| 26uuu久久天堂性欧美| 99久久精品国产精品久久 | 中文一区二区在线观看| 在线中文字幕一区二区| 美女任你摸久久 | 亚洲男同1069视频| 欧美一区2区视频在线观看| 国产风韵犹存在线视精品| 一区二区成人在线观看| 欧美va亚洲va香蕉在线| 色老头久久综合| 韩国毛片一区二区三区| **网站欧美大片在线观看| 日韩你懂的电影在线观看| 99re成人精品视频| 久久成人久久鬼色| 亚洲最新视频在线播放| 国产亲近乱来精品视频| 3d成人动漫网站| 色综合久久中文字幕综合网| 黑人巨大精品欧美一区| 亚洲国产色一区| 亚洲色图一区二区三区| 久久久久久一二三区| 在线成人av网站| 色香蕉久久蜜桃| 国产不卡视频一区| 美女精品自拍一二三四| 亚洲国产视频一区| 成人欧美一区二区三区黑人麻豆| 欧美tk丨vk视频| 欧美日本视频在线| 91成人免费网站| 99这里只有久久精品视频| 国产资源在线一区| 日韩成人av影视| 亚洲电影在线播放| 亚洲精品伦理在线| 亚洲欧洲日产国产综合网| 久久精品视频在线免费观看| 日韩欧美在线观看一区二区三区| 色狠狠色噜噜噜综合网| 波多野结衣欧美| 丁香六月综合激情| 国产精品一区二区黑丝| 韩国三级在线一区| 精品在线免费视频| 麻豆国产91在线播放| 首页综合国产亚洲丝袜| 亚洲国产毛片aaaaa无费看| 亚洲欧美另类久久久精品| 国产精品福利电影一区二区三区四区| 国产亚洲福利社区一区| 久久女同互慰一区二区三区| 精品国产一区二区国模嫣然| 精品美女被调教视频大全网站| 欧美一级欧美一级在线播放| 91精品国产麻豆国产自产在线 | 日韩欧美区一区二| 日韩一区二区免费视频| 日韩精品在线一区| 久久婷婷色综合| 亚洲国产电影在线观看| 欧美国产精品专区| 国产精品短视频| 一区二区三区国产豹纹内裤在线| 亚洲免费观看高清| 亚洲国产一区二区在线播放| 日韩在线播放一区二区| 麻豆精品国产91久久久久久| 国产一区三区三区| 不卡av在线免费观看| 一本色道久久综合狠狠躁的推荐| 欧洲av一区二区嗯嗯嗯啊| 欧美色图激情小说| 日韩欧美一二三区| 中文字幕av在线一区二区三区| 亚洲少妇30p| 日韩二区三区四区| 国产乱色国产精品免费视频| 成人国产亚洲欧美成人综合网| 91免费国产在线| 91精品免费观看| 久久久久久夜精品精品免费| 亚洲免费观看高清| 奇米影视7777精品一区二区| 国产不卡视频在线播放| 91国产丝袜在线播放| 91精品国产免费久久综合| 久久精品水蜜桃av综合天堂| 亚洲欧美激情一区二区| 日韩中文字幕不卡| 国产成a人亚洲精品| 欧美性色黄大片| 久久精品亚洲精品国产欧美 | 图片区小说区区亚洲影院| 国内欧美视频一区二区| 91猫先生在线| 精品国产一区二区精华| 亚洲欧美日韩电影| 国产一区二区三区国产| 欧美午夜影院一区| 国产精品午夜电影| 蜜臀av性久久久久蜜臀aⅴ四虎| 成人综合日日夜夜| 欧美日韩一区成人| 成人欧美一区二区三区1314| 蜜桃av噜噜一区| 在线观看视频一区二区| 国产性天天综合网| 日韩电影在线免费看| 99re热这里只有精品视频| 精品乱人伦小说| 亚洲bt欧美bt精品| 99re免费视频精品全部| 久久久久久久久久看片| 五月天视频一区| 色婷婷狠狠综合| 中文字幕 久热精品 视频在线| 免费看欧美美女黄的网站| 色哟哟日韩精品| 国产精品的网站| 国产成人精品午夜视频免费| 欧美电影免费观看完整版| 亚洲午夜影视影院在线观看| 成人av片在线观看| 日本一区二区综合亚洲| 久久精品国内一区二区三区| 欧美乱熟臀69xxxxxx| 一区二区三区免费| 91麻豆精品在线观看| 欧美激情中文不卡| 国产精品1024| 337p日本欧洲亚洲大胆精品| 奇米777欧美一区二区| 欧美日韩不卡视频| 午夜电影久久久| 欧美视频一区二区三区在线观看| 亚洲女性喷水在线观看一区| www.欧美.com| 亚洲欧洲国产专区| 成人激情图片网| 中文字幕国产一区| 成人avav在线| 最新不卡av在线| 日本黄色一区二区| 亚洲一区二区三区视频在线播放| 在线看日本不卡| 亚洲国产日产av| 欧美精品丝袜久久久中文字幕| 亚洲国产日韩a在线播放性色| 91福利精品视频| 亚洲高清视频在线| 8v天堂国产在线一区二区| 天天综合天天综合色| 日韩欧美一级片| 国产福利91精品一区二区三区| 亚洲国产精品精华液2区45| 成人激情文学综合网| 亚洲激情图片小说视频| 在线观看亚洲精品视频| 五月天一区二区| 精品国产123| 成人午夜视频福利| 夜夜精品视频一区二区 | 欧美一卡2卡三卡4卡5免费| 久久精品国产亚洲5555| 久久久久久久久一| 国产乱国产乱300精品| 欧美国产日产图区| 在线观看日韩一区| 免费观看91视频大全| 久久天堂av综合合色蜜桃网| 成人精品一区二区三区中文字幕| 自拍偷拍欧美精品| 日韩一区二区免费电影| 国产69精品久久777的优势| 一区二区三区在线视频免费|