CListCtrl的用法总结

1 CListCtrl的风格

CListCtrl的风格有四种:

  • LVS_ICON: 为每个item显示大图标
  • LVS_SMALLICON: 为每个item显示小图标
  • LVS_LIST: 显示一列带有小图标的item
  • LVS_REPORT: 显示item详细资料

分别对应着资源管理器查看菜单下的大图标,小图标,列表,详细资料。

可以在控件属性视图下设置:View属性.

也可以用代码来设置,如下:

DWORD SetView(
   int iView 
);

以下解说均以report风格为例.


2 设置CListCtrl风格及扩展风格

获取及设置风格代码示例代码如下:

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); //设置扩展风格

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);

也可用另一种方式,如:

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);
	}
}

4 一直选中一行

在默认情况下,当选一行,再点击其它地方时,原先选中的一行会推动高亮显示,如果你想保留高亮显示,则可以在属性面板上找到属性Always Show Selection,并设置为true.

也可用设置扩展风格的方式设置,如:

dwStyle |= LVS_SHOWSELALWAYS;
m_list.SetExtendedStyle(dwStyle); //设置扩展风格


5 选中和取消一行

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);

在单选时可用以上方法。

6 获取选择项

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
}


7 绑定数据

// 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 获取总行数

int nCount =m_myListCtr.GetItemCount();


10 滚屏

//滚屏
m_CLC_Record.EnsureVisible(nCount-1,false);


11 双击一行

为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;
}


12 获取Item字符串

m_EditSendData =m_CLC_Record.GetItemText(nIndex,4);


你可能感兴趣的:(list)