MFC   VC++   Visual Studio   Visual Studio   プログラミング

CMFCToolBar上のコンボボックス

 「CMFCToolBar」上に「CMFCToolBarComboBoxButton」のコンボボックスを作成し、値を取得/操作する方法を紹介します。

 「CMFCToolBarComboBoxButton」は、作成時にポインタを取得してメンバ変数などにしておいても、その後、そのポインタは有効ではなくなり、この方法では値を取得できません。
 しかも、スタイルの違いで取得方法が少し違うので、必要なときに値を取得する方法を、スタイル別に紹介していきたいと思います。

 まず、コンボボックスのスタイルを「CBS_DROPDOWNLIST」にした場合のリスト切替え時に取得する方法を紹介します。
 リスト切替え時とは、ユーザーがドロップダウンリストから項目を選択し、表示が切り替わったタイミングのことで、コードはまず、処理したいヘッダファイル内で処理したい関数(ここでは OnChangeComboBox )を宣言し、
    afx_msg void OnChangeComboBox(void);
と宣言し、cppファイル内のメッセージマップに以下を追加、
    ON_CBN_SELENDOK(ID_COMBOBOXBUTTON, &CXXX::OnChangeComboBox)
 ここで「ID_COMBOBOXBUTTON」は「CMFCToolBarComboBoxButton」作成時に関連付けたIDで、「CXXX」は処理するクラス名です。

 次に、関数の中身ですが、
void CXXX::OnChangeComboBox()
{
    CMFCToolBarComboBoxButton* pSrcCombo = NULL;
    CObList listButtons;
    if(CMFCToolBar::GetCommandButtons(ID_COMBOBOXBUTTON, listButtons) > 0)
    {
        for(POSITION posCombo = listButtons.GetHeadPosition(); pSrcCombo == NULL && posCombo != NULL;)
        {
            CMFCToolBarComboBoxButton* pCombo =
                DYNAMIC_DOWNCAST(CMFCToolBarComboBoxButton, listButtons.GetNext(posCombo));

            if(pCombo != NULL && CMFCToolBar::IsLastCommandFromButton(pCombo))
            {
                pSrcCombo = pCombo;
            }
        }
    }

    if(pSrcCombo != NULL)
    {
        ASSERT_VALID(pSrcCombo);

        LPCTSTR lpszSelItem = pSrcCombo->GetItem();    // ここでアイテム名を取得または操作する。
    }
}
 のようになり、「lpszSelItem」に選択されたアイテム名が入ります。

 さらに、このコンボボックスのIDをメニューに入れ、メニューから選択を切り替えたい場合などは、通常のコマンドID処理をするようにすればできます。
 その方法は、ヘッダで処理したい関数を宣言し、cppファイル内のメッセージマップで「ON_COMMAND」を宣言し、cppファイル内の関数で処理します。
ヘッダファイル
    afx_msg void OnCommandComboBox(void);
cppファイル
BEGIN_MESSAGE_MAP(CRenameApp, CWinAppEx)
    ON_COMMAND(ID_COMBOBOXBUTTON, &CXXX::OnCommandComboBox)
END_MESSAGE_MAP()
 関数の中身は、前述の「OnChangeComboBox」とほぼ同じで、「CMFCToolBar::IsLastCommandFromButton(pCombo)」を削除すれば処理できます。
 ここで「CMFCToolBar::IsLastCommandFromButton(pCombo)」は、最後にコマンド送信されたボタンかどうかを調べるものなので、スタイルがドロップダウンリストのとき、リスト変更されたタイミングで処理する場合に有効になります。
 任意のタイミングで値を取得/操作したい場合は、メニューからの処理をする方法で関数を作り、取得したいときにこの関数を呼べば取得/操作できます。

 次回、コンボボックスのスタイルが「CBS_DROPDOWN」での値の取得、操作方法を紹介します。
ランキングへ     posted by 遠雷 | Comment(0) | フレーム
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。