• <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 盛勝 閱讀(434) 評(píng)論(0)  編輯 收藏 引用

            VC++ List Control 的具體用法

            1. ListCtrl 風(fēng)格
                  LVS_ICON: 為每個(gè)item顯示大圖標(biāo)
                  LVS_SMALLICON: 為每個(gè)item顯示小圖標(biāo)
                  LVS_LIST: 顯示一列帶有小圖標(biāo)的item
                  LVS_REPORT: 顯示item詳細(xì)資料
                  直觀的理解:windows資源管理器,“查看”標(biāo)簽下的“大圖標(biāo),小圖標(biāo),列表,詳細(xì)資料”
            --------------------------------------------------------------------------------
            2. 設(shè)置listctrl 風(fēng)格及擴(kuò)展風(fēng)格
                  LONG lStyle;
                  lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//獲取當(dāng)前窗口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風(fēng)格的listctrl)
                  dwStyle |= LVS_EX_GRIDLINES;//網(wǎng)格線(只適用與report風(fēng)格的listctrl)
                  dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
                  m_list.SetExtendedStyle(dwStyle); //設(shè)置擴(kuò)展風(fēng)格
            --------------------------------------------------------------------------------
            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點(diǎn)中設(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中所有選中行的序號(hào)
                  方法一:
                  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中一項(xiàng)可見,即滾動(dòng)滾動(dòng)條
                m_list.EnsureVisible(i, FALSE);
            --------------------------------------------------------------------------------
            11. 得到listctrl列數(shù)
                int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();
            --------------------------------------------------------------------------------
            12. 刪除所有列
                  方法一:
                     while ( m_list.DeleteColumn (0))
                   因?yàn)槟銊h除了第一列后,后面的列會(huì)依次向上移動(dòng)。
                  方法二:
                  int nColumns = 4;
                  for (int i=nColumns-1; i>=0; i--)
                      m_list.DeleteColumn (i);
            --------------------------------------------------------------------------------
            13. 得到單擊的listctrl的行列號(hào)
                  添加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. 判斷是否點(diǎn)擊在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);
                       //判斷是否點(diǎn)在checkbox上
                       if(nFlag == LVHT_ONITEMSTATEICON)
                       {
                            AfxMessageBox("點(diǎn)在listctrl的checkbox上");
                       }
                       *pResult = 0;
                  }
            --------------------------------------------------------------------------------
            15. 右鍵點(diǎn)擊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切換焦點(diǎn)時(shí)(包括用鍵盤和鼠標(biāo)切換item時(shí)),狀態(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 添加圖標(biāo)
                  注意: 首先要用 InsertItem() 插入一行的第一列, 然后才能用 SetItem 設(shè)置其他項(xiàng) 
                  m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);
                  m_userlist.SetItem(..);
            --------------------------------------------------------------------------------
            18. 在CListCtrl顯示文件,并根據(jù)文件類型來顯示圖標(biāo)
                  網(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:  給列表添加指定的文件, 同時(shí)獲得該文件的的圖標(biāo)索引, 給 list 添加圖標(biāo)
            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ù)實(shí)際需要修改代碼
            //
            }
                 
            --------------------------------------------------------------------------------
            19. listctrl內(nèi)容進(jìn)行大數(shù)據(jù)量更新時(shí),避免閃爍
                  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
            // 原理: 刪除第一列后, 其他列向前移動(dòng)
            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 );
            }


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


            国产aⅴ激情无码久久| 精品久久久久久综合日本| 一本综合久久国产二区| 亚洲色欲久久久久综合网 | 久久精品a亚洲国产v高清不卡| av无码久久久久久不卡网站| 久久99亚洲综合精品首页 | 久久精品免费一区二区| 久久人人爽人人爽人人片AV高清| AV狠狠色丁香婷婷综合久久| 女同久久| 亚洲综合久久综合激情久久| 久久人妻无码中文字幕| 国产一区二区精品久久岳| 看久久久久久a级毛片| 中文字幕精品无码久久久久久3D日动漫 | 色诱久久av| 大香网伊人久久综合网2020| 亚洲中文精品久久久久久不卡| 久久精品国产精品亚洲下载| 九九久久自然熟的香蕉图片| 久久婷婷国产剧情内射白浆| 久久久久国产精品三级网| 亚洲欧美精品伊人久久| 久久99国内精品自在现线| 亚洲精品无码久久久久sm| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 伊人久久大香线蕉综合Av| 热久久最新网站获取| 久久久91人妻无码精品蜜桃HD | 精品熟女少妇av免费久久| 性欧美丰满熟妇XXXX性久久久 | 91精品久久久久久无码| 国产精品久久成人影院| 国产精品久久久久久久久免费| 久久精品水蜜桃av综合天堂| 亚洲AV乱码久久精品蜜桃| 欧洲成人午夜精品无码区久久 | 97精品依人久久久大香线蕉97| 2021国产精品午夜久久| 亚洲午夜久久久久妓女影院|