⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clistctrlex.cpp

📁 <Visual C++ 网络程序设计实例详解>配套源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		strcpy(ra->item,lpcszItemText);

		int nSubItem,nCurrentItem;
		LV_ITEM lvitem;

		// colonne della riga
		for(nSubItem = 0,nCurrentItem = 0; nSubItem < m_nTotColumns && nCurrentItem!=LB_ERR; nSubItem++)
		{
			// status della riga (default su non selezionata)
			ra->ico      = nIconIndex;
			ra->menu     = nMenuIndex;
			ra->selected = FALSE;
			ra->index    = nItem;

			// la riga viene passata in un unico buffer, diviso in colonne dal carattere ';'
			lvitem.pszText = (LPSTR)GetItemToken(nSubItem,ra->item);
			
			int nItemSize = CListCtrl::GetStringWidth(lvitem.pszText);
			//int nColSize = CListCtrl::GetColumnWidth(nSubItem);
			if(nItemSize >= CListCtrl::GetColumnWidth(nSubItem))
				CListCtrl::SetColumnWidth(nSubItem,nItemSize+15);

			lvitem.iSubItem = nSubItem;

			if(nSubItem==0)
			{
				lvitem.mask   = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
				lvitem.iItem  = nItem;
				lvitem.iImage = ra->ico; // icona relativa (indice base 0 nell'array delle immagini)
				lvitem.lParam = (LPARAM)(ra->item);
				
				if((nCurrentItem  = CListCtrl::InsertItem(&lvitem)) < 0)
					nCurrentItem = LB_ERR;
			}
			else
			{
				lvitem.mask  = LVIF_TEXT;
				lvitem.iItem = nCurrentItem;
				
				CListCtrl::SetItem(&lvitem);
			}
		}
		
		SelectItem(nCurrent);
		CListCtrl::Update(nItem);
		
		bUpdated = TRUE;
	}

	return(bUpdated);
}

/*
	DeleteItem()

	Elimina l'elemento dal controllo.

	int nItem		indice (base 0) della riga.
*/
BOOL CListCtrlEx::DeleteItem(int nItem)
{
	ITERATOR iter;
	CTRL_ROW* ra = NULL;

	// elimina la riga dal controllo
	BOOL bDeleted = CListCtrl::DeleteItem(nItem);

	// cerca la riga relativa all'indice e la elimina dalla lista
	if((iter = m_RowList.First())!=(ITERATOR)NULL)
	{
		while(iter!=(ITERATOR)NULL)
		{
			ra = (CTRL_ROW*)iter->data;
			if(ra)
			{
				if(ra->index==nItem)
					break;
				else
					ra = NULL;
			}
			iter = m_RowList.Next(iter);
		}
	}
	
	if(ra)
		m_RowList.Delete(iter);

	// rinumera gli indici delle righe presenti nella lista
	int tot = m_RowList.Count()+1;

	for(int n = ++nItem; n < tot; n++)
	{
		if((ra = GetRowByItem(n))!=(CTRL_ROW*)NULL)
			ra->index = n-1;
	}

	return(bDeleted);
}

/*
	DeleteAllItems()

	Elimina tutti gli elementi dal controllo.
*/
BOOL CListCtrlEx::DeleteAllItems(void)
{
	// elimina le righe dal controllo
	BOOL bDeleted = CListCtrl::DeleteAllItems();

	// elimina le righe dalla lista
	m_RowList.DeleteAll();

	return(bDeleted);
}

/*
	FindItem()

	Cerca l'elemento nel controllo.

	LPCSTR lpcszText	testo dell'elemento da cercare.
*/
int CListCtrlEx::FindItem(LPCSTR lpcszText)
{
	LVFINDINFO lv = {0};
	lv.flags = LVFI_STRING;
	lv.psz = lpcszText;
	return(CListCtrl::FindItem(&lv,-1));
}

/*
	FindItem()

	Cerca la coppia di elementi nel controllo.

	LPCSTR lpcszItemText	testo dell'elemento da cercare.
	LPCSTR lpcszColumnText	testo addizionale dell'elemento da cercare.
	UINT nCol				indice (base 0) della colonna per il testo addizionale
*/
int CListCtrlEx::FindItem(LPCSTR lpcszItemText,LPCSTR lpcszColumnText,UINT nCol)
{
	char szItem[MAX_CTRLITEM_SIZE+1] = {0};
	LVFINDINFO lv = {0};
	lv.flags = LVFI_STRING;
	lv.psz = lpcszItemText;
	int nItem = CListCtrl::FindItem(&lv,-1);
	while(nItem >= 0)
	{
		CListCtrl::GetItemText(nItem,nCol,szItem,sizeof(szItem)-1);
		if(strcmp(szItem,lpcszColumnText)==0)
			break;
		else
			nItem = CListCtrl::FindItem(&lv,nItem);
	}
	return(nItem);
}

