お世話になっております。
コンボボックスの右端にある、押すとリストボックスが表示されるボタンを無効化したい
と考えているのですが方法がわからなくて悩んでおります。
初めは単純にウィンドウメッセージ等で設定できるのかと思っていたのですがそのような
メッセージが見当たらないので、ボタンは子ウィンドウとして張り付いているのかと考えて
EnumChildWindows()で列挙してみても駄目でした。
もし無効化する方法をご存知の方がいらっしゃいましたらご教授をお願いいたします。
環境:Windows2000(SP3) Visualstudio6.0(SP5) SDKです。
最終手段としてオーナードローも考えているのですが、それ以外での方法がありましたら
よろしくお願い致します。
コンボボックス自体を disable するのでは駄目なのですか?
>渋木宏明(ひどり)様
はい。コンボボックス自体をEnableWindow()で無効にしてしまうとEditBoxの部分も淡色
表示されてしまうのはご存知かと思いますが、そうではなく、背景色が白のままにしておき
たいとかんがえております。
リストボックスのアイテム数が一つだけの時にそのようにしたいと考えております。
これ?
CComboBox *ccb=(CComboBox *)GetDlgItem(IDC_COMBO2);
CEdit *ced=(CEdit *)ccb->GetDlgItem(1001);
ccb->EnableWindow(FALSE);
ced->EnableWindow(TRUE);
>NEG(ねぐ)様
返信遅くなり、大変申し訳ございません。m(_ _)m
NEG様のアドバイスを見て、なるほど!!と思い、早速やってみましたがうまくいきません
でした。
実は、無効にしようとしている対象のコンボボックスは、コモンダイアログについているもの
なのですが、これは、もともとCBS_DROPDOWNLISTのスタイルでおそらく作成されており、
EditBoxはついていないのです。そこでむりやりSetWindowLong()でCBS_SIMPLEにスタイル
を変更してしまえばできるのでは・・・・と思ってやってみたところ、なぜかスタイル変更
だけは受け付けてくれませんでした。
他の変更(例えばCBS_ADDSTRINGでアイテム追加など)はうまくいくのですが・・・・・。
コモンダイアログでこのような事は無理なのでしょうか・・・・・
フックでWM_CTLCOLOR~が処理できれば・・・ってとこだと思います。
できるのかな?(?_?;
>NEG(ねぐ)様
おはようございます。
WM_CTLCOLOR~系のメッセージだと確かに色は変化すると思いますが、当初の目的の
ボタンを無効にするという事はできないと思いますが・・・・・・
もしこちらの思い違いでしたら申し訳ございません。
コンボボックスが発生しているウィンドウメッセージをSpy++で少し調査してみたのですが、
ボタンを押した場合、CBN_DROPDOWNメッセージとWM_CTLCOLORLISTBOXしか送られてこない
みたいです。
やはり、プロシージャをフックしてオーナードローしか方法はないのでしょうか・・・・・
ボタンの色は試していませんが…
CBN_DROPDOWNが来た時に、CB_SHOWDROPDOWNメッセージで強制的に
ドロップダウンリストを閉じるというのはどうでしょう?
もちろん、ボタン自体は押せてしまいますが……
(ちなみにSendMessage()では失敗したのでPostMessage()してみました)
コモンダイアログだとすると、サブクラス化とかが必要かも知れませんが。
>>CBS_DROPDOWNLISTのスタイルでおそらく作成されており、
>>EditBoxはついていないのです。
ということは、無効状態、入力も不可、でも背景は白(通常表示)にしたい
という意味ですか?
それであれば、普通に無効状態にしてしまって
WM_CTLCOLOR系で背景色を白にすればよいような気がするのですが。。。
違う意味であればごめんなさい
コンボボックスをサブクラス化して、WM_NCHITTEST の際には
常に HTNOWHERE を返す(乱暴かも...)ようにすると、リストが出なくなる
みたいです。
何故だかエディットボックスはそのまま使えるので結構イイかも??
(深く調べてないので何らかの弊害があるかも)
すいません、私が試したのはスタイルが CBS_DROPDOWN の場合なので、上記の
> 何故だかエディットボックスはそのまま...
の部分は不適切でした。
>瀬戸っぷ様 たみあ様 n様
更新してみたらこんなにレスがついていてびっくりしました!!
本当にありがとうございます。
私のしたいことは、たみあ様のおっしゃっられていることそのままでございます。
自分の希望の動作に一番近づける方法として、たみあ様の方法で試してみました。
初めWM_CTLCOLOR系の何で処理したら良いのか迷いましたが、とりあえず、~EDITで試した
所、うまくいかず、じゃあSTATICかな?と思い、やってみましたがこれも駄目でした。
最終的に全てのWM_CTLCOLOR~メッセージを試してみたのですがどれも反応ナシでした。
う~ん・・・・・他になにがコンボボックスに張り付いているのでしょうか・・・・
ちなみにフックしたプロシージャからWM_CTLCOLORLISTBOXを処理した場合、きちんと背景
(文字の表示されている範囲以外)が変化しましたので、フックは成功しているのだと思いま
すが・・・
追伸です。
WM_CTLCOLORLISTBOXを処理した際に変化した背景はドロップダウンリストボックスの事で
す。
いちおう、念のため。
う~ん、惜しいですね
無効状態で描画されるときSpyでみて何が飛んできてるでしょうか
もしかしたらオーナードローしなきゃだめなのかなぁ。。。
オーナードローするのであれば、
有効状態でドロップダウンを抑止する方向性のほうが楽かもしれませんね
>たみあ様
無効状態の時に飛んでくるメッセージ、ちょっと調べてみましたが、WM_ERASEBKGNDと
WM_PAINTしか受け取ってないみたいです。
だとすると、WM_PAINTでも乗っ取ってオーナードローという道しか残されていなさそう
ですね・・・・・