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

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

?? sortlistctrl.cpp

?? ClistCtrl的使用完整實例 包括基本的屬性設置、出入數據、實現排序等
?? 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一区二区三区免费野_久草精品视频
亚洲一区二区四区蜜桃| 久久综合色一综合色88| 国产美女娇喘av呻吟久久| 亚洲最大的成人av| 综合久久国产九一剧情麻豆| 久久一二三国产| 欧美第一区第二区| 4438亚洲最大| 日韩一区二区三区免费观看| 日韩三级视频在线观看| 欧美一级一区二区| 日韩欧美亚洲国产另类| 欧美一级二级在线观看| 日韩三级在线免费观看| 精品国产免费久久| wwww国产精品欧美| 精品久久久久av影院| 久久综合国产精品| 国产日韩精品一区二区三区在线| 国产亚洲精品aa| 日本一区二区视频在线| 国产精品国产三级国产aⅴ入口 | 成人一区二区三区在线观看| 风间由美一区二区三区在线观看| 粉嫩蜜臀av国产精品网站| 成人做爰69片免费看网站| 成人一区二区在线观看| 91亚洲国产成人精品一区二三| 9色porny自拍视频一区二区| 色婷婷国产精品综合在线观看| 色网站国产精品| 91麻豆精品国产自产在线观看一区| 欧美一区二区三区思思人| 精品久久久久久亚洲综合网| 国产日产亚洲精品系列| 亚洲激情五月婷婷| 蜜桃视频在线一区| 成人av午夜电影| 欧美日韩一卡二卡| 国产婷婷色一区二区三区四区 | 欧美精品一区在线观看| 亚洲欧洲无码一区二区三区| 天堂av在线一区| 国产a区久久久| 欧美日韩一二三区| 国产片一区二区| 亚洲bt欧美bt精品| 盗摄精品av一区二区三区| 欧美日韩一级二级三级| 欧美国产97人人爽人人喊| 婷婷开心激情综合| 成人午夜精品在线| 欧美一区二区三区公司| 成人免费一区二区三区视频| 日韩av中文字幕一区二区| 成人va在线观看| 精品国产乱码久久| 亚欧色一区w666天堂| 丁香一区二区三区| 欧美成人欧美edvon| 亚洲综合一区在线| 波多野结衣亚洲| 久久色视频免费观看| 日本成人中文字幕在线视频| 99亚偷拍自图区亚洲| 久久久欧美精品sm网站| 喷水一区二区三区| 欧美日韩色一区| 亚洲一区二区四区蜜桃| 一本色道久久综合亚洲精品按摩| 亚洲精品一线二线三线| 蜜桃精品在线观看| 91精品在线一区二区| 樱桃国产成人精品视频| 91性感美女视频| 中文字幕一区不卡| 91视频.com| 亚洲色图在线视频| 色伊人久久综合中文字幕| 中文字幕亚洲一区二区va在线| 国产成人在线电影| 国产清纯白嫩初高生在线观看91| 国产精品亚洲а∨天堂免在线| 精品国产一区二区在线观看| 裸体在线国模精品偷拍| 日韩三级中文字幕| 国产一区三区三区| 久久久久亚洲蜜桃| 成人性视频网站| 中文字幕日韩精品一区| 99久久99久久久精品齐齐| 国产精品福利一区二区三区| 99久久国产免费看| 一区二区三区免费观看| 欧美丰满高潮xxxx喷水动漫| 日韩高清一区在线| 精品国产一区久久| 成人sese在线| 亚洲国产cao| 日韩欧美精品在线视频| 国产一区二区剧情av在线| 久久久久久电影| 97se亚洲国产综合自在线不卡| 亚洲伦理在线免费看| 欧美精品久久99久久在免费线| 日韩国产成人精品| 国产日韩精品视频一区| 色婷婷综合在线| 日韩不卡一区二区三区| 国产网红主播福利一区二区| 色综合天天综合色综合av| 免费黄网站欧美| 久久久久高清精品| 91年精品国产| 久久精品国产一区二区三 | 日韩美女在线视频| 成人一区在线看| 日韩精品一二三四| 亚洲人成网站在线| 欧美哺乳videos| 成人一道本在线| 婷婷一区二区三区| 国产欧美日韩综合| 欧美日韩一区视频| 国产成人精品免费| 日韩不卡一二三区| 国产精品国产成人国产三级| 欧美一区二区三区性视频| 成人午夜精品在线| 美女视频网站黄色亚洲| 亚洲欧美一区二区在线观看| 91麻豆精品国产91久久久久久| 成人教育av在线| 极品美女销魂一区二区三区免费 | 亚洲aaa精品| 国产精品福利影院| 精品处破学生在线二十三| 欧美色国产精品| kk眼镜猥琐国模调教系列一区二区| 日韩av一区二区三区| 国产精品欧美经典| 欧美精品一区二区不卡| 在线不卡免费av| 在线观看av一区| 99国产精品久久久久| 国产成人综合在线| 国产一区二区三区在线观看精品 | 精品国产一区二区三区久久影院| 欧美伊人久久久久久久久影院| 国产精品一区二区果冻传媒| 日本sm残虐另类| 亚洲成人精品一区二区| 亚洲欧美日韩中文字幕一区二区三区 | 欧美xxxxx裸体时装秀| 欧美三级欧美一级| 欧美日韩亚洲不卡| 欧美日韩一区二区三区四区五区 | 色婷婷综合久色| www.亚洲色图.com| 不卡一区二区在线| 97久久精品人人澡人人爽| 成年人午夜久久久| 99久精品国产| 91免费看`日韩一区二区| 99久久精品免费看国产| 91麻豆精东视频| 色婷婷香蕉在线一区二区| 一本色道久久综合亚洲aⅴ蜜桃| voyeur盗摄精品| 91麻豆自制传媒国产之光| 色八戒一区二区三区| 欧美三级中文字幕| 91精品麻豆日日躁夜夜躁| 日韩三级伦理片妻子的秘密按摩| 欧美成人精品福利| 久久久www免费人成精品| 国产欧美精品区一区二区三区| 国产精品人妖ts系列视频| 国产精品国产馆在线真实露脸| 亚洲激情第一区| 亚洲成精国产精品女| 久久精品久久综合| 粉嫩嫩av羞羞动漫久久久| 91丝袜高跟美女视频| 欧美三级在线视频| 日韩美女主播在线视频一区二区三区 | 综合分类小说区另类春色亚洲小说欧美 | 亚洲自拍偷拍综合| 秋霞影院一区二区| 懂色av一区二区三区蜜臀| 欧美怡红院视频| 欧美成人免费网站| 亚洲乱码精品一二三四区日韩在线| 亚洲成国产人片在线观看| 国产一区二区三区四区五区入口 | 中文字幕一区二区三区蜜月 | 蜜臀av在线播放一区二区三区| 国产91对白在线观看九色| 欧美在线一区二区三区| 久久老女人爱爱|