CListCtrlの使い方の概要と使い方(一)

19653 ワード

[プロパティの設定]
まず、ListCtrlコントロールをアセットエディタ(Asset Editor)でドラッグ&ドロップしてダイアログボックスに移動します.属性を設定します.
Always Show Selection: True //  

SingleSelection: True   //  

View: Report            //

[初期化]//1.ダイアログボックスのOnInitialDialogでListCtrlを初期化する
// 1.  

m_ListCtrl.SetExtendedStyle( LVS_EX_FULLROWSELECT );

// LVS_EX_FULLROWSELECT:  , 

// LVS_EX_GRIDLINES:  

// LVS_EX_CHECKBOXES:  

// LVS_EX_FLATSB:  

 
//2. 列の挿入
m_ListCtrl.InsertColumn( 0, _T(" 0"), LVCFMT_LEFT, 100 ); 

m_ListCtrl.InsertColumn( 1, _T(" 1"), LVCFMT_LEFT, 100 );

// LVCFMT_LEFT , LVCFMT_RIGHT,LVCFMT_CENTER

// 100 

//3. 行を挿入//初期化時に行を挿入したり、動的に行を挿入したりできます
m_ListCtrl.InsertItem( 0, _T("0   0  ") );

m_ListCtrl.SetItemText( 0, 1, _T("0   1  ") );

m_ListCtrl.InsertItem( 1, _T("1   0  ") );

m_ListCtrl.SetItemText( 1, 1, _T("1  1  ") );

 
[選択範囲を巡回]
POSITION selectItemPos = m_ListCtrl.GetFirstSelectedItemPosition();

 while ( selectItemPos != NULL ) {

  const int selectItemIndex = m_ListCtrl.GetNextSelectedItem( selectItemPos );  

  CString keyString = m_ListCtrl.GetItemText( selectItemIndex,  0 );

 //  selectItemIndex 0 

 }

 
[選択を削除]
POSITION selectItemPos = m_ListCtrl.GetFirstSelectedItemPosition();

 int offset = 0;

 while ( selectItemPos != NULL ) {

  const int selectItemIndex = m_ListCtrl.GetNextSelectedItem( selectItemPos );

  m_ListCtrl.DeleteItem( selectItemIndex - offset );

  ++offset;

 }

 
CListCtrl使用テクニック
元のアドレス:
http://blog.csdn.net/virtualjxc/archive/2007/09/09/1778041.aspx                               
CListCtrl使用テクニック
以下に説明するが、listcttrlのデフォルトviewスタイルはreport-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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を常に選択
   style 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 CListCtrlを参照することもできるhttp://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列数を得る
    int nHeadNum = m_list.GetHeaderCtrl()->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 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.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;

  }