/*
	MoveItem()

	Sposta l'elemento in alto o in basso di una posizione.

	int nItem			indice (base 0) dell'elemento
	ITEM_SKIP skip		flag per tipo spostamento (precedente/successivo)
*/
int CListCtrlEx::MoveItem(int nItem,ITEM_SKIP skip)
{
	int nCurrentItem = LB_ERR;
	int nNewItem = (nItem + (skip==PREVIOUS_ITEM ? -1 : (skip==NEXT_ITEM ? +1 : -1)));

	// controlla l'intervallo
	if(nNewItem >= 0 && nNewItem < CListCtrl::GetItemCount())
	{
		// riga da spostare
		CTRL_ROW* ra = GetRowByItem(nItem);
		
		// riga precedente/successiva
		CTRL_ROW* ra_prevnext = GetRowByItem(nNewItem);
		
		if(ra && ra_prevnext)
		{
			int nSubItem;
			LV_ITEM lvitem;
			char szItem[MAX_CTRLROW_SIZE+1];

			// elimina l'elemento dal controllo (chiama la classe base perche' non deve aggiornare il contatore interno)
			CListCtrl::DeleteItem(nItem);

			// testo dell'elemento
			strcpyn(szItem,ra->item,sizeof(szItem));
			
			// rinumera gli indici dei due elementi coinvolti nello spostamento
			ra->index = nNewItem;
			ra_prevnext->index = nItem;

			// colonne dell'elemento
			for(nSubItem = 0,nCurrentItem = 0; nSubItem < m_nTotColumns && nCurrentItem!=LB_ERR; nSubItem++)
			{
				// l'elemento (riga) viene passata in un unico buffer, diviso in colonne dal carattere ';'
				lvitem.pszText = (LPSTR)GetItemToken(nSubItem,szItem);
				
				lvitem.iSubItem = nSubItem;

				if(nSubItem==0)
				{
					lvitem.mask   = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
					lvitem.iItem  = nNewItem;
					lvitem.iImage = ra->ico;
					lvitem.lParam = (LPARAM)(ra->item);
					
					if((nCurrentItem  = CListCtrl::InsertItem(&lvitem)) < 0)
						nCurrentItem = LB_ERR;
				}
				else
				{
					lvitem.mask  = LVIF_TEXT;
					lvitem.iItem = nCurrentItem;
					
					CListCtrl::SetItem(&lvitem);
				}
			}

			// imposta la riga come selezionata
			nCurrentItem = SelectItem(nNewItem);
		}
	}

	return(nCurrentItem);
}

/*
	AddIcon()

	Aggiunge l'icona alla lista delle immagini per la lista.

	int nIcon		id della risorsa relativo all'icona
*/
int CListCtrlEx::AddIcon(int nIcon)
{
	int nCurrentIcon = LB_ERR;

	if(!m_pWinApp)
		return(nCurrentIcon);

	if((nCurrentIcon = m_ImageList.Add(m_pWinApp->LoadIcon(nIcon))) < 0)
		return(nCurrentIcon);
	CListCtrl::SetImageList(&m_ImageList,LVSIL_NORMAL);
	
	if((nCurrentIcon = m_ImageListSmall.Add(m_pWinApp->LoadIcon(nIcon))) < 0)
		return(nCurrentIcon);
	CListCtrl::SetImageList(&m_ImageListSmall,LVSIL_SMALL);

	return(nCurrentIcon);
}

/*
	AddIcon()

	Aggiunge l'icona alla lista delle immagini per la lista.

	HICON hIcon	handle relativo all'icona
*/
int CListCtrlEx::AddIcon(HICON hIcon)
{
	int nCurrentIcon = LB_ERR;

	if((nCurrentIcon = m_ImageList.Add(hIcon)) < 0)
		return(nCurrentIcon);
	CListCtrl::SetImageList(&m_ImageList,LVSIL_NORMAL);
	
	if((nCurrentIcon = m_ImageListSmall.Add(hIcon)) < 0)
		return(nCurrentIcon);
	CListCtrl::SetImageList(&m_ImageListSmall,LVSIL_SMALL);

	return(nCurrentIcon);
}

/*
	RemoveIcon()
*/
void CListCtrlEx::RemoveIcon(int nIcon)
{
	m_ImageList.Remove(nIcon);
	m_ImageListSmall.Remove(nIcon);
}

/*
	RemoveAllIcons()
*/
void CListCtrlEx::RemoveAllIcons(void)
{
	int i,nTot;
	for(i = 0,nTot = m_ImageList.GetImageCount(); i < nTot; i++)
		m_ImageList.Remove(0);
	for(i = 0,nTot = m_ImageListSmall.GetImageCount(); i < nTot; i++)
		m_ImageListSmall.Remove(0);
}

