0

ご存知かもしれませんが、CComboBox(DropDownListスタイル)は、コンテンツを自動ソートしない場合にのみ、入力することによって適切に選択します。意味の例を次に示します。A、Bの順に入力します。自動並べ替えが行われていない場合は、最初にAで始まる次のエントリを選択し、次にBで始まる次のエントリを選択します。並べ替えられている場合は、次のエントリを選択します。 Aで、次はABで始まります。

CComboBoxから継承するクラスがあり、そのコンテンツは組み込みの並べ替えメカニズムによって並べ替えられません。タイピングによる適切な選択動作が必要だったので、それを自分で実装しました。SetCurSelを使用してエントリを選択し、CBN_SELCHANGEメッセージを親ウィンドウに送信します。

Windows XPでは、これは完全に正常に機能しました。現在Windows7を使用していますが、次の問題が発生しています。マウスを使用してドロップダウンリストを開き、入力してエントリを選択し、Tabキーを使用して次のコントロールにジャンプすると、最初に選択した値は次のようになります。自動的に再選択されます。

OnKillFocusを上書きして、次のようにした場合:

int index = GetCurSel();
CComboBox::OnKillFocus();
SetCurSel(index);

それは一般的に機能しますが、しばらくの間、古い選択された値がまだ点滅し、醜いです。

CComboBox :: OnKillFocus()を呼び出さない場合、正しいエントリが選択されたままになりますが、コンボボックスはドロップダウンされたままになります。

したがって、次の試みはSetDropDown(FALSE)を手動で呼び出すことでした(OnKillFocus()では他に何もありません)が、その後問題が再発します。

したがって、ドロップダウンリストを開くと、現在の選択が内部に保存されていると思います。SetCurSelを呼び出しても、この内部値は更新されません。そして、タブアウトすると、その内部値が再度選択されます。

この問題を解決する方法はありますか?

4

1 に答える 1

0

未検証のアイデアのみ:

  • CB_SHOWDROPDOWN 処理をオーバーライドします。ドロップダウン リストが閉じている場合は、おそらく、格納されたアイテムに対して SetCurSel を呼び出します。

  • CB_SETCURSEL 処理をオーバーライドし、CB_SETCURSEL メッセージを処理するかどうかを示すフラグを追加します。コード サンプルで CComboBox::OnKillFocus() を呼び出すときにフラグをオフにします。

于 2010-03-26T17:57:13.690 に答える