ListCtrlの使い方

21095 ワード

1.CListCtrlスタイル
      LVS_ICON:itemごとに大きな図標LVS_を表示するSMALLICON:itemごとに小さなアイコンLVS_を表示LIST:小さなアイコンが付いたitem LVS_の列を表示REPORT:item詳細を表示
直感的な理解:windowsエクスプローラ、「表示」タブの下の「大きなアイコン、小さなアイコン、リスト、詳細」
2.listcttrlスタイルと拡張スタイルの設定
      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

 

      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); //      

注意:listviewのstyleはmsdnを参照してください
 
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp
3.データの挿入
      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”);//    

4.itemを常に選択
スタイルのShow selection alwaysを選択するか、上の2点目に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.listcttrl内のすべての行のcheckboxの状態を得る
      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     "), i);

                AfxMessageBox(str);

           }

      }


7.listcttrlで選択したすべてのローのシーケンス番号を取得
方法1:
      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);

           }

      }


方法2:
      POSITION pos = m_list.GetFirstSelectedItemPosition();

      if (pos == NULL)

           TRACE0("No items were selected!
"); else { while (pos) { int nItem = m_list.GetNextSelectedItem(pos); TRACE1("Item %d was selected!
", 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);


itemが設定された状態については、msdn文書Q 173242:UseMasks to Set/Get Item States in CListCtrlhttp://support.microsoft.com/kb/173242/en-us
9.listcttrlのすべての列のヘッダー文字列の内容を取得する
      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.listcttrlの1つを表示します.すなわち、スクロールバーm_list.EnsureVisible(i, FALSE);
11.listcttrl列数GetItemCount関数を得る
12.すべての列を削除
方法1:while(m_list.DeleteColumn(0))最初の列を削除すると、後ろの列が順番に上に移動します.
方法2:int nColumns=4;      for (int i=nColumns-1; i>=0; i--)          m_list.DeleteColumn (i);
13.クリックしたlistcttrlの行番号を取得
listcttrlコントロールのNM_を追加CLICKメッセージ対応関数void CTest 6 Dlg::OnClickList 1(NMHDR*pNMHDR,LRESULT*pResult){//方法一:
      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++;

      }


   
//方法2:
           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.listcttrlのcheckboxをクリックするかどうかを判断する
listcttrlコントロールのNM_を追加CLICKメッセージ対応関数
      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.listcttrlのitemポップアップメニューを右クリック
listcttrlコントロールのNM_を追加RCLICKメッセージ対応関数
      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を切り替える場合を含む)、状態のいくつかの変化順序
listcttrlコントロールのLVN_を追加ITEMCHANGEDメッセージ対応関数
    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.別のプロセスのlistcttrlコントロールのitem内容を得る
 
 
http://www.codeproject.com/threads/int64_memsteal.asp
18.listviewのitem Q 131284:How To Selecta 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.listcttrlのsubitem追加アイコン
      m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);      m_list.SetItem(..);//具体的なパラメータはmsdnを参照してください
21.CListCtrlにファイルを表示し、ファイルの種類に応じてアイコンを表示する
ネットで見つけたコード、share
 BOOL CTest6Dlg::OnInitDialog()

      {

           CDialog::OnInitDialog();

   

           HIMAGELIST himlSmall;

           HIMAGELIST himlLarge;

           SHFILEINFO sfi;

           char  cSysDir[MAX_PATH];

           CString  strBuf;

  

           memset(cSysDir, 0, MAX_PATH);

   

           GetWindowsDirectory(cSysDir, MAX_PATH);

           strBuf = cSysDir;

           sprintf(cSysDir, "%s", strBuf.Left(strBuf.Find("\\")+1));

  

           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(m_list.m_hWnd, LVM_SETIMAGELIST,

                             (WPARAM)LVSIL_SMALL, (LPARAM)himlSmall);

                ::SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST,

                             (WPARAM)LVSIL_NORMAL, (LPARAM)himlLarge);

           }

           return TRUE;  // return TRUE  unless you set the focus to a control

      }

  

      void CTest6Dlg::AddFiles(LPCTSTR lpszFileName, BOOL bAddToDocument)

      {

           int nIcon = GetIconIndex(lpszFileName, FALSE, FALSE);

           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 = m_list.GetItemCount();

           m_list.InsertItem(nItem, strFileName, nIcon);

           m_list.SetItemText(nItem, 1, strSize);

           m_list.SetItemText(nItem, 2, strFileName.Right(3));

           m_list.SetItemText(nItem, 3, strPath);

      }

  

      int CTest6Dlg::GetIconIndex(LPCTSTR lpszPath, BOOL bIsDir, BOOL bSelected)

      {

           SHFILEINFO sfi;

           memset(&sfi, 0, sizeof(sfi));

   

           if (bIsDir)

           {

            SHGetFileInfo(lpszPath,  

                         FILE_ATTRIBUTE_DIRECTORY,  

                         &sfi,  

                         sizeof(sfi),  

                         SHGFI_SMALLICON | SHGFI_SYSICONINDEX |

                         SHGFI_USEFILEATTRIBUTES |(bSelected ? SHGFI_OPENICON : 0));  

            return  sfi.iIcon;

           }

           else

           {

            SHGetFileInfo (lpszPath,  

                         FILE_ATTRIBUTE_NORMAL,  

                         &sfi,  

                         sizeof(sfi),  

                         SHGFI_SMALLICON | SHGFI_SYSICONINDEX |  

                         SHGFI_USEFILEATTRIBUTES | (bSelected ? SHGFI_OPENICON : 0));

            return   sfi.iIcon;

           }

           return  -1;

      }


