1 CListCtrl的風格
CListCtrl的風格有四種:
LVS_ICON: 為每個item顯示大圖標 LVS_SMALLICON: 為每個item顯示小圖標 LVS_LIST: 顯示一列帶有小圖標的item LVS_REPORT: 顯示item詳細資料 分別對應著資源管理器查看菜單下的大圖標,小圖標,列表,詳細資料。
可以在控件屬性視圖下設置:View屬性.
也可以用代碼來設置,如下:
[cpp] view plaincopy print?
DWORD ?SetView(?????int ?iView??? );?? DWORD SetView(int iView
);
以下解說均以report風格為例.
2 設置CListCtrl風格及擴展風格
獲取及設置風格代碼示例代碼如下:
[cpp] view plaincopy print?
LONG ?lStyle;??lStyle?=?GetWindowLong(m_list.m_hWnd,?GWL_STYLE);?? lStyle?&=?~LVS_TYPEMASK;??? lStyle?|=?LVS_REPORT;??? SetWindowLong(m_list.m_hWnd,?GWL_STYLE,?lStyle);??
LONG lStyle;
lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//獲取當前窗口style
lStyle &= ~LVS_TYPEMASK; //清除顯示方式位
lStyle |= LVS_REPORT; //設置style
SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//設置style
獲取及設置擴展風格示例代碼如下:
[cpp] view plaincopy print?
DWORD ?dwStyle?=?m_list.GetExtendedStyle();??dwStyle?|=?LVS_EX_FULLROWSELECT;?? dwStyle?|=?LVS_EX_GRIDLINES;?? dwStyle?|=?LVS_EX_CHECKBOXES;?? m_list.SetExtendedStyle(dwStyle);???
DWORD dwStyle = m_list.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//選中某行使整行高亮(只適用與report風格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;//網格線(只適用與report風格的listctrl)
dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
m_list.SetExtendedStyle(dwStyle); //設置擴展風格
3 插入數據
插入列,示例代碼如下:
[cpp] view plaincopy print?
m_list_av.InsertColumn(0,"PID" );?? m_list_av.InsertColumn(1,"name" );?? m_list_av.InsertColumn(2,"value" );?? ?? CRect?rect;?? m_list_av.GetClientRect(rect);?????????????????????? m_list_av.SetColumnWidth(0,rect.Width()/6);????????? m_list_av.SetColumnWidth(1,rect.Width()/2);?? m_list_av.SetColumnWidth(2,rect.Width()/3);??
m_list_av.InsertColumn(0,"PID");
m_list_av.InsertColumn(1,"name");
m_list_av.InsertColumn(2,"value");CRect rect;
m_list_av.GetClientRect(rect); //獲得當前客戶區信息
m_list_av.SetColumnWidth(0,rect.Width()/6); //設置列的寬度。
m_list_av.SetColumnWidth(1,rect.Width()/2);
m_list_av.SetColumnWidth(2,rect.Width()/3);
也可用另一種方式,如:
[cpp] view plaincopy print?
m_list.InsertColumn(?0,?"ID" ,?LVCFMT_LEFT,?40?);?? m_list.InsertColumn(?1,?"NAME" ,?LVCFMT_LEFT,?50?);??
m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入列,LVCFMT_LEFT為對齊方式,40為列寬
m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );
插入行,示例代碼如下:
[cpp] view plaincopy print?
CString?str;?? for (int ?i=0;?i<m_av_count;?i++){??????m_list_av.InsertItem(i,m_avs[i].name);?? ????str.Format("%04x" ,m_avs[i].pid);?? ????m_list_av.SetItemText(i,0,str);?? ????m_list_av.SetItemText(i,1,m_avs[i].name);?? ????GetValueAsStirng(&m_avs[i],str);?? ????m_list_av.SetItemText(i,2,str);?? }??
CString str;
for(int i=0; i<m_av_count; i++){m_list_av.InsertItem(i,m_avs[i].name);str.Format("%04x",m_avs[i].pid);m_list_av.SetItemText(i,0,str);m_list_av.SetItemText(i,1,m_avs[i].name);GetValueAsStirng(&m_avs[i],str);m_list_av.SetItemText(i,2,str);
}
另一個示例如下:
[cpp] view plaincopy print?
CString?strText;?? int ?nColumnCount?=?m_myListCtrl.GetHeaderCtrl()->GetItemCount();???? ?? for ?(int ?i?=?0;?i?<?10;?i++)??{?? ????strText.Format(TEXT("item?%d" ),?i);?? ?? ?????? ????m_myListCtrl.InsertItem(LVIF_TEXT?|?LVIF_STATE,?i,?strText,??? ????????(i?%?2)?==?0???LVIS_SELECTED?:?0,?LVIS_SELECTED,?0,?0);?? ?? ?????? ????for ?(int ?j?=?1;?j?<?nColumnCount;?j++)?? ????{?? ????????strText.Format(TEXT("sub-item?%d?%d" ),?i,?j);?? ????????m_myListCtrl.SetItemText(i,?j,?strText);?? ????}?? }??
CString strText;
int nColumnCount = m_myListCtrl.GetHeaderCtrl()->GetItemCount();// Insert 10 items in the list view control.
for (int i = 0; i < 10; i++)
{strText.Format(TEXT("item %d"), i);// Insert the item, select every other item.m_myListCtrl.InsertItem(LVIF_TEXT | LVIF_STATE, i, strText, (i % 2) == 0 ? LVIS_SELECTED : 0, LVIS_SELECTED, 0, 0);// Initialize the text of the subitems.for (int j = 1; j < nColumnCount; j++){strText.Format(TEXT("sub-item %d %d"), i, j);m_myListCtrl.SetItemText(i, j, strText);}
}
4 一直選中一行
在默認情況下,當選一行,再點擊其它地方時,原先選中的一行會推動高亮顯示,如果你想保留高亮顯示,則可以在屬性面板上找到屬性Always Show Selection,并設置為true.
也可用設置擴展風格的方式設置,如:
[cpp] view plaincopy print?
dwStyle?|=?LVS_SHOWSELALWAYS;?? m_list.SetExtendedStyle(dwStyle);???
dwStyle |= LVS_SHOWSELALWAYS;
m_list.SetExtendedStyle(dwStyle); //設置擴展風格
5 選中和取消一行
[cpp] view plaincopy print?
int ?nIndex?=?0;???? m_list.SetItemState(nIndex,?LVIS_SELECTED|LVIS_FOCUSED,?LVIS_SELECTED|LVIS_FOCUSED);?? ?? m_list.SetItemState(nIndex,?0,?LVIS_SELECTED|LVIS_FOCUSED);??
int nIndex = 0;
//選中
m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
//取消選中
m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);
另一種方式,包含獲取選擇項和設置:
[cpp] view plaincopy print?
?? ?? if ?(m_myListCtrl.GetSelectionMark()?==?-1)??????m_myListCtrl.SetSelectionMark(0);??
// Set the selection mark to the first item only if no other item is
// selected.
if (m_myListCtrl.GetSelectionMark() == -1)m_myListCtrl.SetSelectionMark(0);
在單選時可用以上方法。
6 獲取選擇項
[cpp] view plaincopy print?
CString?str;?? for (int ?i=0;?i<m_list.GetItemCount();?i++)??{?? ?????if (?m_list.GetItemState(i,?LVIS_SELECTED)?==?LVIS_SELECTED?)?? ?????{?? ??????????str.Format(_T("選中了第%d行" ),?i);?? ??????????AfxMessageBox(str);?? ?????}?? }??
CString str;
for(int i=0; i<m_list.GetItemCount(); i++)
{if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED ){str.Format(_T("選中了第%d行"), i);AfxMessageBox(str);}
}
另一種方法:
[cpp] view plaincopy print?
POSITION?pos?=?m_list.GetFirstSelectedItemPosition();?? if ?(pos?==?NULL)??????TRACE0("No?items?were?selected!\n" );?? else ??{?? ????while ?(pos)?? ????{?? ????????int ?nItem?=?m_list.GetNextSelectedItem(pos);?? ????????TRACE1("Item?%d?was?selected!\n" ,?nItem);?? ?????????? ????}?? }??
POSITION pos = m_list.GetFirstSelectedItemPosition();
if (pos == NULL)TRACE0("No items were selected!\n");
else
{while (pos){int nItem = m_list.GetNextSelectedItem(pos);TRACE1("Item %d was selected!\n", nItem);// you could do your own processing on nItem here}
}
獲取單選項的示例代碼:
[cpp] view plaincopy print?
POSITION?pos?=m_CLC_Record.GetFirstSelectedItemPosition();?? if ?(pos?==?NULL)??{?? ????AfxMessageBox("請先選擇一項記錄!" );?? ????return ;?? }?? else ??{?? ????int ?nSel?=m_CLC_Record.GetNextSelectedItem(pos);?? ?????? }??
POSITION pos =m_CLC_Record.GetFirstSelectedItemPosition();
if (pos == NULL)
{AfxMessageBox("請先選擇一項記錄!");return;
}
else
{int nSel =m_CLC_Record.GetNextSelectedItem(pos);//do something
}
?
7 綁定數據
[cpp] view plaincopy print?
?? for ?(int ?i=0;?i?<?m_myListCtrl.GetItemCount();?i++)??{?? ????if ?(m_myListCtrl.GetItemData(i)?==?0)?? ????{?? ????????m_myListCtrl.SetItemData(i,?(DWORD )?-1);?? ????}?? }??
// If any item's data is equal to zero then reset it to -1.
for (int i=0; i < m_myListCtrl.GetItemCount(); i++)
{if (m_myListCtrl.GetItemData(i) == 0){m_myListCtrl.SetItemData(i, (DWORD) -1);}
}
參考:http://www.cnblogs.com/cy163/archive/2006/10/15/529790.html
?8 隱藏表頭
有兩種方法:
第一種:在屬性面板中找到No Column Header屬性,設置為true。
第二種:動態創建時使用LVS_NOCOLUMNHEADER。
?
9 獲取總行數
[cpp] view plaincopy print?
int ?nCount?=m_myListCtr.GetItemCount();??
int nCount =m_myListCtr.GetItemCount();
?10 滾屏
[cpp] view plaincopy print?
?? m_CLC_Record.EnsureVisible(nCount-1,false );??
//滾屏
m_CLC_Record.EnsureVisible(nCount-1,false);
?11 雙擊一行
為CListCtrl添加NM_DBLCK事件.
示例代碼:
[cpp] view plaincopy print?
void ?CTestDlg::OnNMDblclkList1(NMHDR?*pNMHDR,?LRESULT ?*pResult)??{?? ????LPNMITEMACTIVATE?pNMItemActivate?=?reinterpret_cast <LPNMITEMACTIVATE>(pNMHDR);?? ?????? ????NMLISTVIEW*?pMListView=(NMLISTVIEW*)?pNMHDR;?? ????????int ?nIndex?=?pMListView->iItem;?? ?? ????RecordData?*pdata?=(RecordData?*)m_CLC_Record.GetItemData(nIndex);?? ????m_ComboSendType.SetCurSel(pdata->SendFmt);?? ????m_ComboSendFrmType.SetCurSel(pdata->FrameType);?? ????m_ComboSendFrmFmt.SetCurSel(pdata->FramFmt);?? ????m_EditSendFrmID.Format("%08x" ,pdata->FrameID);?? ????m_EditSendData?=m_CLC_Record.GetItemText(nIndex,4);?? ????m_Delay?=pdata->DelayTime;?? ????UpdateData(false );?? ????*pResult?=?0;?? }??
void CTestDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);// TODO: Add your control notification handler code hereNMLISTVIEW* pMListView=(NMLISTVIEW*) pNMHDR;int nIndex = pMListView->iItem;RecordData *pdata =(RecordData *)m_CLC_Record.GetItemData(nIndex);m_ComboSendType.SetCurSel(pdata->SendFmt);m_ComboSendFrmType.SetCurSel(pdata->FrameType);m_ComboSendFrmFmt.SetCurSel(pdata->FramFmt);m_EditSendFrmID.Format("%08x",pdata->FrameID);m_EditSendData =m_CLC_Record.GetItemText(nIndex,4);m_Delay =pdata->DelayTime;UpdateData(false);*pResult = 0;
}
12 獲取Item字符串
[cpp] view plaincopy print?
m_EditSendData?=m_CLC_Record.GetItemText(nIndex,4);??
m_EditSendData =m_CLC_Record.GetItemText(nIndex,4);
?
總結
以上是生活随笔 為你收集整理的CListCtrl的用法总结 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。