春天花會開

          ***********

          統(tǒng)計

          留言簿(4)

          閱讀排行榜

          評論排行榜

          [轉(zhuǎn)]CListCtrl使用技巧--學(xué)習(xí)用

          以下未經(jīng)說明,listctrl默認view 風(fēng)格為report

          1. CListCtrl 風(fēng)格

                LVS_ICON: 為每個item顯示大圖標
                LVS_SMALLICON: 為每個item顯示小圖標
                LVS_LIST: 顯示一列帶有小圖標的item
                LVS_REPORT: 顯示item詳細資料

                直觀的理解:windows資源管理器,“查看”標簽下的“大圖標,小圖標,列表,詳細資料”


          2. 設(shè)置listctrl 風(fēng)格及擴展風(fēng)格

                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風(fēng)格的listctrl)
                dwStyle |= LVS_EX_GRIDLINES;//網(wǎng)格線(只適用與report風(fēng)格的listctrl)
                dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
                m_list.SetExtendedStyle(dwStyle); //設(shè)置擴展風(fēng)格
           
                注:listview的style請查閱msdn
                http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp

           

          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      {
                     if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))
                     {
                          str.Format(_T("第%d行的checkbox為選中狀態(tài)"), i);
                          AfxMessageBox(str);
                     }
                }


          7. 得到listctrl中所有選中行的序號


                方法一:
                CString str;
                for(int i=0; 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);

                關(guān)于得到設(shè)置item的狀態(tài),還可以參考msdn文章
                Q173242: Use Masks to Set/Get Item States in CListCtrl
                         http://support.microsoft.com/kb/173242/en-us


          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控件的item內(nèi)容

          http://www.codeproject.com/threads/int64_memsteal.asp


          18. 選中l(wèi)istview中的item

          Q131284: How To Select a Listview Item Programmatically
          http://support.microsoft.com/kb/131284/en-us


          19. 如何在CListView中使用CListCtrl的派生類

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


          20. listctrl的subitem添加圖標

                m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);
                m_list.SetItem(..); //具體參數(shù)請參考msdn

          21.判斷CListCtrl的哪行記錄被選中了
          1.int n = -1;
          2.POSITION pos = m_pCtrl->GetFirstSelectedItemPosition(); //返回第一個選中的行位置
          3.if (pos != NULL)
          4.{
          5.   while (pos)
          6.   {
          7.                n = m_pCtrl->GetNextSelectedItem(pos);  //返回下一個選中的行數(shù)(返回值從0開始)
          8.                //做相應(yīng)操作
          9.   }
          10.}

          22.響應(yīng)單擊CListCtrl事件
          1.//響應(yīng)CMyListView的=NUM_CLICK消息
          2.//直接用VC類向?qū)珊?不用再次添加聲明和消息映射
          3.
          4.//添加函數(shù)聲明
          5.afx_msg void OnClick(NMHDR* pNMHDR, LRESULT* pResult);
          6.//添加消息映射
          7.ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
          8.
          9.void CMyListView::OnClick(NMHDR* pNMHDR, LRESULT* pResult)
          10.{
          11.        // TODO: Add your control notification handler code here
          12.        NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
          13.        if(pNMListView->iItem != -1)
          14.        {
          15.                /*
          16.                CString strtemp;
          17.                strtemp.Format("單擊的是第%d行第%d列",
          18.                                                pNMListView->iItem, pNMListView->iSubItem);
          19.                AfxMessageBox(strtemp);
          20.                */
          21.                //值從0開始計算,無數(shù)據(jù)區(qū)不相應(yīng)時間
          22.                //相應(yīng)操作
          23.        }
          24.        *pResult = 0;
          25.}




          posted on 2009-04-30 11:20 春天花會開 閱讀(3060) 評論(0)  編輯  收藏

          主站蜘蛛池模板: 八宿县| 齐河县| 扶绥县| 黎城县| 临邑县| 新宁县| 泸州市| 禹州市| 鄄城县| 阿拉善左旗| 临洮县| 楚雄市| 汕尾市| 读书| 荔波县| 太康县| 静海县| 辰溪县| 赤峰市| 临沂市| 曲阳县| 江西省| 浪卡子县| 六盘水市| 青岛市| 余庆县| 乌兰县| 忻州市| 灌云县| 襄城县| 丹棱县| 西丰县| 兰西县| 新余市| 庄河市| 扎赉特旗| 观塘区| 简阳市| 乐业县| 江山市| 平潭县|