VS2019 / MFCプログラミングチュートリアル:コンボボックス制御

最後のセクションでは、ListBoxコントロールの使用について説明しました。このセクションでは、主にコンボボックスコントロールについて説明します。コンボボックスも非常に一般的です。たとえば、Windowsシステムのコントロールパネルで言語や場所を設定する場合、多くのオプションがあり、選択に使用されるコントロールはコンボボックスコントロールです。それは私たちの日常業務に多くの便利さを提供します。

Xtreme Toolkit Proは、受賞歴のあるVCインターフェイスライブラリであり、MFC開発で最も包括的なインターフェイスコントロールパッケージです。コマンドバー、コントロール、Chart Pro、カレンダー、ドッキングペイン、プロパティなど、Windows開発に必要な11のメインストリームVisual C ++ MFCコントロールを提供します。グリッド、レポートコントロール、ショートカットバー、構文編集、スキンフレームワーク、およびタスクパネル。

Xtreme ToolkitProの最新バージョンをダウンロードするにはクリックしてください

コンボボックスコントロールの概要

コンボボックスは、実際には編集ボックスとリストボックスを組み合わせたもので、シンプルコンボボックス、ドロップダウンコンボボックス、ドロップリストコンボボックスの3種類があります。それらの違いについてお話ししましょう。

シンプルコンボボックスのリストボックスは常に表示され、効果は次のとおりです。

ドロップダウンコンボボックスには、デフォルトではリストボックスは表示されません。リストボックスは、編集ボックスの右側にあるドロップダウン矢印をクリックした場合にのみポップアップします。リストボックスは、次のようにポップアップします。

ドロップダウンリストコンボボックスの編集ボックスは編集できません。ユーザーは、ドロップダウンリストボックスで項目を選択した後にのみ、編集ボックスにテキストを表示できます。ドロップダウンリストのコンボボックスは次のとおりです。

上記の紹介の後、最も一般的に使用されるのはドロップダウンコンボボックスとドロップダウンリストコンボボックスであることを誰もが知っている必要があります。これらは、多くの場合、プログラムをよりプロフェッショナルで簡潔に見せ、ユーザーがより便利に作成できるようにします。選択操作。。

コンボボックスを操作すると、親ウィンドウに通知メッセージが送信されます。これらの通知メッセージとその意味は次のとおりです。

CBN_CLOSEUP:コンボボックスのリストボックスコンポーネントが閉じています。単純なコンボボックスは通知メッセージを送信しません
。CBN_DBLCLK:ユーザーはリストアイテムをダブルクリックします。単純なコンボボックスのみが通知メッセージを送信します
。CBN_DROPDOWN:リストボックスコンボボックスドロップダウンのコンポーネント、単純なコンボボックスは通知メッセージ
CBN_EDITUPDATEを送信しません:編集ボックスが変更されたテキストを表示する準備ができたときにメッセージが送信され、ドロップダウンリストコンボボックスはメッセージ
CBN_EDITCHANGEを送信しません:編集ボックスの内容はユーザーによって変更されており、CBN_EDITUPDATE違いは、編集ボックスに表示されているテキストが更新された後にメッセージが送信されることです。ドロップダウンリストコンボボックスはメッセージを送信しません
。CBN_ERRSPACE:コンボボックスは、リストアイテムを収容するのに十分なメモリを適用できません
。CBN_SELENDCANCEL:ユーザーの選択をキャンセルする必要があることを示します。ユーザーがリストボックスでアイテムを選択し、コンボボックスコントロールの外側でマウスをクリックすると、メッセージは次のようになります。送信
済みCBN_SELENDOK:ユーザーがアイテムを選択し、Enterキーを押すか、下スクロール矢印をクリックします。メッセージは、ユーザーが選択を確認したことを示します
CBN_KILLFOCUS:コンボボックスが入力フォーカスを失いました
CBN_SELCHANGE:ユーザーが選択を変更しました矢印キーをクリックまたは移動してリストの
CBN_SETFOCUS:コンボボックスが入力フォーカスを取得しました

コンボボックスコントロールの作成

MFCは、コンボボックスコントロールのすべての操作をCComboBoxクラスにカプセル化します。

