CListBox
クラス
Windows のリスト ボックスの機能を提供します。
構文
class CListBox : public CWnd
メンバー
パブリック コンストラクター
名前 | 説明 |
---|---|
CListBox::CListBox |
CListBox オブジェクトを構築します。 |
パブリック メソッド
名前 | 説明 |
---|---|
CListBox::AddString |
リスト ボックスに文字列を追加します。 |
CListBox::CharToItem |
文字列を持たない所有者描画リスト ボックスのカスタム WM_CHAR 処理を提供するためにオーバーライドします。 |
CListBox::CompareItem |
並べ替えられた所有者描画リスト ボックス内の新しい項目の位置を決定するために、フレームワークによって呼び出されます。 |
CListBox::Create |
Windows リスト ボックスを作成し、 CListBox オブジェクトにアタッチします。 |
CListBox::DeleteItem |
ユーザーが所有者描画リスト ボックスから項目を削除すると、フレームワークによって呼び出されます。 |
CListBox::DeleteString |
リスト ボックスから文字列を削除します。 |
CListBox::Dir |
現在のディレクトリからリスト ボックスにファイル名、ドライブ、またはその両方を追加します。 |
CListBox::DrawItem |
所有者描画リスト ボックスの視覚的な側面が変更されたときにフレームワークによって呼び出されます。 |
CListBox::FindString |
リスト ボックス内の文字列を検索します。 |
CListBox::FindStringExact |
指定した文字列と一致する最初のリスト ボックス文字列を検索します。 |
CListBox::GetAnchorIndex |
リスト ボックス内の現在のアンカー項目の 0 から始まるインデックスを取得します。 |
CListBox::GetCaretIndex |
複数選択リスト ボックスにフォーカスがある四角形を持つ項目のインデックスを決定します。 |
CListBox::GetCount |
リスト ボックス内の文字列の数を返します。 |
CListBox::GetCurSel |
リスト ボックスで現在選択されている文字列の 0 から始まるインデックスを返します。 |
CListBox::GetHorizontalExtent |
リスト ボックスを水平方向にスクロールできる幅をピクセル単位で返します。 |
CListBox::GetItemData |
リスト ボックス項目に関連付けられている値を返します。 |
CListBox::GetItemDataPtr |
リスト ボックス項目へのポインターを返します。 |
CListBox::GetItemHeight |
リスト ボックス内の項目の高さを指定します。 |
CListBox::GetItemRect |
現在表示されているリスト ボックス項目の外接する四角形を返します。 |
CListBox::GetListBoxInfo |
列あたりの項目数を取得します。 |
CListBox::GetLocale |
リスト ボックスのロケール識別子を取得します。 |
CListBox::GetSel |
リスト ボックス項目の選択状態を返します。 |
CListBox::GetSelCount |
複数選択リスト ボックスで現在選択されている文字列の数を返します。 |
CListBox::GetSelItems |
リスト ボックスで現在選択されている文字列のインデックスを返します。 |
CListBox::GetText |
リスト ボックス項目をバッファーにコピーします。 |
CListBox::GetTextLen |
リスト ボックス項目の長さをバイト単位で返します。 |
CListBox::GetTopIndex |
リスト ボックス内の最初に表示される文字列のインデックスを返します。 |
CListBox::InitStorage |
リスト ボックスの項目と文字列のメモリ ブロックを事前割り当てします。 |
CListBox::InsertString |
リスト ボックス内の特定の場所に文字列を挿入します。 |
CListBox::ItemFromPoint |
ポイントに最も近いリスト ボックス項目のインデックスを返します。 |
CListBox::MeasureItem |
リスト ボックスディメンションを決定するために所有者描画リスト ボックスが作成されるときにフレームワークによって呼び出されます。 |
CListBox::ResetContent |
リスト ボックスからすべてのエントリをクリアします。 |
CListBox::SelectString |
単一選択リスト ボックスで文字列を検索して選択します。 |
CListBox::SelItemRange |
複数選択リスト ボックス内の文字列の範囲を選択または選択解除します。 |
CListBox::SetAnchorIndex |
複数選択リスト ボックスのアンカーを設定して、拡張選択を開始します。 |
CListBox::SetCaretIndex |
複数選択リスト ボックスの指定したインデックスにあるアイテムにフォーカス矩形を設定します。 |
CListBox::SetColumnWidth |
複数列のリスト ボックスの列幅を設定します。 |
CListBox::SetCurSel |
リスト ボックス文字列を選択します。 |
CListBox::SetHorizontalExtent |
リスト ボックスを水平方向にスクロールできる幅をピクセル単位で設定します。 |
CListBox::SetItemData |
リスト ボックス項目に関連付けられている値を設定します。 |
CListBox::SetItemDataPtr |
リスト ボックス項目へのポインターを設定します。 |
CListBox::SetItemHeight |
リスト ボックス内の項目の高さを設定します。 |
CListBox::SetLocale |
リスト ボックスのロケール識別子を設定します。 |
CListBox::SetSel |
複数選択リスト ボックスのリスト ボックス項目を選択または選択解除します。 |
CListBox::SetTabStops |
リスト ボックス内のタブ停止位置を設定します。 |
CListBox::SetTopIndex |
リスト ボックス内の最初に表示される文字列の 0 から始まるインデックスを設定します。 |
CListBox::VKeyToItem |
LBS_WANTKEYBOARDINPUT スタイル セットを持つリスト ボックスのカスタム WM_KEYDOWN 処理を提供するには、オーバーライドします。 |
解説
リスト ボックスには、ユーザーが表示および選択できる項目の一覧 (ファイル名など) が表示されます。
単一選択リスト ボックスでは、ユーザーは 1 つの項目のみを選択できます。 複数選択リスト ボックスでは、項目の範囲を選択できます。 ユーザーが項目を選択すると、その項目が強調表示され、リスト ボックスから親ウィンドウに通知メッセージが送信されます。
リスト ボックスは、ダイアログ テンプレートから作成することも、コード内で直接作成することもできます。 直接作成するには、 CListBox
オブジェクトを構築し、 Create
メンバー関数を呼び出して Windows リスト ボックス コントロールを作成し、 CListBox
オブジェクトにアタッチします。 ダイアログ テンプレートでリスト ボックスを使用するには、ダイアログ ボックス クラスでリスト ボックス変数を宣言し、ダイアログ ボックス クラスの DoDataExchange
関数でDDX_Control
を使用してメンバー変数をコントロールに接続します。 (これは、ダイアログ ボックス クラスにコントロール変数を追加するときに自動的に行われます)。
構築は、 CListBox
から派生したクラス内の 1 ステップ プロセスにすることができます。 派生クラスのコンストラクターを記述し、コンストラクター内から Create
を呼び出します。
リスト ボックスによって親 (通常は CDialog
から派生したクラス) に送信された Windows 通知メッセージを処理する場合は、メッセージ マップ エントリとメッセージ ハンドラー メンバー関数を各メッセージの親クラスに追加します。
各メッセージ マップ エントリの形式は次のとおりです。
ON_Notification( id, memberFxn )
ここで id
通知を送信するリスト ボックス コントロールの子ウィンドウ ID を指定し、 memberFxn
は通知を処理するために作成した親メンバー関数の名前です。
親の関数プロトタイプは次のとおりです。
afx_msg void memberFxn( );
潜在的なメッセージ マップ エントリの一覧と、親に送信されるケースの説明を次に示します。
ON_LBN_DBLCLK
ユーザーがリスト ボックス内の文字列をダブルクリックします。 この通知メッセージは、LBS_NOTIFY
スタイルのリスト ボックスのみが送信されます。ON_LBN_ERRSPACE
リスト ボックスは、要求を満たすのに十分なメモリを割り当てることができません。ON_LBN_KILLFOCUS
リスト ボックスが入力フォーカスを失います。ON_LBN_SELCANCEL
現在のリスト ボックスの選択は取り消されます。 このメッセージは、リスト ボックスにLBS_NOTIFY
スタイルがある場合にのみ送信されます。ON_LBN_SELCHANGE
リスト ボックスの選択内容が変更されました。 この通知は、選択がCListBox::SetCurSel
メンバー関数によって変更された場合には送信されません。 この通知は、LBS_NOTIFY
スタイルを持つリスト ボックスにのみ適用されます。LBN_SELCHANGE
通知メッセージは、選択内容が変更されない場合でも、ユーザーが方向キーを押すたびに、複数選択リスト ボックスに対して送信されます。ON_LBN_SETFOCUS
リスト ボックスが入力フォーカスを受け取ります。ON_WM_CHARTOITEM
文字列を含まない所有者描画リスト ボックスは、WM_CHAR
メッセージを受信します。ON_WM_VKEYTOITEM
LBS_WANTKEYBOARDINPUT
スタイルのリスト ボックスは、WM_KEYDOWN
メッセージを受け取ります。
ダイアログ ボックス内に (ダイアログ リソースを使用して) CListBox
オブジェクトを作成すると、ユーザーがダイアログ ボックスを閉じると、 CListBox
オブジェクトが自動的に破棄されます。
ウィンドウ内に CListBox
オブジェクトを作成する場合は、 CListBox
オブジェクトを破棄する必要があります。 スタック上に CListBox
オブジェクトを作成すると、自動的に破棄されます。 new
関数を使用してヒープ上にCListBox
オブジェクトを作成する場合は、ユーザーが親ウィンドウを閉じたときにオブジェクトに対してdelete
を呼び出して破棄する必要があります。
CListBox
オブジェクトにメモリを割り当てる場合は、CListBox
デストラクターをオーバーライドして割り当てを破棄します。
継承階層
CListBox
要件
ヘッダー: afxwin.h
CListBox::AddString
リスト ボックスに文字列を追加します。
int AddString(LPCTSTR lpszItem);
パラメーター
lpszItem
追加する null で終わる文字列を指します。
戻り値
リスト ボックス内の文字列に対する 0 から始まるインデックス。 エラーが発生した場合、戻り値は LB_ERR
されます。新しい文字列を格納できる領域が不足している場合、戻り値は LB_ERRSPACE
されます。
解説
リスト ボックスが LBS_SORT
スタイルで作成されていない場合は、文字列がリストの末尾に追加されます。 そうでない場合は、文字列がリストに挿入されてから、リストが並べ替えられます。 リスト ボックスが LBS_SORT
スタイルで作成されたが、 LBS_HASSTRINGS
スタイルではない場合、フレームワークはリストを CompareItem
メンバー関数の 1 つ以上の呼び出しで並べ替えます。
リスト ボックス内の特定の場所に文字列を挿入するには、 InsertString
を使用します。
例
// Add 10 items to the list box.
CString str;
for (int i = 0; i < 10; i++)
{
str.Format(_T("item string %d"), i);
m_myListBox.AddString(str);
}
CListBox::CharToItem
リスト ボックスの親ウィンドウがリスト ボックスから WM_CHARTOITEM
メッセージを受信すると、フレームワークによって呼び出されます。
virtual int CharToItem(
UINT nKey,
UINT nIndex);
パラメーター
nKey
ユーザーが入力した文字の ANSI コード。
nIndex
リスト ボックス キャレットの現在位置。
戻り値
それ以上操作しない場合は 1 または - 2 を返し、キーストロークの既定のアクションを実行するリスト ボックス項目のインデックスを指定する負でない数値を返します。 既定の実装では、- 1 が返されます。
解説
WM_CHARTOITEM
メッセージは、WM_CHAR
メッセージを受信したときにリスト ボックスによって送信されますが、リスト ボックスが次のすべての条件を満たしている場合にのみ送信されます。
所有者描画リスト ボックスです。
LBS_HASSTRINGS
スタイルが設定されていません。少なくとも 1 つの項目があります。
この関数を自分で呼び出すべきではありません。 キーボード メッセージの独自のカスタム処理を提供するには、この関数をオーバーライドします。
オーバーライドでは、実行したアクションをフレームワークに伝える値を返す必要があります。 戻り値 - 1 または - 2 は、項目の選択のすべての側面を処理したことを示し、リスト ボックスによるそれ以上のアクションは必要ありません。 1 または - 2 を返す前に、選択を設定するか、キャレットまたはその両方を移動できます。 選択を設定するには、 SetCurSel
または SetSel
を使用します。 キャレットを移動するには、 SetCaretIndex
を使用します。
戻り値が 0 以上の場合は、リスト ボックス内の項目のインデックスを指定し、リスト ボックスが指定された項目に対してキーストロークの既定のアクションを実行する必要があることを示します。
例
// CMyODListBox is my owner-drawn list box derived from CListBox. This
// example moves the caret down one item on a numeric key and up one item
// on an alphabetic key. The list box control was created with the
// following code:
// m_myODListBox.Create(
// WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|
// LBS_SORT|LBS_MULTIPLESEL|LBS_OWNERDRAWVARIABLE|LBS_WANTKEYBOARDINPUT,
// CRect(10,250,200,450), pParentWnd, IDC_MYODLISTBOX);
//
int CMyODListBox::CharToItem(UINT nChar, UINT nIndex)
{
// On a numeric key, move the caret up one item.
if (isdigit(nChar) && (nIndex > 0))
{
SetCaretIndex(nIndex - 1);
}
// On an alphabetic key, move the caret down one item.
else if (isalpha(nChar) && (nIndex < (UINT)GetCount()))
{
SetCaretIndex(nIndex + 1);
}
// Do not perform any default processing.
return -1;
}
CListBox::CListBox
CListBox
オブジェクトを構築します。
CListBox();
解説
CListBox
オブジェクトは、2 つの手順で作成します。 まず、コンストラクター ClistBox
を呼び出し、 Create
を呼び出します。これにより、Windows リスト ボックスが初期化され、 CListBox
にアタッチされます。
例
// Declare a local CListBox object.
CListBox myListBox;
// Declare a dynamic CListBox object.
CListBox *pmyListBox = new CListBox;
CListBox::CompareItem
並べ替えられた所有者描画リスト ボックス内の新しい項目の相対位置を決定するために、フレームワークによって呼び出されます。
virtual int CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct);
パラメーター
lpCompareItemStruct
COMPAREITEMSTRUCT
構造体への長いポインター。
戻り値
COMPAREITEMSTRUCT
構造体で説明されている 2 つの項目の相対位置を示します。 次のいずれかの値を指定できます。
値 | 意味 |
---|---|
-1 | 項目 1 は項目 2 より前に並べ替えられます。 |
0 | 項目 1 と項目 2 は同じように並べ替えられます。 |
1 | 項目 1 は項目 2 の後に並べ替えられます。 |
COMPAREITEMSTRUCT
構造の説明については、CWnd::OnCompareItem
を参照してください。
解説
既定では、このメンバー関数は何も行いません。 LBS_SORT
スタイルの所有者描画リスト ボックスを作成する場合は、このメンバー関数をオーバーライドして、リスト ボックスに追加された新しい項目をフレームワークが並べ替えるのを支援する必要があります。
例
// CMyODListBox is my owner-drawn list box derived from CListBox. This
// example compares two items using _tcscmp to sort items in reverse
// alphabetical order. The list box control was created with the
// following code:
// m_myODListBox.Create(
// WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|
// LBS_SORT|LBS_MULTIPLESEL|LBS_OWNERDRAWVARIABLE|LBS_WANTKEYBOARDINPUT,
// CRect(10,250,200,450), pParentWnd, IDC_MYODLISTBOX);
//
int CMyODListBox::CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct)
{
ASSERT(lpCompareItemStruct->CtlType == ODT_LISTBOX);
LPCTSTR lpszText1 = (LPCTSTR)lpCompareItemStruct->itemData1;
ASSERT(lpszText1 != NULL);
LPCTSTR lpszText2 = (LPCTSTR)lpCompareItemStruct->itemData2;
ASSERT(lpszText2 != NULL);
return _tcscmp(lpszText2, lpszText1);
}
CListBox::Create
Windows リスト ボックスを作成し、 CListBox
オブジェクトにアタッチします。
virtual BOOL Create(
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID);
パラメーター
dwStyle
リスト ボックスのスタイルを指定します。 リスト ボックス スタイルの任意の組み合わせをボックスに適用。
rect
リスト ボックスのサイズと位置を指定します。 CRect
オブジェクトまたはRECT
構造体を指定できます。
pParentWnd
リスト ボックスの親ウィンドウ (通常は CDialog
オブジェクト) を指定します。 NULL
することはできません。
nID
リスト ボックスのコントロール ID を指定します。
戻り値
正常終了した場合は 0 以外を返します。それ以外の場合は 0 を返します。
解説
CListBox
オブジェクトは、2 つの手順で作成します。 まず、コンストラクターを呼び出してから Create
を呼び出します。これにより、Windows リスト ボックスが初期化され、 CListBox
オブジェクトにアタッチされます。
Create
実行すると、Windows はWM_NCCREATE
、WM_CREATE
、WM_NCCALCSIZE
、およびWM_GETMINMAXINFO
メッセージをリスト ボックス コントロールに送信します。
これらのメッセージは、既定では、CWnd
基底クラスのOnNcCreate
、OnCreate
、OnNcCalcSize
、およびOnGetMinMaxInfo
メンバー関数によって処理されます。 既定のメッセージ処理を拡張するには、 CListBox
からクラスを派生させ、新しいクラスにメッセージ マップを追加し、前のメッセージ ハンドラー メンバー関数をオーバーライドします。 たとえば、新しいクラスに必要な初期化を実行するには、 OnCreate
をオーバーライドします。
次の ウィンドウ スタイル リスト ボックス コントロールに適用します。
WS_CHILD
いつもWS_VISIBLE
通常はWS_DISABLED
稀にWS_VSCROLL
垂直スクロール バーを追加するにはWS_HSCROLL
水平スクロール バーを追加するにはWS_GROUP
コントロールをグループ化するにはWS_TABSTOP
このコントロールへのタブ移動を許可するには
例
// pParentWnd is a pointer to the parent window.
m_myListBox.Create(WS_CHILD | WS_VISIBLE | LBS_STANDARD | WS_HSCROLL,
CRect(10, 10, 200, 200), pParentWnd, IDC_MYLISTBOX);
CListBox::DeleteItem
ユーザーが所有者描画 CListBox
オブジェクトから項目を削除するか、リスト ボックスを破棄するときに、フレームワークによって呼び出されます。
virtual void DeleteItem(LPDELETEITEMSTRUCT lpDeleteItemStruct);
パラメーター
lpDeleteItemStruct
削除されたアイテムに関する情報を含む Windows DELETEITEMSTRUCT
構造体への長いポインター。
解説
この関数の既定の実装は、何も行いません。 必要に応じて所有者描画リスト ボックスを再描画するには、この関数をオーバーライドします。
DELETEITEMSTRUCT
構造の説明については、CWnd::OnDeleteItem
を参照してください。
例
// CMyODListBox is my owner-drawn list box derived from CListBox. This
// example simply frees the item's text. The list box control was created
// with the following code:
// m_myODListBox.Create(
// WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|
// LBS_SORT|LBS_MULTIPLESEL|LBS_OWNERDRAWVARIABLE|LBS_WANTKEYBOARDINPUT,
// CRect(10,250,200,450), pParentWnd, IDC_MYODLISTBOX);
//
void CMyODListBox::DeleteItem(LPDELETEITEMSTRUCT lpDeleteItemStruct)
{
ASSERT(lpDeleteItemStruct->CtlType == ODT_LISTBOX);
LPVOID lpszText = (LPVOID)lpDeleteItemStruct->itemData;
ASSERT(lpszText != NULL);
free(lpszText);
CListBox::DeleteItem(lpDeleteItemStruct);
}
CListBox::DeleteString
リスト ボックスから nIndex
位置にある項目を削除します。
int DeleteString(UINT nIndex);
パラメーター
nIndex
削除する文字列の 0 から始まるインデックスを指定します。
戻り値
リストに残っている文字列の数。 nIndex
がリスト内の項目数より大きいインデックスを指定した場合、戻り値はLB_ERR
されます。
解説
nIndex
に続くすべての項目が 1 つ下の位置に移動するようになりました。 たとえば、リスト ボックスに 2 つの項目が含まれている場合、最初の項目を削除すると、残りの項目が最初の位置になります。 nIndex
最初の位置にある項目の場合は =0。
例
// Delete every other item from the list box.
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
m_myListBox.DeleteString(i);
}
CListBox::Dir
ファイル名、ドライブ、またはその両方のリストをリスト ボックスに追加します。
int Dir(
UINT attr,
LPCTSTR lpszWildCard);
パラメーター
attr
CFile::GetStatus
で説明されているenum
値の任意の組み合わせ、または次の値の任意の組み合わせを指定できます。
値 | 意味 |
---|---|
0x0000 | ファイルの読み取りまたは書き込みが可能です。 |
0x0001 | ファイルは読み取り可能ですが、書き込むには使用できません。 |
0x0002 | ファイルは非表示であり、ディレクトリ一覧には表示されません。 |
0x0004 | ファイルはシステム ファイルです。 |
0x0010 | lpszWildCard によって指定された名前は、ディレクトリを指定します。 |
0x0020 | ファイルがアーカイブされました。 |
0x4000 | lpszWildCard で指定された名前と一致するすべてのドライブを含めます。 |
0x8000 | 排他フラグ。 排他フラグが設定されている場合は、指定した種類のファイルのみが一覧表示されます。 それ以外の場合は、指定した種類のファイルが、"標準" ファイルに加えて一覧表示されます。 |
lpszWildCard
ファイル指定文字列を指します。 文字列にはワイルドカード (例: *.*) を含めることができます。
戻り値
リストに追加された最後のファイル名の 0 から始まるインデックス。 エラーが発生した場合、戻り値は LB_ERR
されます。新しい文字列を格納できる領域が不足している場合、戻り値は LB_ERRSPACE
。
例
// Add all the files and directories in the windows directory.
TCHAR lpszWinPath[MAX_PATH], lpszOldPath[MAX_PATH];
::GetWindowsDirectory(lpszWinPath, MAX_PATH);
::GetCurrentDirectory(MAX_PATH, lpszOldPath);
::SetCurrentDirectory(lpszWinPath);
m_myListBox.ResetContent();
m_myListBox.Dir(DDL_READWRITE | DDL_DIRECTORY, _T("*.*"));
::SetCurrentDirectory(lpszOldPath);
CListBox::DrawItem
所有者描画リスト ボックスの視覚的な側面が変更されたときにフレームワークによって呼び出されます。
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
パラメーター
lpDrawItemStruct
必要な描画の種類に関する情報を含む DRAWITEMSTRUCT
構造体への長いポインター。
解説
DRAWITEMSTRUCT
構造体のitemAction
メンバーとitemState
メンバーは、実行する描画アクションを定義します。
既定では、このメンバー関数は何も行いません。 このメンバー関数をオーバーライドして、所有者描画 CListBox
オブジェクトの描画を実装します。 アプリケーションは、このメンバー関数が終了する前に、 lpDrawItemStruct
で指定された表示コンテキストに対して選択されているすべてのグラフィックス デバイス インターフェイス (GDI) オブジェクトを復元する必要があります。
DRAWITEMSTRUCT
構造の説明については、CWnd::OnDrawItem
を参照してください。
例
// CMyODListBox is my owner-drawn list box derived from CListBox. This
// example draws an item's text centered vertically and horizontally. The
// list box control was created with the following code:
// m_myODListBox.Create(
// WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|
// LBS_SORT|LBS_MULTIPLESEL|LBS_OWNERDRAWVARIABLE|LBS_WANTKEYBOARDINPUT,
// CRect(10,250,200,450), pParentWnd, IDC_MYODLISTBOX);
//
void CMyODListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
ASSERT(lpDrawItemStruct->CtlType == ODT_LISTBOX);
LPCTSTR lpszText = (LPCTSTR)lpDrawItemStruct->itemData;
ASSERT(lpszText != NULL);
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
// Save these value to restore them when done drawing.
COLORREF crOldTextColor = dc.GetTextColor();
COLORREF crOldBkColor = dc.GetBkColor();
// If this item is selected, set the background color
// and the text color to appropriate values. Also, erase
// rect by filling it with the background color.
if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&
(lpDrawItemStruct->itemState & ODS_SELECTED))
{
dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
dc.FillSolidRect(&lpDrawItemStruct->rcItem,
::GetSysColor(COLOR_HIGHLIGHT));
}
else
{
dc.FillSolidRect(&lpDrawItemStruct->rcItem, crOldBkColor);
}
// If this item has the focus, draw a red frame around the
// item's rect.
if ((lpDrawItemStruct->itemAction | ODA_FOCUS) &&
(lpDrawItemStruct->itemState & ODS_FOCUS))
{
CBrush br(RGB(255, 0, 0));
dc.FrameRect(&lpDrawItemStruct->rcItem, &br);
}
// Draw the text.
dc.DrawText(
lpszText,
(int)_tcslen(lpszText),
&lpDrawItemStruct->rcItem,
DT_CENTER | DT_SINGLELINE | DT_VCENTER);
// Reset the background color and the text color back to their
// original values.
dc.SetTextColor(crOldTextColor);
dc.SetBkColor(crOldBkColor);
dc.Detach();
}
CListBox::FindString
リスト ボックスの選択を変更せずに、指定したプレフィックスを含むリスト ボックス内の最初の文字列を検索します。
int FindString(
int nStartAfter,
LPCTSTR lpszItem) const;
パラメーター
nStartAfter
検索する最初の項目の前にある項目の 0 から始まるインデックスを格納します。 検索がリスト ボックスの一番下に達すると、リスト ボックスの上部から、 nStartAfter
で指定されたアイテムに戻ります。 nStartAfter
が -1 の場合、リスト ボックス全体が最初から検索されます。
lpszItem
検索するプレフィックスを含む null で終わる文字列を指します。 検索では大文字と小文字が区別されないため、この文字列には大文字と小文字の任意の組み合わせが含まれる場合があります。
戻り値
一致する項目の 0 から始まるインデックス。検索が失敗した場合は LB_ERR
。
解説
文字列を検索して選択するには、 SelectString
メンバー関数を使用します。
例
// The string to match.
LPCTSTR lpszmyString = _T("item");
// Delete all items that begin with the specified string.
int nIndex = 0;
while ((nIndex = m_myListBox.FindString(nIndex, lpszmyString)) != LB_ERR)
{
m_myListBox.DeleteString(nIndex);
}
CListBox::FindStringExact
lpszFind
で指定された文字列と一致する最初のリスト ボックス文字列を検索します。
int FindStringExact(
int nIndexStart,
LPCTSTR lpszFind) const;
パラメーター
nIndexStart
検索する最初の項目の前にある項目の 0 から始まるインデックスを指定します。 検索がリスト ボックスの一番下に達すると、リスト ボックスの上部から、 nIndexStart
で指定されたアイテムに戻ります。 nIndexStart
が -1 の場合、リスト ボックス全体が最初から検索されます。
lpszFind
検索する null で終わる文字列を指します。 この文字列には、拡張子を含む完全なファイル名を含めることができます。 検索では大文字と小文字が区別されないため、文字列には大文字と小文字の任意の組み合わせを含めることができます。
戻り値
一致する項目のインデックス。検索が失敗した場合は LB_ERR
。
解説
リスト ボックスが所有者描画スタイルで作成されたが、 LBS_HASSTRINGS
スタイルがない場合、 FindStringExact
メンバー関数は doubleword 値を lpszFind
の値と照合しようとします。
例
// The string to match.
LPCTSTR lpszmyString = _T("item string 3");
// Delete all items that exactly match the specified string.
int nIndex = 0;
while ((nIndex = m_myListBox.FindStringExact(nIndex, lpszmyString)) != LB_ERR)
{
m_myListBox.DeleteString(nIndex);
}
CListBox::GetAnchorIndex
リスト ボックス内の現在のアンカー項目の 0 から始まるインデックスを取得します。
int GetAnchorIndex() const;
戻り値
成功した場合の現在のアンカー項目のインデックス。それ以外の場合はLB_ERR。
解説
複数選択リスト ボックスでは、アンカー項目は、連続して選択された項目のブロック内の最初または最後の項目です。
例
CListBox::SetAnchorIndex
の例を参照してください。
CListBox::GetCaretIndex
複数選択リスト ボックスにフォーカスがある四角形を持つ項目のインデックスを決定します。
int GetCaretIndex() const;
戻り値
リスト ボックスにフォーカスの四角形がある項目の 0 から始まるインデックス。 リスト ボックスが単一選択リスト ボックスの場合、戻り値は選択されている項目のインデックス (存在する場合) になります。
解説
アイテムが選択されている場合と選択されていない場合があります。
例
CListBox::SetCaretIndex
の例を参照してください。
CListBox::GetCount
リスト ボックス内の項目の数を取得します。
int GetCount() const;
戻り値
リスト ボックス内の項目の数。エラーが発生した場合に LB_ERR
。
解説
返されるカウントは、最後の項目のインデックス値より 1 大きい値です (インデックスは 0 から始まります)。
例
// Add 10 items to the list box.
CString str;
for (int i = 0; i < 10; i++)
{
str.Format(_T("item %d"), i);
m_myListBox.AddString(str);
}
// Verify that 10 items were added to the list box.
ASSERT(m_myListBox.GetCount() == 10);
CListBox::GetCurSel
現在選択されている項目 (存在する場合) の 0 から始まるインデックスを単一選択リスト ボックスで取得します。
int GetCurSel() const;
戻り値
現在選択されている項目が 1 つの選択リスト ボックスの場合は、0 から始まるインデックス。 現在選択されている項目がない場合は LB_ERR
。
複数選択リスト ボックスで、フォーカスがある項目のインデックス。
解説
複数選択リスト ボックスの GetCurSel
を呼び出さないでください。 代わりに CListBox::GetSelItems
を使用してください
例
// Select the next item of the currently selected one.
int nIndex = m_myListBox.GetCurSel();
int nCount = m_myListBox.GetCount();
if ((nIndex != LB_ERR) && (nCount > 1))
{
if (++nIndex < nCount)
m_myListBox.SetCurSel(nIndex);
else
m_myListBox.SetCurSel(0);
}
CListBox::GetHorizontalExtent
リスト ボックスから、水平方向にスクロールできる幅をピクセル単位で取得します。
int GetHorizontalExtent() const;
戻り値
リスト ボックスのスクロール可能な幅 (ピクセル単位)。
解説
これは、リスト ボックスに水平スクロール バーがある場合にのみ該当します。
例
// Find the longest string in the list box.
CString str;
CSize sz;
int dx = 0;
CDC *pDC = m_myListBox.GetDC();
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
m_myListBox.GetText(i, str);
sz = pDC->GetTextExtent(str);
if (sz.cx > dx)
dx = sz.cx;
}
m_myListBox.ReleaseDC(pDC);
// Set the horizontal extent only if the current extent is not large enough.
if (m_myListBox.GetHorizontalExtent() < dx)
{
m_myListBox.SetHorizontalExtent(dx);
ASSERT(m_myListBox.GetHorizontalExtent() == dx);
}
CListBox::GetItemData
指定したリスト ボックス項目に関連付けられているアプリケーション指定の doubleword 値を取得します。
DWORD_PTR GetItemData(int nIndex) const;
パラメーター
nIndex
リスト ボックス内の項目の 0 から始まるインデックスを指定します。
戻り値
項目に関連付けられている値。エラーが発生した場合は LB_ERR
。
解説
doubleword 値は、SetItemData
呼び出しのdwItemData
パラメーターでした。
例
// If any item's data is equal to zero then reset it to -1.
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
if (m_myListBox.GetItemData(i) == 0)
{
m_myListBox.SetItemData(i, (DWORD)-1);
}
}
CListBox::GetItemDataPtr
指定したリスト ボックス項目に関連付けられているアプリケーション指定の 32 ビット値をポインター (void
*) として取得します。
void* GetItemDataPtr(int nIndex) const;
パラメーター
nIndex
リスト ボックス内の項目の 0 から始まるインデックスを指定します。
戻り値
ポインターを取得します。エラーが発生した場合は -1 を取得します。
例
LPVOID lpmyPtr = pParentWnd;
// Check all the items in the list box; if an item's
// data pointer is equal to my pointer then reset it to NULL.
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
if (m_myListBox.GetItemDataPtr(i) == lpmyPtr)
{
m_myListBox.SetItemDataPtr(i, NULL);
}
}
CListBox::GetItemHeight
リスト ボックス内の項目の高さを指定します。
int GetItemHeight(int nIndex) const;
パラメーター
nIndex
リスト ボックス内の項目の 0 から始まるインデックスを指定します。 このパラメーターは、リスト ボックスに LBS_OWNERDRAWVARIABLE
スタイルがある場合にのみ使用されます。それ以外の場合は 0 に設定する必要があります。
戻り値
リスト ボックス内の項目の高さ (ピクセル単位)。 リスト ボックスに LBS_OWNERDRAWVARIABLE
スタイルがある場合、戻り値は nIndex
で指定された項目の高さになります。 エラーが発生した場合、戻り値は LB_ERR
。
例
// Set the height of every item so the item
// is completely visible.
CString str;
CSize sz;
CDC *pDC = m_myListBox.GetDC();
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
m_myListBox.GetText(i, str);
sz = pDC->GetTextExtent(str);
// Only want to set the item height if the current height
// is not big enough.
if (m_myListBox.GetItemHeight(i) < sz.cy)
m_myListBox.SetItemHeight(i, sz.cy);
}
m_myListBox.ReleaseDC(pDC);
CListBox::GetItemRect
リスト ボックス ウィンドウに現在表示されているリスト ボックス 項目を囲む四角形の寸法を取得します。
int GetItemRect(
int nIndex,
LPRECT lpRect) const;
パラメーター
nIndex
項目の 0 から始まるインデックスを指定します。
lpRect
アイテムのリスト ボックス クライアント座標を受け取る RECT
構造体 への長いポインターを指定します。
戻り値
LB_ERR
エラーが発生した場合は 。
例
// Dump all of the items bounds.
CString str;
RECT r;
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
m_myListBox.GetItemRect(i, &r);
str.Format(_T("item %d: left = %d, top = %d, right = %d, ")
_T("bottom = %d\r\n"),
i,
r.left,
r.top,
r.right,
r.bottom);
AFXDUMP(str);
}
CListBox::GetListBoxInfo
列あたりの項目数を取得します。
DWORD GetListBoxInfo() const;
戻り値
CListBox
オブジェクトの列あたりの項目数。
解説
このメンバー関数は、Windows SDK で説明されているように、 LB_GETLISTBOXINFO
メッセージの機能をエミュレートします。
CListBox::GetLocale
リスト ボックスで使用されるロケールを取得します。
LCID GetLocale() const;
戻り値
リスト ボックス内の文字列のロケール識別子 (LCID) 値。
解説
たとえば、ロケールは、並べ替えられたリスト ボックス内の文字列の並べ替え順序を決定するために使用されます。
例
CListBox::SetLocale
の例を参照してください。
CListBox::GetSel
項目の選択状態を取得します。
int GetSel(int nIndex) const;
パラメーター
nIndex
項目の 0 から始まるインデックスを指定します。
戻り値
指定した項目が選択されている場合は正の数値。それ以外の場合は 0 です。 エラーが発生した場合、戻り値は LB_ERR
。
解説
このメンバー関数は、単一選択リスト ボックスと複数選択リスト ボックスの両方で動作します。
現在選択されているリスト ボックス項目のインデックスを取得するには、 CListBox::GetCurSel
を使用します。
例
// Dump all of the items select state.
CString str;
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
str.Format(_T("item %d: select state is %s\r\n"),
i,
m_myListBox.GetSel(i) > 0 ? _T("true") : _T("false"));
AFXDUMP(str);
}
CListBox::GetSelCount
複数選択リスト ボックス内の選択した項目の合計数を取得します。
int GetSelCount() const;
戻り値
リスト ボックス内の選択した項目の数。 リスト ボックスが単一選択リスト ボックスの場合、戻り値は LB_ERR
。
例
CListBox::GetSelItems
の例を参照してください。
CListBox::GetSelItems
複数選択リスト ボックスで選択した項目の項目番号を指定する整数の配列をバッファーに格納します。
int GetSelItems(
int nMaxItems,
LPINT rgIndex) const;
パラメーター
nMaxItems
バッファーに配置する項目番号を持つ、選択した項目の最大数を指定します。
rgIndex
nMaxItems
で指定された整数の数に対して十分な大きさのバッファーへのポインターを指定します。
戻り値
バッファーに配置された項目の実際の数。 リスト ボックスが単一選択リスト ボックスの場合、戻り値は LB_ERR
。
例
// Get the indexes of all the selected items.
int nCount = m_myODListBox.GetSelCount();
CArray<int, int> aryListBoxSel;
aryListBoxSel.SetSize(nCount);
m_myODListBox.GetSelItems(nCount, aryListBoxSel.GetData());
// Dump the selection array.
AFXDUMP(aryListBoxSel);
CListBox::GetText
リスト ボックスから文字列を取得します。
int GetText(
int nIndex,
LPTSTR lpszBuffer) const;
void GetText(
int nIndex,
CString& rString) const;
パラメーター
nIndex
取得する文字列の 0 から始まるインデックスを指定します。
lpszBuffer
文字列を受け取るバッファーを指します。 バッファーには、文字列と終端の null 文字に対して十分な領域が必要です。 文字列のサイズは、 GetTextLen
メンバー関数を呼び出すことによって、事前に決定できます。
rString
CString
オブジェクトへの参照です。
戻り値
終端の null 文字を除く、文字列の長さ (バイト単位)。 nIndex
が有効なインデックスを指定しない場合、戻り値はLB_ERR
。
解説
このメンバー関数の 2 番目の形式は、 CString
オブジェクトに文字列テキストを入力します。
例
// Dump all of the items in the list box.
CString str, str2;
int n;
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
n = m_myListBox.GetTextLen(i);
m_myListBox.GetText(i, str.GetBuffer(n));
str.ReleaseBuffer();
str2.Format(_T("item %d: %s\r\n"), i, str.GetBuffer(0));
AFXDUMP(str2);
}
CListBox::GetTextLen
リスト ボックス項目内の文字列の長さを取得します。
int GetTextLen(int nIndex) const;
パラメーター
nIndex
文字列の 0 から始まるインデックスを指定します。
戻り値
終端の null 文字を除く文字列の長さ (文字数)。 nIndex
が有効なインデックスを指定しない場合、戻り値はLB_ERR
。
例
CListBox::GetText
の例を参照してください。
CListBox::GetTopIndex
リスト ボックス内の最初に表示される項目の 0 から始まるインデックスを取得します。
int GetTopIndex() const;
戻り値
成功した場合はリスト ボックス内の最初に表示される項目の 0 から始まるインデックス LB_ERR
それ以外の場合。
解説
最初は、項目 0 はリスト ボックスの上部にありますが、リスト ボックスがスクロールされている場合は、別の項目が一番上にある可能性があります。
例
// Want an item in the bottom half to be the first visible item.
int n = m_myListBox.GetCount() / 2;
if (m_myListBox.GetTopIndex() < n)
{
m_myListBox.SetTopIndex(n);
ASSERT(m_myListBox.GetTopIndex() == n);
}
CListBox::InitStorage
リスト ボックス項目を格納するためのメモリを割り当てます。
int InitStorage(
int nItems,
UINT nBytes);
パラメーター
nItems
追加する項目の数を指定します。
nBytes
項目文字列に割り当てるメモリの量をバイト単位で指定します。
戻り値
成功した場合、メモリの再割り当てが必要になるまでにリスト ボックスに格納できる項目の最大数。それ以外の場合は LB_ERRSPACE
、十分なメモリが使用できません。
解説
CListBox
に多数の項目を追加する前に、この関数を呼び出します。
この関数は、多数の項目 (100 個を超える) を含むリスト ボックスの初期化を高速化するのに役立ちます。 指定したメモリ量を事前に割り当て、後続の AddString
、 InsertString
、および Dir
関数が可能な限り短い時間を要するようにします。 パラメーターには見積もりを使用できます。 過大評価すると、追加のメモリが割り当てられます。過小評価する場合は、事前に割り当てられた金額を超えるアイテムに対して通常の割り当てが使用されます。
Windows 95/98 のみ: nItems
パラメーターは 16 ビット値に制限されています。 つまり、リスト ボックスには 32,767 個を超えるアイテムを含めることはできません。 項目の数は制限されていますが、リスト ボックス内の項目の合計サイズは、使用可能なメモリによってのみ制限されます。
例
// Initialize the storage of the list box to be 256 strings with
// about 10 characters per string, performance improvement.
int n = m_myListBox.InitStorage(256, 16 * sizeof(TCHAR));
ASSERT(n != LB_ERRSPACE);
// Add 256 items to the list box.
CString str;
for (int i = 0; i < 256; i++)
{
str.Format(_T("item string %d"), i);
m_myListBox.AddString(str);
}
CListBox::InsertString
リスト ボックスに文字列を挿入します。
int InsertString(
int nIndex,
LPCTSTR lpszItem);
パラメーター
nIndex
文字列を挿入する位置の 0 から始まるインデックスを指定します。 このパラメーターが -1 の場合、文字列はリストの末尾に追加されます。
lpszItem
挿入される null で終わる文字列を指します。
戻り値
文字列が挿入された位置の 0 から始まるインデックス。 エラーが発生した場合、戻り値は LB_ERR
されます。新しい文字列を格納できる領域が不足している場合、戻り値は LB_ERRSPACE
されます。
解説
AddString
メンバー関数とは異なり、InsertString
では、LBS_SORT
スタイルを持つリストは並べ替えされません。
例
// Insert items in between existing items.
CString str;
int n = m_myListBox.GetCount();
for (int i = 0; i < n; i++)
{
str.Format(_T("item string %c"), (char)('A' + i));
m_myListBox.InsertString(2 * i, str);
}
CListBox::ItemFromPoint
pt
で指定されたポイントに最も近いリスト ボックス項目を決定します。
UINT ItemFromPoint(
CPoint pt,
BOOL& bOutside) const;
パラメーター
pt
リスト ボックスのクライアント領域の左上隅を基準にして指定された、最も近い項目を検索するポイント。
bOutside
pt
がリスト ボックスのクライアント領域の外側にある場合にTRUE
に設定されるBOOL
変数への参照。pt
がリスト ボックスのクライアント領域内にある場合はFALSE
。
戻り値
pt
で指定されたポイントに最も近い項目のインデックス。
解説
この関数を使用して、マウス カーソルが上に移動するリスト ボックス項目を決定できます。
例
CListBox::SetAnchorIndex
の例を参照してください。
CListBox::MeasureItem
所有者描画スタイルのリスト ボックスが作成されるときに、フレームワークによって呼び出されます。
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
パラメーター
lpMeasureItemStruct
MEASUREITEMSTRUCT
構造体への長いポインター。
解説
既定では、このメンバー関数は何も行いません。 このメンバー関数をオーバーライドし、リスト ボックスのディメンションを Windows に通知する MEASUREITEMSTRUCT
構造体を入力します。 リスト ボックスが LBS_OWNERDRAWVARIABLE
スタイルで作成された場合、フレームワークはリスト ボックス内の各項目に対してこのメンバー関数を呼び出します。 それ以外の場合、このメンバーは 1 回だけ呼び出されます。
CWnd
のSubclassDlgItem
メンバー関数で作成された所有者描画リスト ボックスでLBS_OWNERDRAWFIXED
スタイルを使用する方法の詳細については、テクニカル ノート 14の説明を参照してください。
MEASUREITEMSTRUCT
構造の説明については、CWnd::OnMeasureItem
を参照してください。
例
// CMyODListBox is my owner-drawn list box derived from CListBox. This
// example measures an item and sets the height of the item to twice the
// vertical extent of its text. The list box control was created with the
// following code:
// m_myODListBox.Create(
// WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|
// LBS_SORT|LBS_MULTIPLESEL|LBS_OWNERDRAWVARIABLE|LBS_WANTKEYBOARDINPUT,
// CRect(10,250,200,450), pParentWnd, IDC_MYODLISTBOX);
//
void CMyODListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
ASSERT(lpMeasureItemStruct->CtlType == ODT_LISTBOX);
LPCTSTR lpszText = (LPCTSTR)lpMeasureItemStruct->itemData;
ASSERT(lpszText != NULL);
CSize sz;
CDC *pDC = GetDC();
sz = pDC->GetTextExtent(lpszText);
ReleaseDC(pDC);
lpMeasureItemStruct->itemHeight = 2 * sz.cy;
}
CListBox::ResetContent
リスト ボックスからすべてのアイテムを削除します。
void ResetContent();
例
// Delete all the items from the list box.
m_myListBox.ResetContent();
ASSERT(m_myListBox.GetCount() == 0);
CListBox::SelectString
指定した文字列と一致するリスト ボックス項目を検索し、一致する項目が見つかった場合は、その項目を選択します。
int SelectString(
int nStartAfter,
LPCTSTR lpszItem);
パラメーター
nStartAfter
検索する最初の項目の前にある項目の 0 から始まるインデックスを格納します。 検索がリスト ボックスの一番下に達すると、リスト ボックスの上部から、 nStartAfter
で指定されたアイテムに戻ります。 nStartAfter
が -1 の場合、リスト ボックス全体が最初から検索されます。
lpszItem
検索するプレフィックスを含む null で終わる文字列を指します。 検索では大文字と小文字が区別されないため、この文字列には大文字と小文字の任意の組み合わせが含まれる場合があります。
戻り値
検索が成功した場合に選択した項目のインデックス。 検索が失敗した場合、戻り値は LB_ERR
され、現在の選択範囲は変更されません。
解説
リスト ボックスは、必要に応じてスクロールされ、選択した項目が表示されます。
このメンバー関数は、 LBS_MULTIPLESEL
スタイルを持つリスト ボックスでは使用できません。
項目が選択されるのは、最初の文字 (開始点) が、 lpszItem
で指定された文字列内の文字と一致する場合のみです。
FindString
メンバー関数を使用して、項目を選択せずに文字列を検索します。
例
// The string to match.
LPCTSTR lpszmyString = _T("item 5");
// Select the item that begins with the specified string.
int nIndex = m_myListBox.SelectString(0, lpszmyString);
ASSERT(nIndex != LB_ERR);
CListBox::SelItemRange
複数選択リスト ボックスで複数の連続する項目を選択します。
int SelItemRange(
BOOL bSelect,
int nFirstItem,
int nLastItem);
パラメーター
bSelect
選択範囲を設定する方法を指定します。 bSelect
がTRUE
されている場合は、文字列が選択され、強調表示されます。FALSE
すると、強調表示は削除され、文字列は選択されなくなります。
nFirstItem
設定する最初の項目の 0 から始まるインデックスを指定します。
nLastItem
設定する最後の項目の 0 から始まるインデックスを指定します。
戻り値
LB_ERR
エラーが発生した場合は 。
解説
このメンバー関数は、複数選択リスト ボックスでのみ使用します。 複数選択リスト ボックスで項目を 1 つだけ選択する必要がある場合 (つまり、 nFirstItem
が nLastItem
と等しい場合) は、代わりに SetSel
メンバー関数を呼び出します。
例
// Select half of the items.
m_myODListBox.SelItemRange(TRUE, 0, m_myODListBox.GetCount() / 2);
CListBox::SetAnchorIndex
複数選択リスト ボックスのアンカーを設定して、拡張選択を開始します。
void SetAnchorIndex(int nIndex);
パラメーター
nIndex
アンカーとなるリスト ボックス項目の 0 から始まるインデックスを指定します。
解説
複数選択リスト ボックスでは、アンカー項目は、連続して選択された項目のブロック内の最初または最後の項目です。
例
void CMyODListBox::OnLButtonDown(UINT nFlags, CPoint point)
{
BOOL bOutside = TRUE;
UINT uItem = ItemFromPoint(point, bOutside);
if (!bOutside)
{
// Set the anchor to be the middle item.
SetAnchorIndex(uItem);
ASSERT((UINT)GetAnchorIndex() == uItem);
}
CListBox::OnLButtonDown(nFlags, point);
}
CListBox::SetCaretIndex
複数選択リスト ボックスの指定したインデックスにあるアイテムにフォーカス矩形を設定します。
int SetCaretIndex(
int nIndex,
BOOL bScroll = TRUE);
パラメーター
nIndex
リスト ボックスでフォーカスの四角形を受け取る項目の 0 から始まるインデックスを指定します。
bScroll
この値が 0 の場合、項目は完全に表示されるまでスクロールされます。 この値が 0 でない場合、項目は少なくとも部分的に表示されるまでスクロールされます。
戻り値
LB_ERR
エラーが発生した場合は 。
解説
アイテムが表示されていない場合は、ビューにスクロールされます。
例
// Set the caret to be the middle item.
m_myListBox.SetCaretIndex(m_myListBox.GetCount() / 2);
ASSERT(m_myListBox.GetCaretIndex() == m_myListBox.GetCount() / 2);
CListBox::SetColumnWidth
複数列のリスト ボックス ( LBS_MULTICOLUMN
スタイルで作成) 内のすべての列の幅をピクセル単位で設定します。
void SetColumnWidth(int cxWidth);
パラメーター
cxWidth
すべての列の幅をピクセル単位で指定します。
例
// Find the pixel width of the largest item.
CString str;
CSize sz;
int dx = 0;
CDC* pDC = myListBox.GetDC();
for (int i = 0; i < myListBox.GetCount(); i++)
{
myListBox.GetText(i, str);
sz = pDC->GetTextExtent(str);
if (sz.cx > dx)
dx = sz.cx;
}
myListBox.ReleaseDC(pDC);
// Set the column width of the first column to be one and 1/3 units
// of the largest string.
myListBox.SetColumnWidth(dx * 4 / 3);
CListBox::SetCurSel
文字列を選択し、必要に応じてビューにスクロールします。
int SetCurSel(int nSelect);
パラメーター
nSelect
選択する文字列の 0 から始まるインデックスを指定します。 nSelect
が -1 の場合、リスト ボックスは選択されていないよう設定されます。
戻り値
LB_ERR
エラーが発生した場合は 。
解説
新しい文字列を選択すると、リスト ボックスによって、前に選択した文字列から強調表示が削除されます。
このメンバー関数は、単一選択リスト ボックスでのみ使用します。
複数選択リスト ボックスで選択範囲を設定または削除するには、 CListBox::SetSel
を使用します。
例
// Select the last item in the list box.
int nCount = m_myListBox.GetCount();
if (nCount > 0)
m_myListBox.SetCurSel(nCount - 1);
CListBox::SetHorizontalExtent
リスト ボックスを水平方向にスクロールできる幅をピクセル単位で設定します。
void SetHorizontalExtent(int cxExtent);
パラメーター
cxExtent
リスト ボックスを水平方向にスクロールできるピクセル数を指定します。
解説
リスト ボックスのサイズがこの値より小さい場合、水平スクロール バーはリスト ボックス内の項目を水平方向にスクロールします。 リスト ボックスがこの値より大きいか大きい場合、水平スクロール バーは非表示になります。
SetHorizontalExtent
の呼び出しに応答するには、リスト ボックスが WS_HSCROLL
スタイルで定義されている必要があります。
このメンバー関数は、複数列のリスト ボックスには役立ちません。 複数列のリスト ボックスの場合は、 SetColumnWidth
メンバー関数を呼び出します。
例
// Find the longest string in the list box.
CString str;
CSize sz;
int dx = 0;
TEXTMETRIC tm;
CDC *pDC = m_myListBox.GetDC();
CFont *pFont = m_myListBox.GetFont();
// Select the listbox font, save the old font
CFont *pOldFont = pDC->SelectObject(pFont);
// Get the text metrics for avg char width
pDC->GetTextMetrics(&tm);
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
m_myListBox.GetText(i, str);
sz = pDC->GetTextExtent(str);
// Add the avg width to prevent clipping
sz.cx += tm.tmAveCharWidth;
if (sz.cx > dx)
dx = sz.cx;
}
// Select the old font back into the DC
pDC->SelectObject(pOldFont);
m_myListBox.ReleaseDC(pDC);
// Set the horizontal extent so every character of all strings
// can be scrolled to.
m_myListBox.SetHorizontalExtent(dx);
CListBox::SetItemData
リスト ボックス内の指定した項目に関連付けられた値を設定します。
int SetItemData(
int nIndex,
DWORD_PTR dwItemData);
パラメーター
nIndex
項目の 0 から始まるインデックスを指定します。
dwItemData
アイテムに関連付ける値を指定します。
戻り値
LB_ERR
エラーが発生した場合は 。
例
// Set the data of each item to be equal to its index.
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
m_myListBox.SetItemData(i, i);
}
CListBox::SetItemDataPtr
リスト ボックス内の指定した項目に関連付けられた 32 ビット値を、指定したポインター ( void
*) に設定します。
int SetItemDataPtr(
int nIndex,
void* pData);
パラメーター
nIndex
項目の 0 から始まるインデックスを指定します。
pData
項目に関連付けるポインターを指定します。
戻り値
LB_ERR
エラーが発生した場合は 。
解説
リスト ボックス内の項目の相対位置は、項目が追加または削除されると変更される可能性がありますが、このポインターはリスト ボックスの有効期間中も有効なままです。 そのため、ボックス内の項目のインデックスは変更される可能性がありますが、ポインターは信頼できるままです。
例
// Set the data pointer of each item to be NULL.
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
m_myListBox.SetItemDataPtr(i, NULL);
}
CListBox::SetItemHeight
リスト ボックス内の項目の高さを設定します。
int SetItemHeight(
int nIndex,
UINT cyItemHeight);
パラメーター
nIndex
リスト ボックス内の項目の 0 から始まるインデックスを指定します。 このパラメーターは、リスト ボックスに LBS_OWNERDRAWVARIABLE
スタイルがある場合にのみ使用されます。それ以外の場合は 0 に設定する必要があります。
cyItemHeight
項目の高さをピクセル単位で指定します。
戻り値
LB_ERR
インデックスまたは高さが無効な場合は 。
解説
リスト ボックスに LBS_OWNERDRAWVARIABLE
スタイルがある場合、この関数は、 nIndex
で指定された項目の高さを設定します。 それ以外の場合、この関数はリスト ボックス内のすべての項目の高さを設定します。
例
// Set the height of every item to be the
// vertical size of the item's text extent.
CString str;
CSize sz;
CDC *pDC = myListBox.GetDC();
for (int i = 0; i < myListBox.GetCount(); i++)
{
myListBox.GetText(i, str);
sz = pDC->GetTextExtent(str);
myListBox.SetItemHeight(i, sz.cy);
}
myListBox.ReleaseDC(pDC);
CListBox::SetLocale
このリスト ボックスのロケール識別子を設定します。
LCID SetLocale(LCID nNewLocale);
パラメーター
nNewLocale
リスト ボックスに設定する新しいロケール識別子 (LCID) 値。
戻り値
このリスト ボックスの以前のロケール識別子 (LCID) の値。
解説
SetLocale
が呼び出されない場合は、システムから既定のロケールが取得されます。 このシステムの既定のロケールは、コントロール パネルの地域 (または国際) アプリケーションを使用して変更できます。
例
// My LCID to use.
LCID mylcid = MAKELCID(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MEXICAN),
SORT_DEFAULT);
// Force the list box to use my locale.
m_myListBox.SetLocale(mylcid);
ASSERT(m_myListBox.GetLocale() == mylcid);
CListBox::SetSel
複数選択リスト ボックスで文字列を選択します。
int SetSel(
int nIndex,
BOOL bSelect = TRUE);
パラメーター
nIndex
設定する文字列の 0 から始まるインデックスを格納します。 -1 の場合、選択内容は、 bSelect
の値に応じて、すべての文字列に追加または削除されます。
bSelect
選択範囲を設定する方法を指定します。 bSelect
がTRUE
されている場合は、文字列が選択され、強調表示されます。FALSE
すると、強調表示は削除され、文字列は選択されなくなります。 指定した文字列が選択され、既定で強調表示されます。
戻り値
LB_ERR
エラーが発生した場合は 。
解説
このメンバー関数は、複数選択リスト ボックスでのみ使用します。
単一選択リスト ボックスから項目を選択するには、 CListBox::SetCurSel
を使用します。
例
// Select all of the items with an even index and
// deselect all others.
for (int i = 0; i < m_myODListBox.GetCount(); i++)
{
m_myODListBox.SetSel(i, ((i % 2) == 0));
}
CListBox::SetTabStops
リスト ボックス内のタブ停止位置を設定します。
void SetTabStops();
BOOL SetTabStops(const int& cxEachStop);
BOOL SetTabStops(
int nTabStops,
LPINT rgTabStops);
パラメーター
cxEachStop
タブ位置は、 cxEachStop
ダイアログ単位ごとに設定されます。 ダイアログ ユニットの説明については、 rgTabStops
を参照してください。
nTabStops
リスト ボックスに含めるタブ位置の数を指定します。
rgTabStops
ダイアログ 単位のタブ位置を含む整数の配列の最初のメンバーを指します。 ダイアログ ユニットは、水平方向または垂直方向の距離です。 1 つの水平ダイアログユニットは現在のダイアログベースの幅単位の4分の1に等しく、1つの垂直ダイアログユニットは現在のダイアログベースの高さの単位の8分の1に等しくなります。 ダイアログの基本単位は、現在のシステム フォントの高さと幅に基づいて計算されます。 GetDialogBaseUnits
Windows 関数は、現在のダイアログの基本単位をピクセル単位で返します。 タブ位置は、昇順で並べ替える必要があります。バック タブは使用できません。
戻り値
すべてのタブが設定されている場合は 0 以外。それ以外の場合は 0。
解説
タブ位置を 2 ダイアログ 単位の既定のサイズに設定するには、このメンバー関数のパラメーターなしのバージョンを呼び出します。 タブ位置を 2 以外のサイズに設定するには、 cxEachStop
引数を使用してバージョンを呼び出します。
タブ位置をサイズの配列に設定するには、 rgTabStops
引数と nTabStops
引数でバージョンを使用します。 タブ 位置は、nTabStops
で指定された数まで、rgTabStops
の各値に対して設定されます。
SetTabStops
メンバー関数の呼び出しに応答するには、リスト ボックスが LBS_USETABSTOPS
スタイルで作成されている必要があります。
例
// Find the pixel width of the largest first substring.
CString str;
CSize sz;
int nIndex, dx = 0;
CDC *pDC = myListBox.GetDC();
for (int i = 0; i < myListBox.GetCount(); i++)
{
myListBox.GetText(i, str);
if ((nIndex = str.Find('\t')) != -1)
str = str.Right(nIndex);
sz = pDC->GetTextExtent(str);
if (sz.cx > dx)
dx = sz.cx;
}
myListBox.ReleaseDC(pDC);
// Set tab stops at every one and 1/3 units
// of the largest string.
// NOTE: Convert pixels to dialog units.
myListBox.SetTabStops((dx * 4 / 3 * 4) / LOWORD(::GetDialogBaseUnits()));
CListBox::SetTopIndex
特定のリスト ボックス項目が確実に表示されるようにします。
int SetTopIndex(int nIndex);
パラメーター
nIndex
リスト ボックス項目の 0 から始まるインデックスを指定します。
戻り値
成功した場合は 0、エラーが発生した場合は LB_ERR
。
解説
リスト ボックスの上部に nIndex
指定された項目が表示されるか、最大スクロール範囲に達するまで、リスト ボックスがスクロールされます。
例
// Set the first visible item in the list box to be the middle item
m_myListBox.SetTopIndex(m_myListBox.GetCount() / 2);
CListBox::VKeyToItem
リスト ボックスの親ウィンドウがリスト ボックスから WM_VKEYTOITEM
メッセージを受信すると、フレームワークによって呼び出されます。
virtual int VKeyToItem(
UINT nKey,
UINT nIndex);
パラメーター
nKey
ユーザーが押したキーの仮想キー コード。 標準の仮想キー コードの一覧については、 Winuser.h
nIndex
リスト ボックス キャレットの現在位置。
戻り値
それ以上操作しない場合は -2、既定のアクションの場合は 1、キーストロークの既定のアクションを実行するリスト ボックス項目のインデックスを指定する負でない数値を返します。
解説
WM_VKEYTOITEM
メッセージは、WM_KEYDOWN
メッセージを受信したときにリスト ボックスによって送信されますが、リスト ボックスが次の両方を満たしている場合にのみ送信されます。
LBS_WANTKEYBOARDINPUT
スタイルが設定されています。少なくとも 1 つの項目があります。
この関数を自分で呼び出すべきではありません。 キーボード メッセージの独自のカスタム処理を提供するには、この関数をオーバーライドします。
オーバーライドが実行したアクションをフレームワークに通知するには、値を返す必要があります。 戻り値 - 2 は、アプリケーションが項目の選択のすべての側面を処理し、リスト ボックスによるそれ以上のアクションは必要ないことを示します。 2 を返す前に、選択を設定するか、キャレットまたはその両方を移動できます。 選択を設定するには、 SetCurSel
または SetSel
を使用します。 キャレットを移動するには、 SetCaretIndex
を使用します。
戻り値 - 1 は、リスト ボックスがキーストロークに応答して既定のアクションを実行する必要があることを示します。既定の実装では、- 1 が返されます。
戻り値が 0 以上の場合は、リスト ボックス内の項目のインデックスを指定し、リスト ボックスが指定された項目に対してキーストロークの既定のアクションを実行する必要があることを示します。
例
// CMyODListBox is my owner-drawn list box derived from CListBox. This
// example moves the caret down one item on the down key and up one item
// on the up key. The list box control was created with the following
// code:
// m_myODListBox.Create(
// WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|
// LBS_SORT|LBS_MULTIPLESEL|LBS_OWNERDRAWVARIABLE|LBS_WANTKEYBOARDINPUT,
// CRect(10,250,200,450), pParentWnd, IDC_MYODLISTBOX);
//
int CMyODListBox::VKeyToItem(UINT nKey, UINT nIndex)
{
// On key up, move the caret up one item.
if ((nKey == VK_UP) && (nIndex > 0))
{
SetCaretIndex(nIndex - 1);
}
// On key down, move the caret down one item.
else if ((nKey == VK_DOWN) && (nIndex < (UINT)GetCount()))
{
SetCaretIndex(nIndex + 1);
}
// Do not perform any default processing.
return -2;
}
関連項目
MFC サンプル CTRLTEST
CWnd
クラス
階層図
CWnd
クラス
CButton
クラス
CComboBox
クラス
CEdit
クラス
CScrollBar
クラス
CStatic
クラス