MFC:ListControl用法

MFC:ListControl用法

以下未经说明,ListControl默认view风格为report

1. 设置CListControl风格

  1. LVS_ICON:为每个Item显示大图标;
  2. LVS_SMALLICON:为每个Item显示小图标;
  3. LVS_LIST:显示一列带有小图标的Item
  4. LVS_REPORT:显示Item详细资料。

直观的理解:windows资源管理器,"查看"标签下的"大图标,小图标,列表,详细资料。

2. 设置ListControl风格及扩展风格

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 风格的ListControl  

dwStyle |= LVS_EX_GRIDLINES;// 网格线(只适用与report 风格的ListControl  

dwStyle |= LVS_EX_CHECKBOXES;//Item前生成checkbox 控件 

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

【注】listviewstyle请查阅msdn

3. 插入数据

m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );// 插入列 

m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );

 

// 新插入的在上面

int nRow = m_list.InsertItem(0, "11");// 插入行

m_list.SetItemText(nRow, 1, "jacky");// 设置其它列数据

 

// 新插入的数据在下面

int nIndex = m_list.GetItemCount();

LV_ITEMlvItem;

lvItem.mask = LVIF_TEXT ; 

lvItem.iItem= nIndex;  //行数

lvItem.iSubItem= 0;

lvItem.pszText = (char*)(LPCTSTR)strCount;//第一列

 

// 在最后一行插入记录值.

m_list.InsertItem(&lvItem);

 

// 插入其它列

m_list.SetItemText(nIndex,1,strLat); 

4. 一直选中Item

选中style中的Show selection always,或者在上面第2点中设置LVS_SHOWSELALWAYS

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

6. 得到ListControl中所有行的checkbox的状态

m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);

CString str;

for(int i=0; i<m_list.GetItemCount(); i++)

{

if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i)) 

{

str.Format(_T(" %d 行的checkbox 为选中状态"), i); 

AfxMessageBox(str); 

}

}

7. 得到ListControl中所有选中行的序号

方法1

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

 }

}

方法2

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 nItemhere 

 } 

8. 得到Item的信息

TCHAR szBuf[1024];

LVITEMlvi;

lvi.iItem= nItemIndex;

lvi.iSubItem= 0;

lvi.mask = LVIF_TEXT;

lvi.pszText = szBuf;

lvi.cchTextMax = 1024;

m_list.GetItem(&lvi);

// 关于得到设置Item的状态,还可以参考msdn文章

9. 得到ListControl的所有列的header字符串内容

LVCOLUMN lvcol;

charstr[256]; 

intnColNum; 

CStringstrColumnName[4];// 假如有 

nColNum = 0; 

lvcol.mask = LVCF_TEXT; 

lvcol.pszText = str; 

lvcol.cchTextMax = 256; 

while(m_list.GetColumn(nColNum, &lvcol)) 

 strColumnName[nColNum] = lvcol.pszText; 

 nColNum++; 

10. 使ListControl滚动滚动条到最后

m_list.EnsureVisible(i, FALSE);

11. 得到ListControl列数

int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();

12. 删除所有列

方法1

while ( m_list.DeleteColumn (0))

因为你删除了第一列后,后面的列会依次向上移动。

方法2

int nColumns = 4;

for (int i=nColumns-1; i>=0; i--)

 m_list.DeleteColumn (i);

13. 得到单击的ListControl的行列号

添加ListControl控件的NM_CLICK消息相应函数:

void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) 

 // 方法1

 /* 

 DWORD dwPos = GetMessagePos(); 

 CPoint point( LOWORD(dwPos), HIWORD(dwPos) ); 

 m_list.ScreenToClient(&point); 

 LVHITTESTINFO lvinfo; 

 lvinfo.pt = point; 

 lvinfo.flags = LVHT_ABOVE; 

 int nItem= m_list.SubItemHitTest(&lvinfo); 

 if(nItem!= -1) 

 { 

CString strtemp; 

strtemp.Format(" 单击的是第%d 行第%d ", lvinfo.iItem, lvinfo.iSubItem); 

AfxMessageBox(strtemp); 

 } 

 */ 

  // 方法2

 /* 

 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. 判断是否点击在ListControl的checkbox上

添加ListControl控件的NM_CLICK消息相应函数:

void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)

DWORD dwPos = GetMessagePos(); 

 CPoint point( LOWORD(dwPos), HIWORD(dwPos) );

 m_list.ScreenToClient(&point); 

 LVHITTESTINFO lvinfo; 

 lvinfo.pt = point; 

 lvinfo.flags = LVHT_ABOVE; 

 UINT nFlag; 

 int nItem= m_list.HitTest(point, &nFlag); 

 // 判断是否点在checkbox  

 if(nFlag == LVHT_ONITEMSTATEICON) 

 { 

AfxMessageBox(" 点在ListControl checkbox "); 

 } 

 *pResult = 0; 

15. 右键点击ListControl的Item弹出菜单

添加ListControl控件的NM_RCLICK 消息相应函数:

void CTest6Dlg::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. Item

切换焦点时(包括用键盘和鼠标切换Item时),状态的一些变化顺序。

添加ListControl控件的LVN_ITEMCHANGED消息相应函数:

void CTest6Dlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) 

 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 

 // TODOAdd your control notification handler code here 

 CString sTemp; 

 if((pNMListView->uOldState & LVIS_FOCUSED) == LVIS_FOCUSED && (pNMListView->uNewState & LVIS_FOCUSED) == 0) 

 { 

sTemp.Format("%d losted focus",pNMListView->iItem); 

 } 

 else if((pNMListView->uOldState & LVIS_FOCUSED) == 0 && 

 (pNMListView->uNewState & LVIS_FOCUSED) == LVIS_FOCUSED) 

 { 

sTemp.Format("%d got focus",pNMListView->iItem); 

 } 

 if((pNMListView->uOldState & LVIS_SELECTED) == LVIS_SELECTED && 

(pNMListView->uNewState & LVIS_SELECTED) == 0) 

 { 

sTemp.Format("%d losted selected",pNMListView->iItem); 

 } 

else if((pNMListView->uOldState & LVIS_SELECTED) == 0 && (pNMListView->uNewState & LVIS_SELECTED) == LVIS_SELECTED) 

 { 

sTemp.Format("%d got selected",pNMListView->iItem); 

*pResult = 0; 

17. 选中listview中的Item

How To Select a Listview Item Programmatically

http//support.microsoft.com/kb/131284/en-us 

18. 如何在CListView中使用CListControl的派生类

http//www.codeguru.com/cpp/controls/listview/introduction/article.php/c919/ 

19. ListControl的subItem添加图标

m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);

m_list.SetItem(..); // 具体参数请参考msdn

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值