ダイアログボックスにコンボボックスを追加する場合、コンボボックスコントロールをダイアログボックステンプレートにドラッグしてから、使用するCComboBoxタイプのコントロール変数を追加できますが、プログラムで動的に作成する場合は、次を使用する必要があります。 CComboBoxクラスのメンバー関数を作成します。Create関数のプロトタイプは次のとおりです。

virtual BOOL Create(
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID
);

ご覧のとおり、CComboBoxクラスのCreateメンバー関数は、以前のコントロールクラスのCreateメンバー関数と非常によく似ています。dwStyleはコンボボックスコントロールのスタイルを指定し、rectはリストの後のコンボボックスの位置とサイズです。ボックスがポップアップし、pParentWndが親ウィンドウを指します。ポインタをNULLにすることはできず、nIDはコンボボックスコントロールのIDを指定します。最後に、dwStyleパラメーターに焦点を当てます。コンボボックスコントロールのスタイルには次のものがあり、対応する説明が示されています。

CBS_AUTOHSCROLL:編集ボックスコンポーネントの水平スクロールスタイルを
作成しますCBS_DISABLENOSCROLL:スクロールが不要な場合にリストボックスに禁止された垂直スクロールバーを表示し
ます
CBS_DROPDOWN:ドロップダウンコンボボックスを指定しますCBS_DROPDOWNLIST:ドロップダウンリストコンボボックスを指定します
CBS_HASSTRINGS:文字列の自己描画コンボボックスを指定します
CBS_LOWERCASE:編集ボックスとリストボックスのすべてのテキストは自動的に小文字に変換されます
CBS_NOINTEGRALHEIGHT:コンボボックスのサイズはWindowsではなくアプリケーションによって指定されます。通常、指定されたサイズWindowsでは、リストアイテムが作成されます
。CBS_OEMCONVERTの一部:編集ボックスコンポーネントのテキストをANSI文字セットとOEM文字セットの間で変換できるようにします。これは、ファイル名が編集ボックスに含まれている場合に役立ちます
。CBS_OWNERDRAWFIXED:自己描画コンボボックスを指定します。つまり、親ウィンドウがリストボックスのコンテンツの描画を担当し、リストアイテムの高さが同じ
です。CBS_OWNERDRAWVARIABLE :自己描画コンボボックスを指定し、リストアイテムの高さが異なる
CBS_SIIMPLE:単純なコンボボックスを指定する
CBS_SORT:リストボックスコンポーネント内のアイテムを自動的に並べ替える
CBS_UPPERCASE:編集ボックスとリストボックス内のすべてのテキストを大文字に自動的に変換する

dwStyleパラメーターは、上記のスタイルの組み合わせにすることができます。他のコントロールと同様に、WS_CHILD、WS_VISIBLE、WS_TABSTOP、およびWS_VSCROLLは、通常、それらを作成するときに指定されます。

コンボボックスコントロールをダイアログボックステンプレートに直接追加する場合、プロパティページのプロパティには上記のスタイルが含まれます。たとえば、プロパティの大文字をTrueに設定することは、CBS_UPPERCASEスタイルを指定することと同じです。

CComboBoxクラスの主なメンバー関数

コンボボックスは編集ボックスとリストボックスで構成されているため、コンボボックスの操作と編集ボックスおよびリストボックスの操作には多くの類似点があります。同様に、CComboBoxクラスのメンバー関数もCEditクラスやCListBoxクラスと同じです。メンバー関数には多くの類似点があり、関数が類似しているだけでなく、関数名とパラメーターも類似しています。CComboBoxクラスの主なメンバー関数を以下に説明します。詳細な内容については、MSDNを参照してください。

int GetCount()const;
コンボボックスコントロールのリストボックス内のリストアイテムの数を取得します。

int GetCurSel()const;
コンボボックスコントロールのリストボックスで選択された項目のインデックスを取得します。項目が選択されていない場合、関数はCB_ERRを返します。

int SetCurSel(int nSelect);
コンボボックスコントロールのリストボックスで項目を選択します。nSelectパラメーターは、選択するリスト項目のインデックスを指定します。-1の場合、リストボックスの現在の選択が解除され、編集ボックスもクリアされます。

DWORD GetEditSel()const;
コンボボックスコントロールの編集ボックスで、現在の選択範囲の開始文字と終了文字の位置を取得します。この関数は32ビットの数値を返し、下位16ビットは開始位置を格納し、上位16ビットは選択された範囲の後の最初の選択されていない文字の位置を格納します。この関数をドロップダウンリストコンボボックスで使用すると、CB_ERRが返されます。

