亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

VC++ 中ListCtrl經驗總結

2020-01-26 15:05:05
字體:
來源:轉載
供稿:網友

先注明一下,這里,我們用m_listctrl來表示一個CListCtrl的類對象,然后這里我們的ListCtrl都是report形式,至于其他的如什么大圖標,小圖標的暫時不講,畢竟report是大眾話的使用。其次,我們這里用條款一,條款二來描述第一點,第二點,這個是參照《Effective C++》的叫法,俺覺得這么叫比較COOL :)

條款一:設置ListCtrl的風格

在CSDN上常常看到有人問怎么設置風格的,他們ListCtrl的樣子是一個列表,有橫條和豎條分界線,然后選中一行,要整一行都選中,而不是只有某一列被選中,等等,這里給一個比較全面的設置方法。

//獲得原有風格DWORD dwStyle = ::GetWindowLong(m_listctrl.m_hWnd, GWL_STYLE); dwStyle &= ~(LVS_TYPEMASK);dwStyle &= ~(LVS_EDITLABELS);//設置新風格SetWindowLong(m_listctrl.m_hWnd, GWL_STYLE,dwStyle, |LVS_REPORT | LVS_NOLABELWRAP | LVS_SHOWSELALWAYS);//設置擴展風格DWORD styles = LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES;ListView_SetExtendedListViewStyleEx(m_listctrl.m_hWnd, styles, styles );

其中LVS_EX_FULLROWSELECT 就是前面說得整行選中
LVS_EX_GRIDLINES 網格線(只適用與report風格的listctrl)
LVS_EX_CHECKBOXES 前面加個checkbox
pListCtrl->SetExtendedStyle( m_listctrl.GetExtendedStyle() | LVS_EX_SUBITEMIMAGES);
這也是一個很重要的屬性,這樣的話,可以在列表中加ICON,記得windows的任務管理器嗎,你想做得那樣,這個屬性也要加哦,這個我以后會講的~

條款二:加入列頭

這是一個比較實質的東西,給列表框分列,然后加上列頭,代碼說話,來了

TCHAR rgtsz[2][10] = {_T("列頭1"), _T("列頭2")};LV_COLUMN lvcolumn;CRect rect;m_listctrl.GetWindowRect(&rect);for(int i=0;i<2;i++){ lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH | LVCF_ORDER; lvcolumn.fmt = LVCFMT_LEFT; lvcolumn.pszText = rgtsz[i]; lvcolumn.iSubItem = i; lvcolumn.iOrder = i; if(i==0) {    lvcolumn.cx = rect.Width()*3/5 ;  } else    lvcolumn.cx = rect.Width()*2/5;  m_listctrl.InsertColumn(i, &lvcolumn);}

這是插入兩列的做法,你要插入20列??隨便你,依樣畫葫蘆~~
lvcolumn.mask 中那個mask可以有各種屬性,具體去看msdn吧,

條款三:把記錄,插入列表框中

int nIndex = m_listctrl.GetItemCount();LV_ITEM  lvitemAdd = {0};lvitemAdd.mask = LVIF_TEXT;lvitemAdd.iItem = nIndex ;lvitemAdd.iSubItem = 0;lvitemAdd.pszText =_T("毛毛1");;if (m_listctrl.InsertItem(&lvitemAdd) != -1){   LV_ITEM lvitem = {0};  lvitem.mask = LVIF_TEXT;  lvitem.iItem = nIndex ;  lvitem.iSubItem = 1;  lvitem.pszText =_T("毛毛2");  m_listctrl.SetItem(&lvitem);  }

nIndex 是當前的行數,然后把新的一行,插在最下面,

條款四:給列表中插入圖標

在report格式中,也能插入圖標

繼續代碼說話

m_image是個CImageList對象

m_image.Create(16,16, TRUE|ILC_COLOR24, 3, 1);m_listctrl.SetImageList(&m_image,LVSIL_SMALL);

然后調用CImageList的成員函數int CImageList::Add( HICON hIcon );
把ICON插入到imagelist,
然后在插入記錄的時候

lvitemAdd.mask = LVIF_TEXT; lvitemAdd.mask = LVIF_TEXT|LVIF_IMAGE

然后添加一個lvitemAdd.iImage = n;
這個n是imagelist中的序號,表示是具體的哪一個圖標,list么,呵呵

條款五:插入記錄時使用額外的信息,lParam 的使用

有時候,你想對于某一行,加入一些額外的信息,那么就可以使用這個lParam
msdn是這么描述的Specifies the 32-bit value of the item
我上次是為了在某一行加入一個信息,窗口句柄,然后是這么加的,

int nIndex = m_listctrl.GetItemCount();LV_ITEM  lvitemAdd = {0};lvitemAdd.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;lvitemAdd.iItem = nIndex ;lvitemAdd.iSubItem = 0;lvitemAdd.pszText =_T("毛毛1");;lvitemAdd.iImage = n;lvitemAdd.lParam = (LPARAM)hwnd;(某個窗口的窗口句柄)if (m_listctrl.InsertItem(&lvitemAdd) != -1){   LV_ITEM lvitem = {0};  lvitem.mask = LVIF_TEXT;  lvitem.iItem = nIndex ;  lvitem.iSubItem = 1;  lvitem.pszText =_T("毛毛2");  m_listctrl.SetItem(&lvitem);  }

