CListCtrl的风格有四种:
LVS_ICON: 为每个item显示大图标- LVS_SMALLICON: 为每个item显示小图标
- LVS_LIST: 显示一列带有小图标的item
- LVS_REPORT: 显示item详细资料
分别对应着资源管理器查看菜单下的大图标,小图标,列表,详细资料。
可以在控件属性视图下设置:View属性.
也可以用代码来设置,如下:
DWORD SetView( int iView );
以下解说均以report风格为例.
获取及设置风格代码示例代码如下:
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
获取及设置扩展风格示例代码如下:
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); //设置扩展风格
插入列,示例代码如下:
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.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入列,LVCFMT_LEFT为对齐方式,40为列宽 m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );
插入行,示例代码如下:
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 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); } }
在默认情况下,当选一行,再点击其它地方时,原先选中的一行会推动高亮显示,如果你想保留高亮显示,则可以在属性面板上找到属性Always Show Selection,并设置为true.
也可用设置扩展风格的方式设置,如:
dwStyle |= LVS_SHOWSELALWAYS; m_list.SetExtendedStyle(dwStyle); //设置扩展风格
int nIndex = 0; //选中 m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); //取消选中 m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);
另一种方式,包含获取选择项和设置:
// Set the selection mark to the first item only if no other item is // selected. if (m_myListCtrl.GetSelectionMark() == -1) m_myListCtrl.SetSelectionMark(0);
在单选时可用以上方法。
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); } }
另一种方法:
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 } }
获取单选项的示例代码:
POSITION pos =m_CLC_Record.GetFirstSelectedItemPosition(); if (pos == NULL) { AfxMessageBox("请先选择一项记录!"); return; } else { int nSel =m_CLC_Record.GetNextSelectedItem(pos); //do something }
// 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
有两种方法:
第一种:在属性面板中找到No Column Header属性,设置为true。
第二种:动态创建时使用LVS_NOCOLUMNHEADER。
int nCount =m_myListCtr.GetItemCount();
//滚屏 m_CLC_Record.EnsureVisible(nCount-1,false);
为CListCtrl添加NM_DBLCK事件.
示例代码:
void CTestDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); // TODO: Add your control notification handler code here 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; }
m_EditSendData =m_CLC_Record.GetItemText(nIndex,4);