BOOL SetEditSel(int nStartChar、int nEndChar);
コンボボックスコントロールの編集ボックスで文字を選択するために使用されます。nStartCharパラメーターは開始位置を指定し、nEndCharパラメーターは終了位置を指定します。

DWORD_PTR GetItemData(int nIndex)const;
コンボボックス内の指定されたアイテムに関連付けられた32ビットデータを取得します。nIndexパラメーターは、コンボボックスコントロールのリストボックス内の項目のインデックス(0から開始)を指定します。

int SetItemData(int nIndex、DWORD_PTR dwItemData);
指定されたコンボボックスリストアイテムに関連付けられた32桁の番号を設定します。nIndexパラメーターは、設定するリスト項目のインデックスを指定します。dwItemDataパラメーターは、関連付ける新しい値を指定します。

void GetLBText(int nIndex、CString&rString)const;
コンボボックスコントロールのリストボックスからアイテムの文字列を取得します。nIndexパラメーターは、文字列を取得するためのリストアイテムのインデックスを指定し、CStringパラメーターは、取得した文字列を受信するために使用されます。

int GetLBTextLen(int nIndex)const;
コンボボックスコントロールのリストボックス内の項目の文字列の長さを取得します。nIndexパラメーターは、文字列の長さを取得するリスト項目のインデックスを指定します。

int GetTopIndex()const;
コンボボックスコントロールのリストボックスで最初に表示されるアイテムのインデックスを取得します。

int SetTopIndex(int nIndex);
コンボボックスコントロールのリストボックスで指定された項目を表示するように設定します。nIndexパラメーターは、リスト項目のインデックスを指定します。この関数は、成功した場合は0を返し、エラーが発生した場合はCB_ERRを返します。

BOOL LimitText(int nMaxChars);
ユーザーがコンボボックスコントロールの編集ボックスに入力できる最大バイト長を制限するために使用されます。nMaxCharsパラメーターは、ユーザーが入力できるテキストの最大バイト長を指定します。0の場合、長さは65535バイトに制限されます。

int AddString(LPCTSTR lpszString);
コンボボックスコントロールのリストボックスに新しいリストアイテムを追加します。lpszStringパラメーターは、追加する文字列へのポインターです。この関数の戻り値が0以上の場合は、新しいリストアイテムのインデックスです。エラーが発生した場合は、CB_ERRを返します。新しい文字列を格納するのに十分なメモリがない場合は、次のようになります。 CB_ERRSPACEを返します。

int DeleteString(UINT nIndex);
コンボボックスの指定された位置にあるリストアイテムを削除します。nIndexパラメーターは、削除するリスト項目のインデックスを指定します。この関数の戻り値が0以上の場合、それはコンボボックスに残っているリストアイテムの数です。nIndexで指定されたインデックスがリスト項目の数を超えると、CB_ERRが返されます。

int FindString(int nStartAfter、LPCTSTR lpszString)const;
コンボボックスコントロールのリストボックスで、指定されたプレフィックスを含む最初のリストアイテムを検索しますが、選択しないでください。nStartAfterパラメーターは、最初に見つかるリスト項目の前のリスト項目の索引を指定します。lpszStringは、検索するプレフィックスを含む文字列を指します。この関数の戻り値が0以上の場合は、一致するリストアイテムのインデックスであり、検索が失敗した場合はCB_ERRを返します。

int InsertString(int nIndex、LPCTSTR lpszString);
コンボボックスコントロールのリストボックスにリスト項目を挿入します。nIndexパラメーターはリスト項目を挿入する位置を指定し、lpszStringパラメーターは挿入する文字列を指定します。この関数は、文字列が挿入された位置を返します。エラーが発生した場合はCB_ERRを返します。新しい文字列を格納するのに十分なメモリがない場合は、CB_ERRSPACEを返します。

int SelectString(int nStartAfter、LPCTSTR lpszString);
コンボボックスコントロールのリストボックスで文字列を見つけます。見つかった場合は、それを選択して編集ボックスに表示します。パラメータはFindStringと同じです。文字列が見つかった場合は、このリストアイテムのインデックスを返し、検索が失敗した場合はCB_ERRを返し、現在の選択は変更されません。

