次の方法で共有


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_VKEYTOITEMLBS_WANTKEYBOARDINPUT スタイルのリスト ボックスは、WM_KEYDOWN メッセージを受け取ります。

ダイアログ ボックス内に (ダイアログ リソースを使用して) CListBox オブジェクトを作成すると、ユーザーがダイアログ ボックスを閉じると、 CListBox オブジェクトが自動的に破棄されます。

ウィンドウ内に CListBox オブジェクトを作成する場合は、 CListBox オブジェクトを破棄する必要があります。 スタック上に CListBox オブジェクトを作成すると、自動的に破棄されます。 new関数を使用してヒープ上にCListBox オブジェクトを作成する場合は、ユーザーが親ウィンドウを閉じたときにオブジェクトに対してdeleteを呼び出して破棄する必要があります。

CListBox オブジェクトにメモリを割り当てる場合は、CListBoxデストラクターをオーバーライドして割り当てを破棄します。

継承階層

CObject

CCmdTarget

CWnd

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_NCCREATEWM_CREATEWM_NCCALCSIZE、およびWM_GETMINMAXINFOメッセージをリスト ボックス コントロールに送信します。

これらのメッセージは、既定では、CWnd 基底クラスのOnNcCreateOnCreateOnNcCalcSize、および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 個を超える) を含むリスト ボックスの初期化を高速化するのに役立ちます。 指定したメモリ量を事前に割り当て、後続の AddStringInsertString、および 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 回だけ呼び出されます。

CWndSubclassDlgItemメンバー関数で作成された所有者描画リスト ボックスで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
選択範囲を設定する方法を指定します。 bSelectTRUEされている場合は、文字列が選択され、強調表示されます。FALSEすると、強調表示は削除され、文字列は選択されなくなります。

nFirstItem
設定する最初の項目の 0 から始まるインデックスを指定します。

nLastItem
設定する最後の項目の 0 から始まるインデックスを指定します。

戻り値

LB_ERR エラーが発生した場合は 。

解説

このメンバー関数は、複数選択リスト ボックスでのみ使用します。 複数選択リスト ボックスで項目を 1 つだけ選択する必要がある場合 (つまり、 nFirstItemnLastItem と等しい場合) は、代わりに 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
選択範囲を設定する方法を指定します。 bSelectTRUEされている場合は、文字列が選択され、強調表示されます。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 クラス