4

ダイアログにアルファベット順に並べ替えられたコンボボックスがあります。このコンボには複数の文字列が含まれていますが、一部は大文字と小文字が異なって重複しています。つまり、「オン」と「オン」、「オフ」と「オフ」があります。これは冗長に思えるかもしれませんが、現時点では重要ではありませんが、理由があります。

重複は明らかに、大文字の文字列が最初にリストに次々と表示されます。すなわち:

オフ

オフ

オン

の上

ユーザーが「オン」(小文字) を選択すると、正しいインデックスが設定されCurSel、正しい文字列が表示されます。ただし、コンボボックスの矢印をクリックしてリストをドロップダウンすると、強調表示されませんCurSelが、その前の大文字の文字列が強調表示されます。以下の画像を参照してください。

これは、ドロップダウンで選択されたものです。

ドロップダウン前の選択項目

これは、ドロップダウンを展開するときにコンボボックスで選択されるものです。

ドロップダウン後に選択されたアイテム

メッセージをキャプチャしON_CBN_DROPDOWN、cursel 値を確認しましたが、期待どおりです。

また、このリスト内の文字列を大文字と小文字を区別して検索できるように、このコンボボックスを既にサブクラス化しています。これは、正常に実装されていないことがわかっているため、問題の原因である可能性があります。

しかし、この段階で文字列がcursel値をオーバーライドする理由がわかりませんか? CurSel値は、関連する項目を選択するために使用される値であってはなりませんか?

これを修正する方法についてのアイデアは大歓迎です。

編集:CBN_DROPDOWNを上書きし てメッセージをキャプチャしようとしましたOnWndMsg。このメッセージが表示されると、メニューをドロップダウンする前に、現在選択されている項目 (正しい項目) を取得します。次に、メニューをドロップして、SetCurSel以前に取得したものを呼び出します。

BOOL CMyComboBox::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam,    LRESULT *pResult)
{
    if(message == CBN_DROPDOWN)
    {
        int nCurSel = GetCurSel();
        if(nCurSel != CB_ERR)
        {
            ShowDropDown();
            SetCurSel(nCurSel);
            return TRUE;
        }

    }
    return CComboBox::OnWndMsg(message, wParam, lParam, pResult);
}

この種の機能は機能しますが、フォーカスを消すか、ドロップダウンの矢印をもう一度クリックしてドロップダウンを非表示にすると、テキスト ボックスに間違った項目が表示されます。これは有効な方法ですか、それとも私は完全にここから外れていますか? ドロップダウンが折りたたまれたときに送信されるメッセージは?

EDIT 2:コードプロジェクト から大文字と小文字を区別するコンボボックスを実装しましたが、うまく機能します。

4

1 に答える 1