コンボボックス(CComboBoxEx)の一番上に新規の項目を追加したいです。
...
どのように実装を行えば、既存のコンボボックスの一番上へ新しい項目を追加することができるでしょうか?
CComboBoxEx::InsertItem を使います。
引数で渡すCOMBOBOXEXITEM
構造体のメンバーiItem
に0をセットすることで、項目リストのインデックス0番目、つまり一番上に要素を挿入することができます。
※日本語のリファレンスは自動翻訳のせいもあるのか、訳が分からない訳や注釈が入りがちです。そんな場合はオリジナルの英語サイトの方を見ましょう。
CComboBoxEx::InsertItem - 同英語サイト
以下、サンプルコードです。拡張コンボボックスは、ダイアログエディターにてツールボックスから"Extended Combo Box"をダイアログボックスに貼り付け、IDC_COMBO_EX1
のIDをふったものです。サンプルコードとして簡単にするために要素は文字列(CBEIF_TEXT
)で扱っています。
C++
1void CMFCApplication2Dlg::OnBnClickedButton1()
2{
3 // TODO: ここにコントロール通知ハンドラー コードを追加します。
4 CComboBoxEx* pcb = (CComboBoxEx*)GetDlgItem(IDC_COMBO_EX1);
5 ASSERT_VALID(pcb);
6 COMBOBOXEXITEM item;
7 ZeroMemory(&item, sizeof(item));
8 item.mask = CBEIF_TEXT;
9 int result;
10
11 // 3個の要素をあらかじめ挿入
12 for (int i = 0; i < 3; i++) {
13 CString s;
14 s.Format(_T("Item%d"), i + 1);
15 item.pszText = (LPTSTR)((LPCTSTR)s);
16 item.iItem = i;
17 result = pcb->InsertItem(&item);
18 //CComboBoxEx::InsertItemの返り値は挿入位置のインデックス
19 ASSERT(result == i);
20 }
21
22 // 先頭(index==0) に挿入
23 item.pszText = _T("Item on top");
24 item.iItem = 0;
25 result = pcb->InsertItem(&item);
26 // CComboBoxEx::InsertItemの返り値でリストの先頭であることを検証
27 ASSERT(result == 0);
28}
下図は、上記サンプルコードの実行後の状態です。
![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2024-07-17/e9c80315-74ba-4b90-9c45-10ed99aba9fd.png)
上記サンプルはWindows 10上でVisual Studio 2022で試したものですが、Visual Studio 2019でも同じだと思います。