CListCtrlの使い方の概要と使い方(一)
19653 ワード
[プロパティの設定]
まず、ListCtrlコントロールをアセットエディタ(Asset Editor)でドラッグ&ドロップしてダイアログボックスに移動します.属性を設定します.
[初期化]//1.ダイアログボックスのOnInitialDialogでListCtrlを初期化する
//2. 列の挿入
//3. 行を挿入//初期化時に行を挿入したり、動的に行を挿入したりできます
[選択範囲を巡回]
[選択を削除]
CListCtrl使用テクニック
元のアドレス:
http://blog.csdn.net/virtualjxc/archive/2007/09/09/1778041.aspx
CListCtrl使用テクニック
以下に説明するが、listcttrlのデフォルトviewスタイルはreport-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.CListCtrlスタイル
直感的な理解:windowsエクスプローラ、「表示」タブの下の「大きなアイコン、小さなアイコン、リスト、詳細」
--------------------------------------------------------------------------------
2.listcttrlスタイルと拡張スタイルの設定
注意:listviewのstyleはmsdnを参照してくださいhttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp
--------------------------------------------------------------------------------
3.データの挿入
--------------------------------------------------------------------------------
4.itemを常に選択
--------------------------------------------------------------------------------
5.行の選択と選択解除
--------------------------------------------------------------------------------
6.listcttrl内のすべての行のcheckboxの状態を得る
--------------------------------------------------------------------------------
7.listcttrlで選択したすべてのローのシーケンス番号を取得
方法1:
方法2:
--------------------------------------------------------------------------------
8.itemの情報を得る
itemが設定された状態については、msdn文書Q 173242:UseMasks to Set/Get Item States in CListCtrlを参照することもできるhttp://support.microsoft.com/kb/173242/en-us
--------------------------------------------------------------------------------
9.listcttrlのすべての列のヘッダー文字列の内容を取得する
--------------------------------------------------------------------------------
10.listcttrlの1つを表示します.すなわち、スクロールバー
--------------------------------------------------------------------------------
11.listcttrl列数を得る
int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();
--------------------------------------------------------------------------------
12.すべての列を削除
方法1:
方法2:
--------------------------------------------------------------------------------
13.クリックしたlistcttrlの行番号を取得
listcttrlコントロールのNM_を追加CLICKメッセージ対応関数
--------------------------------------------------------------------------------
14.listcttrlのcheckboxをクリックするかどうかを判断する
listcttrlコントロールのNM_を追加CLICKメッセージ対応関数
--------------------------------------------------------------------------------
15.listcttrlのitemポップアップメニューを右クリック
listcttrlコントロールのNM_を追加RCLICKメッセージ対応関数
まず、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;
}