CListCtrl 風格設置:
DWORD dwStyle = m_ListCtrl.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT; //選中某行使整行高亮(只適用與report風格的listctrl)
dwStyle |= LVS_EX_GRIDLINES; //網格線(只適用與report風格的listctrl)
dwStyle |= LVS_EX_SUBITEMIMAGES; // 設置圖片
dwStyle |= LVS_EX_ONECLICKACTIVATE; // 點選一個活動行
m_ListCtrl.SetExtendedStyle(dwStyle); //設置擴展風格
CListCtrl 中的item插入圖片
LVITEM lvItem;
memset(&lvItem, 0, sizeof(LVITEM));
lvItem.iItem = nI;
lvItem.iSubItem = 2;
lvItem.mask = LVIF_IMAGE;
lvItem.iImage = 1; // 不帶鉤的圖片
m_ListCtrl.SetItem(&lvItem);
CListCtrl改變單個item的顏色
首先必須先重載CListCtrl中的OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)函數,進行重繪,然後設置item顏色。
//*********************************************************************************
//** 函 數 名:OnNMCustomdraw
//** 功能描述:listctrl 控件自繪函數,用來修改控件中的顏色
//** 全局變量:
//** 調用模塊:
//** 作 者:chenbo
//** 日 期:2008-10-23
//** 修 改 者:
//** 日 期:
//** 版 本:1.0
//*********************************************************************************
void CListCtrlEx::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
*pResult = CDRF_DODEFAULT;
NMLVCUSTOMDRAW * lplvdr=(NMLVCUSTOMDRAW*)pNMHDR;
NMCUSTOMDRAW &nmcd = lplvdr->nmcd;
switch(lplvdr->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW;
break;
case CDDS_ITEMPREPAINT :
{
COLORREF ItemColor;
if( MapItemColor.Lookup(nmcd.dwItemSpec, ItemColor))
{
lplvdr->clrText = ItemColor;
*pResult = CDRF_DODEFAULT;
}
}
break;
}
}
//*********************************************************************************
//** 函 數 名:SetItemColor
//** 功能描述:設置item的顏色
//** 全局變量:
//** 調用模塊:
//** 作 者:chenbo
//** 日 期:2008-10-23
//** 修 改 者:
//** 日 期:
//** 版 本:1.0
//*********************************************************************************
void CListCtrlEx::SetItemColor(DWORD iItem, COLORREF color)
{
ASSERT(iItem >= 0);
MapItemColor.SetAt(iItem, color);
this->RedrawItems(iItem, iItem);
UpdateWindow();
}
ClistCtrl中的多選
BOOL CGeoCheckHelp::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_LBUTTONDOWN)
{
// 該函數的返回值爲一個Integer型數(雙字節),要判斷是否按下特定鍵,就看返回值,
// 如果開關鍵打開,則位0設爲1(開關鍵包括CapsLock, NumLock,ScrollLock);即(0000000000000001)2,
// 如果某鍵正處於按下狀態,則位15爲1;即(1000000000000000)2,如已經擡起,則爲0。即(0000000000000001)2,
// 如果某鍵正處於按下狀態,則位15爲1;即(1000000000000000)2,如已經擡起,則爲0
if (!(GetKeyState(VK_CONTROL)&0x8000) && !(GetKeyState(VK_SHIFT)&0x8000) )
{
if(IsMuitSelCur())
{
LVHITTESTINFO hitTest;
UINT uFlags = 0 ;
CPoint point;
point.SetPoint(pMsg->pt.x,pMsg->pt.y);
m_ListCtrl.ScreenToClient(&point);
hitTest.pt = point;
hitTest.flags = uFlags;
m_ListCtrl.HitTest(&hitTest);
int nRow = m_ListCtrl.HitTest(point);
CString strTem = m_ListCtrl.GetItemText(nRow,2);
CString strTep = m_ListCtrl.GetItemText(nRow,8);
LVHITTESTINFO sublvHit;
sublvHit.pt = point;
int nColumn = m_ListCtrl.SubItemHitTest(&sublvHit);
if(sublvHit.iSubItem == 2)
{
POSITION pos = m_ListCtrl.GetFirstSelectedItemPosition();
if (pos == NULL)
return TRUE;
else
{
do
{
int nItem = m_ListCtrl.GetNextSelectedItem(pos);
{
int nCheckID = vec1[nItem];
CString strCheckID;
strCheckID.Format(_T("%d"),nCheckID);
if ( strTem== _T("√") )
{
SetTableData(strCheckID,0);
m_ListCtrl.SetRedraw(false);
m_ListCtrl.SetItemText(nItem,2,_T("□"));
m_ListCtrl.SetRedraw(true);
}else
{
SetTableData(strCheckID,-1);
m_ListCtrl.SetRedraw(false);
m_ListCtrl.SetItemText(nItem,2,_T("√"));
m_ListCtrl.SetRedraw(true);
}
}
!時間倉促,此播客以下內容大多爲網上整理,特向原作者表示感謝!
--------------------------------------------------------------------------------
1. CListCtrl 樣式及設置
LVS_ICON: 每個item顯示大圖標
LVS_SMALLICON: 每個item顯示小圖標
LVS_LIST: 顯示一列帶有小圖標的item
LVS_REPORT: 顯示item詳細資料
如windows資源管理器,“查看”標籤下的“大圖標,小圖標,列表,詳細資料”
LONG lStyle;
lStyle=GetWindowLong(m_ListCtrl.m_hWnd, GWL_STYLE); //獲取當前窗口style
lStyle &= ~LVS_TYPEMASK; //清除顯示方式位
lStyle |= LVS_REPORT; //設置style
SetWindowLong(m_ListCtrl.m_hWnd, GWL_STYLE, lStyle); //設置style
--------------------------------------------------------------------------------
2. 擴展樣式設置
DWORD dwStyle = m_ListCtrl.GetExtendedStyle(); //獲取當前擴展樣式
dwStyle |= LVS_EX_FULLROWSELECT; //選中某行使整行高亮(report風格時)
dwStyle |= LVS_EX_GRIDLINES; //網格線(report風格時)
dwStyle |= LVS_EX_CHECKBOXES; //item前生成checkbox控件
m_ListCtrl.SetExtendedStyle(dwStyle); //設置擴展風格
--------------------------------------------------------------------------------
3. 數據插入
m_ListCtrl.InsertColumn(0,"名稱",LVCFMT_LEFT,50); //插入列
m_ListCtrl.InsertColumn(1,"備註",LVCFMT_LEFT,50);
//直接插入:
int nRow=m_ListCtrl.InsertItem(0, "VC++"); //插入行
m_ListCtrl.SetItemText(nRow,1,"Visual C++ 6.0"); //設置數據
//LVITEM 結構插入:
LVITEM item={0};
item.iItem=0; //行號
item.mask=LVIF_TEXT; /*LVIF_IMAGE支持圖標*/;
item.cchTextMax=15;//插入字符串長度
item.pszText="Visual C++ 6.0";
int nRow=m_ListCtrl.InsertItem(&item);
m_ListCtrl.SetItemText(nRow,1,"Visual C++ 6.0");
--------------------------------------------------------------------------------
4. 一直選中Item
選中style中的 Show selection always,
或者添加擴展樣式 LVS_SHOWSELALWAYS
--------------------------------------------------------------------------------
5. 選中和取消選中Item
int nIndex = 0;
//選中
m_ListCtrl.SetItemState(nIndex,LVIS_SELECTED|
LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
//取消選中
m_ListCtrl.SetItemState(nIndex,0,LVIS_SELECTED|LVIS_FOCUSED);
--------------------------------------------------------------------------------
6. 得到CListCtrl中所有行的checkbox的狀態
CString str;
for(int i=0; i<m_ListCtrl.GetItemCount(); i++)
{
if(m_ListCtrl.GetItemState(i, LVIS_SELECTED)==
LVIS_SELECTED || m_ListCtrl.GetCheck(i))
{
str.Format(_T("第%d行的checkbox爲選中狀態"), i);
AfxMessageBox(str);
}
}
--------------------------------------------------------------------------------
7. 得到CListCtrl中所有選中行的序號
//方法一:
CString str;
for(int i=0; i<m_ListCtrl.GetItemCount(); i++)
{
if(m_ListCtrl.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
{
str.Format(_T("選中了第%d行"), i);
AfxMessageBox(str);
}
}
//方法二:
POSITION pos=m_ListCtrl.GetFirstSelectedItemPosition();
if(pos==NULL)
TRACE0("No items were selected!/n");
else
{
while(pos)
{
int nItem=m_ListCtrl.GetNextSelectedItem(pos);
TRACE1("Item %d was selected!/n", nItem);
//添加其他操作
}
}
--------------------------------------------------------------------------------
8. 得到item的信息
TCHAR szBuf[1024];
LVITEM lvi;
lvi.iItem = nItemIndex;
lvi.iSubItem = 0;
lvi.mask = LVIF_TEXT;
lvi.pszText = szBuf;
lvi.cchTextMax = 1024;
m_ListCtrl.GetItem(&lvi);
關於得到設置item的狀態,還可以參考msdn文章
Q173242: Use Masks to Set/Get Item States in CListCtrl
http://support.microsoft.com/kb/173242/en-us
--------------------------------------------------------------------------------
9. 得到CListCtrl的所有列的header字符串內容
LVCOLUMN lvcol;
char str[256];
int nColNum;
CString strColumnName[3];//假如有3列
nColNum = 0;
lvcol.mask = LVCF_TEXT;
lvcol.pszText = str;
lvcol.cchTextMax = 256;
while(m_list.GetColumn(nColNum, &lvcol))
{
strColumnName[nColNum] = lvcol.pszText;
nColNum++;
}
--------------------------------------------------------------------------------
10. 使CListCtrl中一項可見,即滾動滾動條
m_ListCtrl.EnsureVisible(i, FALSE);
--------------------------------------------------------------------------------
11. 得到CListCtrl列數
int nHeadNum=m_ListCtrl.GetHeaderCtrl()->GetItemCount();
--------------------------------------------------------------------------------
12. 刪除所有列
方法一:
while(m_ListCtrl.DeleteColumn(0))
//因爲你刪除了第一列後,後面的列會依次向上移動。
方法二:
int nColumns = 3; //列數
for(int i=nColumns-1; i>=0; i--)
m_ListCtrl.DeleteColumn(i);
--------------------------------------------------------------------------------
13. 得到單擊的CListCtrl的行列號
添加listctrl控件的NM_CLICK消息相應函數
void CMyDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
//方法一:
DWORD dwPos=GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos));
m_ListCtrl.ScreenToClient(&point);
LVHITTESTINFO lvinfo;
lvinfo.pt=point;
lvinfo.flags=LVHT_ABOVE;
int nItem=m_ListCtrl.SubItemHitTest(&lvinfo);
if(nItem!=-1)
{
CString strtemp;
strtemp.Format("單擊的是第%d行第%d列",
lvinfo.iItem, lvinfo.iSubItem);
AfxMessageBox(strtemp);
}
// 方法二:
NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem!=-1)
{
CString strtemp;
strtemp.Format("單擊的是第%d行第%d列",
pNMListView->iItem, pNMListView->iSubItem);
AfxMessageBox(strtemp);
}
*pResult = 0;
}
--------------------------------------------------------------------------------
14. 判斷是否點擊在CListCtrl的checkbox上
添加listctrl控件的NM_CLICK消息相應函數
void CMyDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
DWORD dwPos=GetMessagePos();
CPoint point(LOWORD(dwPos), HIWORD(dwPos));
m_ListCtrl.ScreenToClient(&point);
LVHITTESTINFO lvinfo;
lvinfo.pt=point;
lvinfo.flags=LVHT_ABOVE;
UINT nFlag;
int nItem=m_ListCtrl.HitTest(point, &nFlag);
//判斷是否點在checkbox上
if(nFlag==LVHT_ONITEMSTATEICON)
{
AfxMessageBox("點在listctrl的checkbox上");
}
*pResult = 0;
}
--------------------------------------------------------------------------------
15. 右鍵點擊CListCtrl的item彈出菜單
添加CListCtrl控件的NM_RCLICK消息相應函數
void CMyDlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem!=-1)
{
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
CMenu menu;
VERIFY( menu.LoadMenu( IDR_MENU1 ) );
CMenu* popup = menu.GetSubMenu(0);
ASSERT( popup != NULL );
popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
point.x, point.y, this );
}
*pResult = 0;
}
--------------------------------------------------------------------------------
16. CListCtrl進行大數據量更新時,避免閃爍
m_ListCtrl.SetRedraw(FALSE);
//更新內容
m_ListCtrl.SetRedraw(TRUE);
m_ListCtrl.Invalidate();
m_ListCtrl.UpdateWindow();
//或者參考
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/sghgcn/archive/2009/03/05/3958219.aspx
}
while(pos);
}
return TRUE;
}
if (sublvHit.iSubItem == 8)
{
POSITION pos = m_ListCtrl.GetFirstSelectedItemPosition();
if (pos == NULL)
return TRUE;
else
{
do
{
int nItem = m_ListCtrl.GetNextSelectedItem(pos);
{
int nCheckID = vec1[nItem];
CString strCheckID;
strCheckID.Format(_T("%d"),nCheckID);
if ( strTep== _T("√") )
{
SetMoreTableData(strCheckID,0);
m_ListCtrl.SetRedraw(false);
m_ListCtrl.SetItemText(nItem,8,_T("□"));
m_ListCtrl.SetRedraw(true);
}else
{
SetMoreTableData(strCheckID,-1);
m_ListCtrl.SetRedraw(false);
m_ListCtrl.SetItemText(nItem,8,_T("√"));
m_ListCtrl.SetRedraw(true);
}
}
}
while(pos);
}
return TRUE;
}
}
}
}
return CDialog::PreTranslateMessage(pMsg);
}