📄 clistctrlex.cpp
字号:
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 + -