22.listcttrlコンテンツがビッグデータ量更新を行う場合、点滅を避ける
      m_list.SetRedraw(FALSE);

      //    

      m_list.SetRedraw(TRUE);

      m_list.Invalidate();

      m_list.UpdateWindow();


  
または参照
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfc_cwnd.3a3a.setredraw.asp
23.listcttrlソート
Q250614:How To Sort Items in a CListCtrl in Report View http://support.microsoft.com/kb/250614/en-us
24.listcttrlでitemを選択したときにiconまたはbitmap Q 141834:How to change the icon or the bitmap of a CListCtrl item in Visual C++を動的に変更
http://support.microsoft.com/kb/141834/en-us
25.itemを追加した後、InsertColumn()を追加すると、カラム全体が移動する問題
Q151897: CListCtrl::InsertColumn() Causes Column Data to Shift  http://support.microsoft.com/kb/151897/en-us
26.listcttrlの最初の列が常に左にある問題について
解決策:第1列を虚列とし、第2列から列とデータを挿入し、最後に第1列を削除します.具体的な説明はhttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/listview/structures/lvcolumn.asp
27.column headerのドラッグをロックする
http://msdn.microsoft.com/msdnmag/issues/03/06/CQA/
28.clistctrlの列を非表示にする方法
非表示にする列の幅を0にし、その列が非表示になったときに、上の27点目のロックcolumnのドラッグで実現することを検出します.
29.listctcttrlビッグデータ量操作を行う場合はvirtual listを使用する
http://www.codeguru.com/cpp/controls/listview/advanced/article.php/c4151/ http://www.codeproject.com/listctrl/virtuallist.asp
30.itemが259文字しか表示できない問題について
解決策:itemにeditを置く必要があります.
31.listcttrlのcolumn headerのマウスの右クリックに応答する
Q125694: How To Find Out Which Listview Column Was Right-Clicked http://support.microsoft.com/kb/125694/en-us
32.Windowsエクスプローラに似たlistview
Q234310: How to implement a ListView control that is similar to Windows Explorer by using DirLV.exe http://support.microsoft.com/kb/234310/en-us
33.ListCtrlにおいてOnTimerが2回のみ応答する問題
Q200054:PRB: OnTimer() Is Not Called Repeatedly for a List Control http://support.microsoft.com/kb/200054/en-us
34.以下に、様々なカスタム機能を実現するためのlistcttrl派生クラスを示す.
(1)ドラッグ&ドロップhttp://www.codeproject.com/listctrl/dragtest.asp
CListCtrlとCTreeCtrlの間でドラッグ&ドロップhttp://support.microsoft.com/kb/148738/en-us(2)多機能listcttrlはsubitem編集可能、アイコン、radiobutton、checkbox、文字列変更色のクラスhttp://www.codeproject.com/listctrl/quicklist.aspソート対応、subitem編集可能、subitemアイコン、subitem変更色のクラスhttp://www.codeproject.com/listctrl/ReportControl.asp
(3)subitemにハイパーリンク表示http://www.codeproject.com/listctrl/CListCtrlLink.asp
(4)subitemのtooltipヒントhttp://www.codeproject.com/listctrl/ctooltiplistctrl.asp
(5)subitemに進捗バーが表示されるhttp://www.codeproject.com/listctrl/ProgressListControl.asphttp://www.codeproject.com/listctrl/napster.asphttp://www.codeguru.com/Cpp/controls/listview/article.php/c4187/
(6)subitemの色と背景色を動的に変えるhttp://www.codeproject.com/listctrl/highlightlistctrl.asphttp://www.codeguru.com/Cpp/controls/listbox/colorlistboxes/article.php/c4757/(7)クラスvbプロパティダイアログhttp://www.codeproject.com/listctrl/propertylistctrl.asphttp://www.codeguru.com/Cpp/controls/listview/propertylists/article.php/c995/http://www.codeguru.com/Cpp/controls/listview/propertylists/article.php/c1041/(8)subitem(ハイライトされたitemのみ)を選択http://www.codeproject.com/listctrl/SubItemSel.asphttp://www.codeproject.com/listctrl/ListSubItSel.asp(9)行高変更http://www.codeproject.com/listctrl/changerowheight.asp(10)行色変更http://www.codeproject.com/listctrl/coloredlistctrl.asp(11)編集可能subitemのlistcttrlhttp://www.codeproject.com/listctrl/nirs2000.asphttp://www.codeproject.com/listctrl/editing_subitems_in_listcontrol.asp(12)subitem編集可能、combobox挿入、行色変更、subitemのtooltipプロンプトhttp://www.codeproject.com/listctrl/reusablelistcontrol.asp(13)ヘッダで複数行文字列許可http://www.codeproject.com/listctrl/headerctrlex.asp(14)combox挿入http://www.codeguru.com/Cpp/controls/listview/editingitemsandsubitem/article.php/c979/(15)背景画像を追加http://www.codeguru.com/Cpp/controls/listview/backgroundcolorandimage/article.php/c4173/http://www.codeguru.com/Cpp/controls/listview/backgroundcolorandimage/article.php/c983/http://www.vchelp.net/vchelp/archive.asp?type_id=9&class_id=1&cata_id=1&article_id=1088&search_term=(16)適応幅のlistcttrlhttp://www.codeproject.com/useritems/AutosizeListCtrl.asp(17)
ListCtrlハイライトの色を変更します(デフォルトは青)
しょり NM_CUSTOMDRAW