コンボボックスのボタンの無効方法 – プログラミング – Home

コンボボックスのボタンの無効方法
 
通知
すべてクリア

[解決済] コンボボックスのボタンの無効方法

固定ページ 1 / 2

jan
 jan
(@jan)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

お世話になっております。

コンボボックスの右端にある、押すとリストボックスが表示されるボタンを無効化したい
と考えているのですが方法がわからなくて悩んでおります。

初めは単純にウィンドウメッセージ等で設定できるのかと思っていたのですがそのような
メッセージが見当たらないので、ボタンは子ウィンドウとして張り付いているのかと考えて
EnumChildWindows()で列挙してみても駄目でした。
もし無効化する方法をご存知の方がいらっしゃいましたらご教授をお願いいたします。

環境:Windows2000(SP3) Visualstudio6.0(SP5) SDKです。

最終手段としてオーナードローも考えているのですが、それ以外での方法がありましたら
よろしくお願い致します。


引用未解決
トピックタグ
渋木宏明(ひどり)
 渋木宏明(ひどり)
(@渋木宏明(ひどり))
ゲスト
結合: 23年前
投稿: 196
 

コンボボックス自体を disable するのでは駄目なのですか?


返信引用
jan
 jan
(@jan)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

>渋木宏明(ひどり)様
 はい。コンボボックス自体をEnableWindow()で無効にしてしまうとEditBoxの部分も淡色
 表示されてしまうのはご存知かと思いますが、そうではなく、背景色が白のままにしておき
 たいとかんがえております。
 リストボックスのアイテム数が一つだけの時にそのようにしたいと考えております。


返信引用
NEG(ねぐ)
 NEG(ねぐ)
(@NEG(ねぐ))
ゲスト
結合: 23年前
投稿: 178
 

 これ?
CComboBox *ccb=(CComboBox *)GetDlgItem(IDC_COMBO2);
CEdit *ced=(CEdit *)ccb->GetDlgItem(1001);

ccb->EnableWindow(FALSE);
ced->EnableWindow(TRUE);


返信引用
jan
 jan
(@jan)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

>NEG(ねぐ)様
 返信遅くなり、大変申し訳ございません。m(_ _)m
 
 NEG様のアドバイスを見て、なるほど!!と思い、早速やってみましたがうまくいきません
 でした。
 実は、無効にしようとしている対象のコンボボックスは、コモンダイアログについているもの
 なのですが、これは、もともとCBS_DROPDOWNLISTのスタイルでおそらく作成されており、
 EditBoxはついていないのです。そこでむりやりSetWindowLong()でCBS_SIMPLEにスタイル
 を変更してしまえばできるのでは・・・・と思ってやってみたところ、なぜかスタイル変更
 だけは受け付けてくれませんでした。
 他の変更(例えばCBS_ADDSTRINGでアイテム追加など)はうまくいくのですが・・・・・。
 
 コモンダイアログでこのような事は無理なのでしょうか・・・・・


返信引用
NEG(ねぐ)
 NEG(ねぐ)
(@NEG(ねぐ))
ゲスト
結合: 23年前
投稿: 178
 

 フックでWM_CTLCOLOR~が処理できれば・・・ってとこだと思います。
 できるのかな?(?_?;


返信引用
jan
 jan
(@jan)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

>NEG(ねぐ)様
 おはようございます。
 
 WM_CTLCOLOR~系のメッセージだと確かに色は変化すると思いますが、当初の目的の
 ボタンを無効にするという事はできないと思いますが・・・・・・
 もしこちらの思い違いでしたら申し訳ございません。
 
 コンボボックスが発生しているウィンドウメッセージをSpy++で少し調査してみたのですが、
 ボタンを押した場合、CBN_DROPDOWNメッセージとWM_CTLCOLORLISTBOXしか送られてこない
 みたいです。
 やはり、プロシージャをフックしてオーナードローしか方法はないのでしょうか・・・・・


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

ボタンの色は試していませんが…

CBN_DROPDOWNが来た時に、CB_SHOWDROPDOWNメッセージで強制的に
ドロップダウンリストを閉じるというのはどうでしょう?
もちろん、ボタン自体は押せてしまいますが……
(ちなみにSendMessage()では失敗したのでPostMessage()してみました)
コモンダイアログだとすると、サブクラス化とかが必要かも知れませんが。


返信引用
たみあ
 たみあ
(@たみあ)
ゲスト
結合: 22年前
投稿: 57
 

>>CBS_DROPDOWNLISTのスタイルでおそらく作成されており、
>>EditBoxはついていないのです。

ということは、無効状態、入力も不可、でも背景は白(通常表示)にしたい
という意味ですか?

それであれば、普通に無効状態にしてしまって
WM_CTLCOLOR系で背景色を白にすればよいような気がするのですが。。。

違う意味であればごめんなさい


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

コンボボックスをサブクラス化して、WM_NCHITTEST の際には
常に HTNOWHERE を返す(乱暴かも...)ようにすると、リストが出なくなる
みたいです。

何故だかエディットボックスはそのまま使えるので結構イイかも??
(深く調べてないので何らかの弊害があるかも)


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

すいません、私が試したのはスタイルが CBS_DROPDOWN の場合なので、上記の
> 何故だかエディットボックスはそのまま...
の部分は不適切でした。


返信引用
jan
 jan
(@jan)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

>瀬戸っぷ様 たみあ様 n様
 更新してみたらこんなにレスがついていてびっくりしました!!
 本当にありがとうございます。

 私のしたいことは、たみあ様のおっしゃっられていることそのままでございます。
 自分の希望の動作に一番近づける方法として、たみあ様の方法で試してみました。
 初めWM_CTLCOLOR系の何で処理したら良いのか迷いましたが、とりあえず、~EDITで試した
 所、うまくいかず、じゃあSTATICかな?と思い、やってみましたがこれも駄目でした。
 最終的に全てのWM_CTLCOLOR~メッセージを試してみたのですがどれも反応ナシでした。

 う~ん・・・・・他になにがコンボボックスに張り付いているのでしょうか・・・・
 ちなみにフックしたプロシージャからWM_CTLCOLORLISTBOXを処理した場合、きちんと背景
 (文字の表示されている範囲以外)が変化しましたので、フックは成功しているのだと思いま
 すが・・・


返信引用
jan
 jan
(@jan)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

追伸です。
 WM_CTLCOLORLISTBOXを処理した際に変化した背景はドロップダウンリストボックスの事で
す。
 いちおう、念のため。


返信引用
たみあ
 たみあ
(@たみあ)
ゲスト
結合: 22年前
投稿: 57
 

う~ん、惜しいですね

無効状態で描画されるときSpyでみて何が飛んできてるでしょうか

もしかしたらオーナードローしなきゃだめなのかなぁ。。。

オーナードローするのであれば、
有効状態でドロップダウンを抑止する方向性のほうが楽かもしれませんね


返信引用
jan
 jan
(@jan)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

>たみあ様
 無効状態の時に飛んでくるメッセージ、ちょっと調べてみましたが、WM_ERASEBKGNDと
 WM_PAINTしか受け取ってないみたいです。

 だとすると、WM_PAINTでも乗っ取ってオーナードローという道しか残されていなさそう
 ですね・・・・・


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

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