/*
	SelectItem()

	Imposta l'elemento come selezionato.
	Se la selezione riesce, imposta l'indice interno relativo alla riga corrente.

	int nItem		indice (base 0) dell'elemento
*/
int CListCtrlEx::SelectItem(int nItem)
{
	// riga corrente
	int iCurrentItem = GetCurrentItem();

	// controlla l'indice
	if(nItem >=0 && nItem < CListCtrl::GetItemCount())
	{
		/* M$VC 6.0
		POSITION position;
		position = GetFirstSelectedItemPosition();
		while(position)
			iCurrentItem = GetNextSelectedItem(position);
		*/

		LV_ITEM lvitem;

		// ricava la riga selezionata
		if((iCurrentItem = CListCtrl::GetNextItem(0,LVNI_ALL|LVNI_FOCUSED|LVNI_SELECTED)) < 0)
			iCurrentItem = 0;

		if(iCurrentItem >= 0)
		{
			// elimina la selezione per la riga corrente
			memset(&lvitem,'\0',sizeof(LV_ITEM));
			lvitem.mask = LVIF_STATE;
			lvitem.iItem = iCurrentItem;
			lvitem.iSubItem = 0;
			lvitem.state = 0;
			lvitem.stateMask = LVIS_FOCUSED | LVIS_SELECTED ;
			if(CListCtrl::SetItemState(iCurrentItem,&lvitem))
			{
				// imposta come selezionata la riga specificata
				memset(&lvitem,'\0',sizeof(LV_ITEM));
				lvitem.mask = LVIF_STATE;
				lvitem.iItem = nItem;
				lvitem.iSubItem = 0;
				lvitem.state = LVIS_FOCUSED | LVIS_SELECTED;
				lvitem.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
				if(CListCtrl::SetItemState(nItem,&lvitem))
				{
					// si assicura che la riga sia visibile ed aggiorna l'indice interno
					SetRedraw(FALSE);
					CListCtrl::EnsureVisible(nItem,FALSE);
					SetRedraw(TRUE);

					SetCurrentItem(nItem);
				}
			}
		}
	}

	return(iCurrentItem);
}

/*
	SetCurrentItem()

	Aggiorna l'indice interno relativo alla riga corrente.
	Notare che la riga corrente puo' non corrispondere con quella selezionata (focused).

	int nItem		indice (base 0) dell'elemento
*/
int CListCtrlEx::SetCurrentItem(int nItem)
{
	if(CListCtrl::GetItemCount() <= 0)
		return(LB_ERR);

	if(nItem < 0 || nItem > CListCtrl::GetItemCount())
		nItem = 0;

	m_nCurrentItem = nItem;

	return(m_nCurrentItem);
}

/*
	GetCurrentItem()

	Restituisce l'indice interno relativo alla riga corrente.
	Notare che la riga corrente puo' non corrispondere con quella selezionata (focused).
*/
int CListCtrlEx::GetCurrentItem(void)
{
	if(CListCtrl::GetItemCount() <= 0)
		return(LB_ERR);

	if(m_nCurrentItem==LB_ERR)
		m_nCurrentItem = 0;

	return(m_nCurrentItem);
}

/*
	SetItemSelection()

	Imposta lo status (interno) dell'elemento (selezionato o meno), restituendo l'anteriore.

	int nItem			indice (base 0) dell'elemento
	BOOL bSelected		flag per selezione elemento
*/
BOOL CListCtrlEx::SetItemSelection(int nItem,BOOL bSelected)
{
	BOOL bIsSelected = FALSE;
	CTRL_ROW* ra = GetRowByItem(nItem);
	
	if(ra)
	{
		bIsSelected = ra->selected;
		ra->selected = bSelected;
	}

	return(bIsSelected);
}

/*
	GetItemSelection()

	Restituisce lo status (interno) dell'elemento (selezionata o meno).

	int nItem			indice (base 0) dell'elemento
*/
BOOL CListCtrlEx::GetItemSelection(int nItem)
{
	BOOL bIsSelected = FALSE;
	CTRL_ROW* ra = GetRowByItem(nItem);
	
	if(ra)
		bIsSelected = ra->selected;

	return(bIsSelected);
}

/*
	ResetItemsSelection()

	Azzera lo status (interno) degli elementi (imposta su non selezionati).
*/
void CListCtrlEx::ResetItemsSelection(void)
{
	CTRL_ROW* ra;

	for(int i = 0; i < CListCtrl::GetItemCount(); i++)
		if((ra = GetRowByItem(i))!=(CTRL_ROW*)NULL)
			ra->selected = FALSE;
}

/*
	CompareItems()

	Confronta i due elementi per l'ordinamento del controllo.

	LPARAM lParam1		puntatore al testo del primo elemento
	LPARAM lParam2		puntatore al testo del secondo elemento
	LPARAM lCol		indice (base 0) della colonna
*/
int CALLBACK CompareItems(LPARAM lParam1,LPARAM lParam2,LPARAM lCol)
{
	int nCmp = 0;
	int n1,n2;
	static char s1[MAX_CTRLITEM_SIZE + 1],s2[MAX_CTRLITEM_SIZE + 1];
	static int n = 0;

	strcpyn(s1,GetItemToken(lCol,(LPCSTR)lParam1),sizeof(s1));
	strcpyn(s2,GetItemToken(lCol,(LPCSTR)lParam2),sizeof(s2));

	if(bAscending)
	{
		if(cType=='N')
		{
			n1 = atoi(s1);
			n2 = atoi(s2);
			
			if(n1 < n2)
				nCmp = -1;
			else if(n1 > n2)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -