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

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

?? sortlistctrl.cpp

?? 一個企業訂單管理流程的例子
?? 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(int item_index, LPCTSTR pszText, ... )
{
//	const int iIndex=0;
	int iIndex=0;

	if(item_index==-1)
		iIndex = InsertItem( GetItemCount(), pszText );
	else
		iIndex = InsertItem( item_index, 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一区二区三区免费野_久草精品视频
欧美亚洲国产bt| 91久久精品一区二区| 亚洲视频综合在线| 制服丝袜国产精品| 91色在线porny| 麻豆高清免费国产一区| 亚洲精品国产无套在线观| 久久亚洲春色中文字幕久久久| 日本久久精品电影| 成人夜色视频网站在线观看| 日本美女视频一区二区| 一区二区三区在线观看网站| 国产欧美一区二区三区在线看蜜臀 | 色综合中文字幕| 国产在线视视频有精品| 视频在线观看一区| 一级做a爱片久久| 中文字幕精品综合| 久久久综合网站| 日韩一区二区高清| 欧美日本一区二区三区四区| 91在线视频18| 国产成人精品影院| 国产一区二区三区美女| 免费精品99久久国产综合精品| 午夜亚洲国产au精品一区二区| 亚洲青青青在线视频| 中文一区二区完整视频在线观看| 亚洲精品一区二区精华| 欧美一级一区二区| 欧美另类一区二区三区| 日本伦理一区二区| 日本道免费精品一区二区三区| 丁香另类激情小说| 国产黄色成人av| 国产91丝袜在线播放| 国产精品一区三区| 国产福利不卡视频| 成人黄色在线网站| av电影一区二区| 91视频.com| 日本精品一区二区三区四区的功能| 99国产精品一区| 日本精品一区二区三区高清| 在线观看av不卡| 欧美日韩免费一区二区三区| 欧美日韩久久久| 91精品国产一区二区三区| 欧美一三区三区四区免费在线看 | 欧美日韩一区精品| 欧美日韩国产系列| 欧美变态tickling挠脚心| 精品国产一区a| 日本一区二区免费在线| 中文字幕综合网| 亚洲午夜激情av| 久久精品国产在热久久| 国产精品资源网| 99re亚洲国产精品| 欧美老年两性高潮| 日韩精品专区在线| 国产欧美精品一区二区三区四区| 国产精品乱码妇女bbbb| 亚洲黄色片在线观看| 日韩高清在线一区| 国产主播一区二区| av在线这里只有精品| 欧美天堂一区二区三区| 精品国产乱码久久久久久闺蜜| 久久久久九九视频| 亚洲三级小视频| 日韩电影在线观看网站| 国产盗摄一区二区三区| 一本色道久久综合亚洲精品按摩| 6080亚洲精品一区二区| 亚洲国产激情av| 亚洲国产三级在线| 国产一区二区网址| 欧美亚州韩日在线看免费版国语版| 91精品欧美久久久久久动漫| 国产免费久久精品| 午夜精品爽啪视频| 大白屁股一区二区视频| 欧美日韩国产美女| 国产精品国产三级国产a| 午夜精品久久一牛影视| 成人午夜电影久久影院| 欧美日韩高清在线| 国产精品美女久久久久aⅴ| 五月激情丁香一区二区三区| 高清久久久久久| 在线播放一区二区三区| 中文字幕在线观看不卡| 免费美女久久99| 日本丶国产丶欧美色综合| 国产丝袜欧美中文另类| 人人精品人人爱| 日本乱人伦aⅴ精品| 国产亚洲成av人在线观看导航 | 激情综合色播激情啊| 色哟哟一区二区三区| 国产婷婷精品av在线| 琪琪久久久久日韩精品| 在线一区二区三区做爰视频网站| 久久先锋影音av鲁色资源网| 婷婷成人激情在线网| 色偷偷88欧美精品久久久| 国产亚洲欧美色| 精品一区二区免费在线观看| 欧美日韩国产成人在线免费| 亚洲欧美日韩一区二区 | 男人操女人的视频在线观看欧美| 一本色道**综合亚洲精品蜜桃冫| 亚洲国产精品精华液ab| 久久精品72免费观看| 91麻豆精品国产自产在线| 一区二区三区在线免费| 99riav久久精品riav| 国产欧美日韩麻豆91| 国产一区二区三区免费播放| 日韩一区二区三区免费观看| 首页国产欧美日韩丝袜| 欧美日韩免费观看一区二区三区| 一区二区三区在线视频观看| 91麻豆精品视频| 亚洲欧美日韩一区二区| 91丨国产丨九色丨pron| 中文字幕亚洲一区二区va在线| 国产高清精品在线| 国产片一区二区三区| 国产精品99久久久久久似苏梦涵 | 国产精品天美传媒| 成人在线一区二区三区| 国产欧美日韩一区二区三区在线观看| 久久电影网电视剧免费观看| 欧美成人video| 久久99精品久久久久久| 精品国产乱码久久久久久牛牛 | 午夜精品久久久久久久蜜桃app| 在线视频一区二区三区| 一区二区三区日韩精品视频| 欧美综合在线视频| 亚洲国产乱码最新视频| 欧美人牲a欧美精品| 青草av.久久免费一区| 337p粉嫩大胆噜噜噜噜噜91av| 极品美女销魂一区二区三区免费| 欧美精品一区二区三区蜜桃| 国产伦理精品不卡| 国产精品美女久久久久aⅴ | 在线观看91精品国产入口| 亚洲成a人v欧美综合天堂下载 | 免费人成精品欧美精品 | wwwwxxxxx欧美| 国产不卡一区视频| 中文字幕佐山爱一区二区免费| 色噜噜狠狠色综合欧洲selulu| 午夜久久久久久久久| 欧美xfplay| 北条麻妃一区二区三区| 亚洲综合自拍偷拍| 欧美一二三区精品| 成人免费视频app| 亚洲一区二区av电影| 日韩亚洲欧美一区二区三区| 国精品**一区二区三区在线蜜桃| 日本一区二区三级电影在线观看| 91小视频在线观看| 视频在线观看一区二区三区| www国产亚洲精品久久麻豆| 99久久精品情趣| 日韩成人免费电影| 中文一区二区在线观看| 欧美视频精品在线| 国产又粗又猛又爽又黄91精品| 中文字幕一区二区三| 欧美乱妇20p| 成人永久aaa| 蜜臀av一区二区三区| 国产精品乱子久久久久| 91精品国产麻豆| 一本高清dvd不卡在线观看| 精品在线亚洲视频| 亚洲一区二区精品久久av| 久久久久久电影| 69久久夜色精品国产69蝌蚪网| 国产成人av一区二区三区在线| 亚洲成人免费视| 国产精品伦一区二区三级视频| 欧美一区二区三区的| 97se亚洲国产综合在线| 精一区二区三区| 五月天国产精品| 亚洲视频在线观看三级| 久久品道一品道久久精品| 欧美老女人在线| 欧洲精品在线观看| 99久久伊人久久99| 国产一区二区在线视频| 日韩一区精品视频|