日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CListCtrl的用法总结

發布時間:2025/3/12 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CListCtrl的用法总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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);//獲取當前窗口style??
  • lStyle?&=?~LVS_TYPEMASK;?//清除顯示方式位??
  • lStyle?|=?LVS_REPORT;?//設置style??
  • SetWindowLong(m_list.m_hWnd,?GWL_STYLE,?lStyle);//設置style??
  • 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;//選中某行使整行高亮(只適用與report風格的listctrl)??
  • dwStyle?|=?LVS_EX_GRIDLINES;//網格線(只適用與report風格的listctrl)??
  • dwStyle?|=?LVS_EX_CHECKBOXES;//item前生成checkbox控件??
  • 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?);//插入列,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();??
  • ??
  • //?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);??
  • ????}??
  • }??
  • 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?
  • //?Set?the?selection?mark?to?the?first?item?only?if?no?other?item?is???
  • //?selected.??
  • 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);??
  • ????????//?you?could?do?your?own?processing?on?nItem?here??
  • ????}??
  • }??
  • 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);??
  • ????//do?something??
  • }??
  • 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?
  • //?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);??
  • ????}??
  • }??
  • // 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);??
  • ????//?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;??
  • }??
  • 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的用法总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。