さらに、CComboBoxクラスは、CWndクラスのメンバー関数GetWindowText、SetWindowTextなども継承します。

CComboBoxクラスのアプリケーション例

最後に、CComboBoxのいくつかのメンバー関数と通知メッセージの使用法を説明する簡単な例を記述します。この例で実現される機能:Webサイトリストがコンボボックスに含まれ、コンボボックスコントロールのリストボックスで選択されたリストアイテムが切り替わると、新しく選択されたリストアイテムのテキストが編集ボックスに表示されます。具体的な実装手順は次のとおりです。

1.ダイアログベースのMFCプロジェクトを作成し、名前を「Example25」に設定します。

2.自動生成されたダイアログテンプレートIDD_EXAMPLE25_DIALOGで、[TODO:ダイアログコントロールをここに配置]静的テキストコントロール、[OK]ボタン、および[キャンセル]ボタンを削除します。コンボボックスコントロールを追加し、IDをIDC_WEB_COMBOに設定し、TypeプロパティをDrop Listに設定し、ドロップダウンリストコンボボックスであり、編集ボックスでユーザー入力を許可せず、SortプロパティをFalseに設定してキャンセルします。ソート表示。静的テキストコントロールと編集ボックスを追加します。静的テキストコントロールのCaptionプロパティは「選択したWebサイト:」に設定され、編集ボックスのIDはIDC_SEL_WEB_EDITに設定され、読み取り専用プロパティはTrueに設定されます。このときのダイアログボックスのテンプレートは次のとおりです。

3.CComboBoxタイプの制御変数m_comboWebをコンボボックスIDC_WEB_COMBOに追加します。

4.ダイアログが初期化されたら、コンボボックスにサイト名を追加し、デフォルトで最初の項目を選択します。次に、CExample25Dlg :: OnInitDialog()関数を次のように変更する必要があります。

C ++コード

BOOL CExample25Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog.  The framework does this automatically
//  when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE);         // Set big icon
SetIcon(m_hIcon, FALSE);        // Set small icon
// TODO: Add extra initialization here
// 为组合框控件的列表框添加列表项“鸡啄米”
m_comboWeb.AddString(_T("鸡啄米"));
// 为组合框控件的列表框添加列表项“百度”
m_comboWeb.AddString(_T("百度"));
// 在组合框控件的列表框中索引为1的位置插入列表项“新浪”
m_comboWeb.InsertString(1, _T("新浪"));
// 默认选择第一项
m_comboWeb.SetCurSel(0);
// 编辑框中默认显示第一项的文字“鸡啄米”
SetDlgItemText(IDC_SEL_WEB_EDIT, _T("鸡啄米"));
return TRUE;  // return TRUE  unless you set the focus to a control
}

5.コンボボックスで選択されたリスト項目が変更されたときに、最新の選択された項目がリアルタイムで編集ボックスに表示され、CBN_SELCHANGE通知メッセージが使用されることを願っています。メッセージ処理関数CExample25Dlg :: OnCbnSelchangeWebCombo()をリストボックスIDC_WEB_COMBOの通知メッセージCBN_SELCHANGEに追加し、次のように変更します。

C ++コード

void CExample25Dlg::OnCbnSelchangeWebCombo()
{
// TODO: Add your control notification handler code here
CString strWeb;
int nSel;
// 获取组合框控件的列表框中选中项的索引
nSel = m_comboWeb.GetCurSel();
// 根据选中项索引获取该项字符串
m_comboWeb.GetLBText(nSel, strWeb);
// 将组合框中选中的字符串显示到IDC_SEL_WEB_EDIT编辑框中
SetDlgItemText(IDC_SEL_WEB_EDIT, strWeb);
}

6.プログラムを実行すると、結果ダイアログボックスがポップアップします。ダイアログボックスのコンボボックスで選択を変更すると、それに応じて編集ボックスの表示が変わります。レンダリングは次のとおりです。

VS2010 / MFCプログラミングの概要25(一般的に使用されるコントロール:コンボボックスコントロール)

コンボボックスの内容は以上です。CComboBoxクラスの多数のメンバー関数と比較して、このセクションの例では少数しか使用していません。上記に基づいて他のメンバー関数を試すことができます。

この記事の転載の住所を明記してください:Ji Zhuomi

おすすめ

転載: blog.csdn.net/qq_42444778/article/details/115198640