ok,這是一個比較全的例子的,又插ICON,又使用PARAM的

條款六 : 點擊列表框,獲取選中行信息

響應NM_CLICK消息,如果你有MSDN,可以看到,有專門關于listview的NM_CLICK的介紹

void CMyDlg::OnItemClick(NMHDR* pNMHDR, LRESULT* pResult) {  // TODO: Add your control notification handler code here  int nItem = -1;  LPNMITEMACTIVATE lpNMItemActivate = (LPNMITEMACTIVATE)pNMHDR;  if(lpNMItemActivate != NULL)  {   nItem = lpNMItemActivate->iItem;  }}

現在nItem就是點擊選中那行的index了,有了index,獲取那行的信息還難嗎
懶漢說:難,因為你還沒講,暈,那就繼續說

條款七: 根據行的index,獲取該行的信息

直接上代碼吧

LV_ITEM lvitem = {0};lvitem.iItem = nIndex;lvitem.iSubItem = 0;lvitem.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;m_listctrl.GetItem(&lvitem)

這樣,就把nindex,第一列的信息取出來了,包括剛才我們加入的ICON,和那個額外信息(窗口句柄),比如我要獲取窗口句柄,就可以hwnd = (HWND)lvitem.lParam;
mask 用來指明你想獲取那些信息
具體可以查msdn中LVITEM Structure的定義和CListCtrl::GetItem

條款八:用程序選中某一行,使之選中

選中之 
m_listctrl.SetItemState(nIndex,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
不選中,取消選中之
m_listctrl.SetItemState(nIndex,0,LVIS_SELECTED|LVIS_FOCUSED);

條款九:獲取當前所有選中的行(多選)

這個,俺就比較懶了,抄msdn的代碼吧,反正很簡單

// CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem(IDC_YOURLISTCONTROL);ASSERT(pListCtrl != NULL);POSITION pos = pList->GetFirstSelectedItemPosition();if (pos == NULL)  TRACE0("No items were selected!/n");else{  while (pos)  {   int nItem = pList->GetNextSelectedItem(pos);   TRACE1("Item %d was selected!/n", nItem);   // you could do your own processing on nItem here  }}

條款十:刪除條款九中選中的行

這個相對前面九個條款是比較麻煩的,因為如果你要刪除多行的話,往往要出錯。比如,我現在要刪除第0行和第1行(列表的行序列是從0開始的)
那么好啊。我來刪了

m_listctrl.DeleteItem(0)m_listctrl.DeleteItem(1)

恭喜你,錯了,我好開心啊 :)
因為你刪除第0行以后,下面的行會往上移,那么原來的第1行就變成了第0行,那么你再 m_listctrl.DeleteItem(1),那么刪除的是原來的第2行,真麻煩,
所以,只有從下往上刪,才是安全的,先刪的,不會影響后面的操作,

m_listctrl.DeleteItem(1)m_listctrl.DeleteItem(0)

但有時候,我們也不知道要刪除哪些行,只知道要刪除選中的那些行,像條款九中的那些
如果我們還是用

POSITION pos = m_listctrl.GetFirstSelectedItemPosition();if (pos == NULL)  TRACE0("No items were selected!/n");else{  while (pos)  {   int nItem = m_listctrl.GetNextSelectedItem(pos);   m_listctrl.DeleteItem(nItem );  }}

你就等著收尸吧
這時候我們就要B4微軟了,為蝦米木有GetLastselectedItemPosition 和GetPrevSelectedItem,多寫一對成員函數會死啊 :(
沒辦法,辦法自己想,這里有個笨辦法

POSITION sSelPos = NULL;while(sSelPos = m_listctrl.GetFirstSelectedItemPosition()){  int nSelItem = -1;  nSelItem = m_listctrl.GetNextSelectedItem(sSelPos);  if(nSelItem >= 0 && nSelItem<m_listctrl.GetItemCount())  {   //好了,這個nSelItem 就是我們要的DD  }}GetNextSelectedItem這個函數,

看msdn的用法,其實是返回第一個的index,然后走到下一個選中的行去,所以這么做也是安全的,在實際中,俺也是這么做的,測試也通過,沒問題的

當然,還有個辦法,先通過GetFirstSelectedItemPosition和GetNextSelectedItem來獲取所有的選中行的index,然后把這些index放到一個數組里,然后再從下往上刪

唉真麻煩啊,還要不定數組,不說用new在堆上開吧,那么一個vector總是要的吧,麻煩啊,所以我暫時是用上述的辦法來刪除,也供大家參考,希望能找到更好的辦法。

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品1区2区在线观看| 国产精品久久久久久久久久久新郎| 日本免费一区二区三区视频观看| 亚洲国产另类久久精品| 久久久av电影| 91麻豆国产精品| 日韩精品视频免费在线观看| 欧美日韩成人免费| 91色p视频在线| 亚洲在线观看视频网站| 国产精品第10页| 97av在线影院| 国产欧美一区二区三区久久| 伊人久久久久久久久久久久久| 另类专区欧美制服同性| 欧美色xxxx| 精品久久久香蕉免费精品视频| 97精品国产97久久久久久春色| 国产日韩中文在线| 亚洲国产成人久久综合| 中文字幕亚洲在线| 欧美激情一级精品国产| 国产精品久久久久久久app| 国产精品女主播视频| 亚洲免费一级电影| 日韩精品日韩在线观看| 国产性猛交xxxx免费看久久| 国产91色在线免费| 欧美激情国产精品| 色无极影院亚洲| 亚洲视频777| 91系列在线观看| 久久综合久中文字幕青草| 欧美性感美女h网站在线观看免费| 欧美性极品xxxx做受| 国产精品户外野外| 亚洲色图综合久久| 日韩中文字幕在线观看| 亚洲成人精品久久久| 亚洲美腿欧美激情另类| 清纯唯美日韩制服另类| 91日本在线视频| 欧美日韩激情小视频| 欧美在线观看一区二区三区| 日韩欧美在线一区| 久久久久久久网站| 亚洲精品国精品久久99热一| 欧美性猛交xxxxx免费看| 久久久电影免费观看完整版| 欧美午夜久久久| 成人观看高清在线观看免费| 性色av一区二区三区免费| 欧美最猛性xxxxx(亚洲精品)| 色中色综合影院手机版在线观看| 91av在线国产| 成人性生交大片免费看小说| 成人午夜在线视频一区| 91视频国产高清| 欧美一乱一性一交一视频| 国产日韩精品综合网站| 日本精品视频在线| 欧洲一区二区视频| 91精品国产综合久久男男| 欧美夫妻性视频| 懂色av中文一区二区三区天美| 国产成人亚洲综合| 日本91av在线播放| 精品无人国产偷自产在线| 欧美孕妇性xx| 九九热这里只有精品免费看| 国产精品高清免费在线观看| 欧美极品少妇xxxxⅹ喷水| 久久久久久一区二区三区| 国产成人福利视频| 中文字幕日韩精品在线观看| 亚洲男人天堂视频| 欧美日韩国产中字| 日韩欧美成人免费视频| 伊人青青综合网站| 午夜精品久久久99热福利| 91视频国产一区| 亚洲国产精彩中文乱码av在线播放| 国产精品久久77777| 一本一本久久a久久精品牛牛影视| 成人精品一区二区三区电影免费| 97在线视频免费观看| 日韩精品免费在线观看| 91欧美日韩一区| 日韩a**中文字幕| 欧美亚洲另类制服自拍| 国产精品视频xxx| 国产97在线视频| 日本久久久久亚洲中字幕| 国产精品久久久久久久久免费看| 久久成人这里只有精品| 国产精品美女免费看| 久久影视电视剧免费网站清宫辞电视| 国产欧美精品一区二区| 91精品国产91久久久久久最新| 97视频在线观看免费| 国模视频一区二区| 欧美日韩美女在线观看| 色播久久人人爽人人爽人人片视av| 国产精品电影久久久久电影网| 国产成人综合av| 亚洲精品电影网站| 亚洲欧美日韩综合| 欧美另类精品xxxx孕妇| 亚洲精品在线观看www| 这里只有精品久久| 日韩精品免费在线视频观看| 国产91精品久久久| 欧美激情精品久久久久久久变态| 久久影视电视剧免费网站清宫辞电视| 国产精品扒开腿做爽爽爽的视频| 国产成人在线一区二区| 久久资源免费视频| 一夜七次郎国产精品亚洲| www.日韩av.com| 91精品国产色综合| 黑人欧美xxxx| 57pao国产精品一区| 国产精品免费一区豆花| 久久亚洲一区二区三区四区五区高| 中文字幕视频一区二区在线有码| 欧美电影免费观看大全| 欧美激情视频给我| 91中文字幕在线观看| 国产精品日本精品| 精品国产乱码久久久久酒店| 日韩精品丝袜在线| 欧美日韩中文在线观看| 国产精品亚洲аv天堂网| 久久久视频免费观看| 欧美精品一区在线播放| 日本精品久久久久影院| 中文字幕欧美专区| 国产精品一区二区三区在线播放| 久久这里有精品| 日韩激情视频在线播放| 欧美大胆a视频| 91av网站在线播放| 欧美日韩加勒比精品一区| 欧美日在线观看| 精品中文字幕久久久久久| 精品久久久在线观看| 美日韩在线视频| 2019中文字幕全在线观看| 亚洲综合大片69999| 国产国语videosex另类| 2021国产精品视频| 欧美洲成人男女午夜视频| 国产精品99久久久久久www| 久久国产精品久久久| 国产精品久久久久久久9999| 日韩中文第一页| 国内精品400部情侣激情| 国产成人高清激情视频在线观看| 91精品在线看| 精品爽片免费看久久| 亚洲成人在线网| 高清欧美一区二区三区| 91中文字幕在线观看| 亚洲性线免费观看视频成熟|