• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 131, comments - 12, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            VC++ List Control 的具體用法

            Posted on 2012-12-26 17:36 盛勝 閱讀(417) 評論(0)  編輯 收藏 引用

            VC++ List Control 的具體用法

            1. ListCtrl 風格
                  LVS_ICON: 為每個item顯示大圖標
                  LVS_SMALLICON: 為每個item顯示小圖標
                  LVS_LIST: 顯示一列帶有小圖標的item
                  LVS_REPORT: 顯示item詳細資料
                  直觀的理解:windows資源管理器,“查看”標簽下的“大圖標,小圖標,列表,詳細資料”
            --------------------------------------------------------------------------------
            2. 設(shè)置listctrl 風格及擴展風格
                  LONG lStyle;
                  lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//獲取當前窗口style
                  lStyle &= ~LVS_TYPEMASK; //清除顯示方式位
                  lStyle |= LVS_REPORT; //設(shè)置style
                  SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//設(shè)置style

                  DWORD dwStyle = m_list.GetExtendedStyle();
                  dwStyle |= LVS_EX_FULLROWSELECT;//選中某行使整行高亮(只適用與report風格的listctrl)
                  dwStyle |= LVS_EX_GRIDLINES;//網(wǎng)格線(只適用與report風格的listctrl)
                  dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
                  m_list.SetExtendedStyle(dwStyle); //設(shè)置擴展風格
            --------------------------------------------------------------------------------
            3. 插入數(shù)據(jù)
                  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”);//設(shè)置數(shù)據(jù)
            --------------------------------------------------------------------------------
            4. 一直選中item
                選中style中的Show selection always,或者在上面第2點中設(shè)置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. 得到listctrl中所有行的checkbox的狀態(tài)
                  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為選中狀態(tài)"), i);
                            AfxMessageBox(str);
                       }
                  }

            CString strIns;
            strIns="delete from tmpStatByGround";
            m_pRs.CreateInstance(__uuidof(Recordset));
            m_pRs->CursorLocation = adUseClient;
            m_pRs->Open((LPCTSTR)strIns, vDispatch, adOpenKeyset,
            adLockOptimistic, adCmdUnknown);

            --------------------------------------------------------------------------------
            7. 得到listctrl中所有選中行的序號
                  方法一:
                  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
                       }
                  }
            --------------------------------------------------------------------------------
            8. 得到item的信息
                  TCHAR szBuf[1024];
                  LVITEM lvi;
                  lvi.iItem = nItemIndex;
                  lvi.iSubItem = 0;
                  lvi.mask = LVIF_TEXT;
                  lvi.pszText = szBuf;
                  lvi.cchTextMax = 1024;
                  m_list.GetItem(&lvi);
            --------------------------------------------------------------------------------
            9. 得到listctrl的所有列的header字符串內(nèi)容
                  LVCOLUMN lvcol;
                  char  str[256];
                  int   nColNum;
                  CString  strColumnName[4];//假如有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. 使listctrl中一項可見,即滾動滾動條
                m_list.EnsureVisible(i, FALSE);
            --------------------------------------------------------------------------------
            11. 得到listctrl列數(shù)
                int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();
            --------------------------------------------------------------------------------
            12. 刪除所有列
                  方法一:
                     while ( m_list.DeleteColumn (0))
                   因為你刪除了第一列后,后面的列會依次向上移動。
                  方法二:
                  int nColumns = 4;
                  for (int i=nColumns-1; i>=0; i--)
                      m_list.DeleteColumn (i);
            --------------------------------------------------------------------------------
            13. 得到單擊的listctrl的行列號
                  添加listctrl控件的NM_CLICK消息相應(yīng)函數(shù)
                  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;
                
                       int nItem = m_list.SubItemHitTest(&lvinfo);
                       if(nItem != -1)
                       {
                            CString strtemp;
                            strtemp.Format("單擊的是第%d行第%d列", lvinfo.iItem, lvinfo.iSubItem);
                            AfxMessageBox(strtemp);
                       }
                      */
              
                      // 方法二:
                      /*
                       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. 判斷是否點擊在listctrl的checkbox上
                  添加listctrl控件的NM_CLICK消息相應(yīng)函數(shù)
                  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("點在listctrl的checkbox上");
                       }
                       *pResult = 0;
                  }
            --------------------------------------------------------------------------------
            15. 右鍵點擊listctrl的item彈出菜單
                  添加listctrl控件的NM_RCLICK消息相應(yīng)函數(shù)
                  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時),狀態(tài)的一些變化順序
                  添加listctrl控件的LVN_ITEMCHANGED消息相應(yīng)函數(shù)
                  void CTest6Dlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)
                  {
                       NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
                       // TODO: Add 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. listctrl的  subitem 添加圖標
                  注意: 首先要用 InsertItem() 插入一行的第一列, 然后才能用 SetItem 設(shè)置其他項 
                  m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);
                  m_userlist.SetItem(..);
            --------------------------------------------------------------------------------
            18. 在CListCtrl顯示文件,并根據(jù)文件類型來顯示圖標
                  網(wǎng)上找到的代碼,自己試用并改正過, share
            步驟1: 設(shè)置 list 的圖像列表為 系統(tǒng)圖像列表   
            BOOL SetSystemImageList( CListCtrl & list )
            {     
            HIMAGELIST himlSmall;
            HIMAGELIST himlLarge;
            SHFILEINFO sfi;
            char  cSysDir[MAX_PATH];
            CString  strBuf;
            memset(cSysDir, 0, MAX_PATH);
            GetWindowsDirectory(cSysDir, MAX_PATH);
            strBuf = cSysDir ;

            // SHGetFileInfo:
            // If uFlags contains SHGFI_SYSICONINDEX, the return value is a handle to
            // an image list that contains the large icon images.
            // If SHGFI_SMALLICON is included with SHGFI_SYSICONINDEX, the return value
            // is the handle to an image list that contains the small icon images.
            //
            himlSmall = (HIMAGELIST)SHGetFileInfo ( (LPCSTR)cSysDir, 
                 0, 
                 &sfi,
                 sizeof(SHFILEINFO), 
                 SHGFI_SYSICONINDEX | SHGFI_SMALLICON );
            himlLarge = (HIMAGELIST)SHGetFileInfo((LPCSTR)cSysDir, 
                 0, 
                 &sfi, 
                 sizeof(SHFILEINFO), 
                 SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
            if (himlSmall && himlLarge)
            {
              ::SendMessage(list.m_hWnd, LVM_SETIMAGELIST,
                  (WPARAM)LVSIL_SMALL, (LPARAM)himlSmall);
              
              ::SendMessage(list.m_hWnd, LVM_SETIMAGELIST,
                  (WPARAM)LVSIL_NORMAL, (LPARAM)himlLarge);
            }
            return TRUE;
            }
            步驟2:  給列表添加指定的文件, 同時獲得該文件的的圖標索引, 給 list 添加圖標
            int GetIconIndex(LPCTSTR lpszPath, BOOL bIsDir, BOOL bSelected) ; //  向前聲明
            void AddFiles(CListCtrl & list, LPCTSTR lpszFileName, BOOL bAddToDocument)
            {
            int nIcon = GetIconIndex(lpszFileName, FALSE, TRUE);
            CString strSize;
            CFileFind filefind;
            //  get file size
            if ( filefind.FindFile(lpszFileName))
            {
              filefind.FindNextFile();
              strSize.Format("%d", filefind.GetLength());
            }
            else
              strSize = "0";
            // split path and filename
            CString strFileName = lpszFileName;
            CString strPath;
            int nPos = strFileName.ReverseFind('');
            if (nPos != -1)
            {
              strPath = strFileName.Left(nPos);
              strFileName = strFileName.Mid(nPos 1);
            }
            // insert to list
            int nItem = list.GetItemCount();


            //list.InsertItem(nItem, strFileName, nIcon);
            //list.SetItemText(nItem, 1, strSize);
            //
            // 此處可以根據(jù)實際需要修改代碼
            //
            }
                 
            --------------------------------------------------------------------------------
            19. listctrl內(nèi)容進行大數(shù)據(jù)量更新時,避免閃爍
                  m_list.SetRedraw(FALSE);
                  //更新內(nèi)容
                  m_list.SetRedraw(TRUE);
                  m_list.Invalidate();
                  m_list.UpdateWindow();
            20. 清除 ListCtrl 以重新初始化:
                  // 刪除所有行
            m_ctrllist.DeleteAllItems() ;    
            // 刪除所有列
            int iColCount = m_ctrllist.GetHeaderCtrl()->GetItemCount() ;

            // 方法 1
            // 原理: 刪除第一列后, 其他列向前移動
            while( m_ctrllist.DeleteColumn(0) ) ;
               
            // 方法 2
            for (int i=0; i < iColCount ; i )
            {
              m_ctrllist.DeleteColumn(0);
            }
            // 方法 3
            for (int i=iColCount-1; i >= 0; i-- )
            {
              m_ctrllist.DeleteColumn( i );
            }


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久精品青青草原伊人| 国产精品99精品久久免费| 狠狠色丁香婷综合久久| 亚洲中文字幕久久精品无码APP| 欧美精品九九99久久在观看| 久久久久久久综合综合狠狠| 亚洲欧美日韩精品久久| 日韩一区二区久久久久久| 中文字幕亚洲综合久久2| 国产69精品久久久久9999| 青青青国产精品国产精品久久久久 | 亚洲AV日韩精品久久久久久久| 狠狠色丁香久久婷婷综合_中 | 99久久这里只精品国产免费| 一本大道久久东京热无码AV| 亚洲人成电影网站久久| 亚洲精品无码久久千人斩| 2021国内久久精品| 91精品国产高清91久久久久久| 嫩草影院久久国产精品| 欧美大战日韩91综合一区婷婷久久青草 | 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 久久久中文字幕| 久久精品视频91| 国色天香久久久久久久小说| 成人久久久观看免费毛片| 久久亚洲中文字幕精品一区| 久久亚洲AV无码精品色午夜| 99久久超碰中文字幕伊人| 久久99国产一区二区三区| 99精品国产99久久久久久97| 色综合久久天天综合| 青春久久| 9999国产精品欧美久久久久久| 国产精品久久久久蜜芽| 一本伊大人香蕉久久网手机| 久久天天躁夜夜躁狠狠躁2022| 精品久久久久久久| 久久人人爽人人爽人人片av麻烦| av无码久久久久久不卡网站| 久久综合亚洲鲁鲁五月天|