コンボボックスをドロップダウン不可にしたい – プログラミング – Home

コンボボックスをドロップダウン不可にし...
 
通知
すべてクリア

[解決済] コンボボックスをドロップダウン不可にしたい


亀山
 亀山
(@亀山)
ゲスト
結合: 18年前
投稿: 133
Topic starter  

Windows7、VS2008、MFCです。

リスト内に選択肢が一つも入っていないコンボボックスで、
ドロップダウンをできないようにする方法はありませんでしょうか。

単語を入力するコンボボックスで、
過去に入力したものが自動で次回の選択肢として入っていくものです。
同じ画面内で履歴の削除を行うこともできます。

このコンボボックスを初めて出したときや、履歴の削除を行った直後だと、
リストはまだ空っぽのため、無駄に大きなドロップダウンが出てしまいます。

ドロップダウンリストではなくドロップダウンなので、
コンボボックス自体を選択不可にするわけにはいきません。

動的にエディットボックスとコンボボックスを置き換える方法以外で、
なにか良い方法はありませんでしょうか。
よろしくお願いいたします。


引用未解決
トピックタグ
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

CBN_DROPDOWNメッセージ、CB_SHOWDROPDOWNメッセージあたりでなんとかできませんかね?
MFCでどうやるのか…についてはちょっと判りませんが。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 4年前
投稿: 828
 

比較的簡単にできます。

1.CComboBoxを継承したクラス、例えばXComboクラスを作成する。
2.このクラスでWM_LBUTTONDOWNメッセージをハンドリングする。
 つまりXCombo::OnLButtonDown()関数を作るわけですね。
3.上記関数内で、もし項目数が0ならば派生元の:OnLButtonDown()を呼ばない。
 あれば、派生元の:OnLButtonDown()を呼ぶ。

とし、当然親のDLGのDoDataExchange()で、XComboクラスのメンバをDDX_Control()するわ
けですね。

ちなみに、コンボボックスは「F4」キーでもドロップするので、これを止めるのには、
このXComboにCB_SETEXTENDEDUIメッセージをWPARAM = 1でSendMessage()します。


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

>ちなみに、コンボボックスは「F4」キーでもドロップするので、これを止めるのには

F4キーは知らなかった…。
Alt+↓でも開きます。


返信引用
亀山
 亀山
(@亀山)
ゲスト
結合: 18年前
投稿: 133
Topic starter  

ご意見ありがとうございます。
ドロップダウンを不可にする仕組み自体はWindowsには無く、通常の見た目のまま、
ドロップダウン状態にならないように監視するしかないということになるのですね。

同じような機能を持った他のアプリなどを調べてみても、
項目が無いときは、真っ白で大きいドロップダウンが出てくるようです。

ちなみに、Visual Studio(2008や2010で確認)の「検索と置換」などは、
項目が無いときは、最小の高さ(1行分)のドロップダウンが出てきました。

これどうやっているのでしょうね。
一昔前のOSでは、リソースエディタで高さを広げておかないと、
通常時のドロップダウンリストが小さくなってしまうはずなのですが。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 4年前
投稿: 828
 

リストの高さはコンボにSetWindowPos()等で、WM_SIZEしたときの高さになるので、
項目が無いときは高さを小さくしているのではないでしょうか。

最近の傾向としては、(使い勝手の悪い)コンボボックスではなく、
単純エディットとオートコンプリート用のリストを別にポップアップ表示する
というパターンが多いかもしれません。Chromeとか。
ちょっと違いますがインテリセンスなども似たようなものと言えるかもしれませんね。


返信引用
亀山
 亀山
(@亀山)
ゲスト
結合: 18年前
投稿: 133
Topic starter  

> リストの高さはコンボにSetWindowPos()等で、WM_SIZEしたときの高さになるので、
> 項目が無いときは高さを小さくしているのではないでしょうか。

解説ありがとうございます。
以下のようにしてみたところ、ドロップダウンは小さくなりました。

CRect rect;
m_combo.GetWindowRect(&rect);
m_combo.SetWindowPos(NULL, 0, 0, rect.Width(), rect.Height() * 2, SWP_NOMOVE |
SWP_NOZORDER);

なお、他にもいろいろ試してみたのですが、以下のように、
一度ダミーの文字列を入れてからResetContent()し直してみたところ、
ドロップダウンの高さが1行分になってくれました。

m_combo.ResetContent();
m_combo.AddString(_T("));
m_combo.ResetContent();

項目が増えたときにドロップダウンの高さを計算して、
それをずっと憶えているような動作なのかもしれません。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました