コンボボックスのリストボックスを作りたい

[戻る]
show 2010/11/08(月) 23:32:26
WinXP、VS2008、MFCです。

CEditとCListBoxを組み合わせて、CComboBoxのようなコントロールを
作りたいと思っています。

ダイアログにCEditとCListBoxを用意しており、CListBoxは非表示で起動し、
必要なときに表示させようと考えています。

CEditにカーソルがあるときに、↓キーでCListBoxを表示させることは
できるのですが、非表示にするタイミングに困っています。

CListBoxのWM_KILLFOCUSで非表示になるようにしたのですが、
ダイアログのタイトルやコントロールがない場所をクリックしたときなど、
フォーカスの移動が発生しないときは非表示にできません。

CComboBoxのListBoxやメニューなどは、別の場所をクリックすると即座に
消えるのですが、どのように実装すれば同じような動きになるのでしょうか?

動作的にはSetCaptureが近いと思い、
CListBoxの表示時にSetCaptureしてみたのですが、
描画がおかしくなったり、スクロールバーをつかんだときに
挙動がおかしくなったりしたため、断念しました。

ご存知の方がいらっしゃいましたら、よろしくお願いします。

ryo 2010/11/09(火) 10:04:45
フォーカスではなく、アクティブか否か?で判断するのはどうでしょうか?

仲澤@失業者 2010/11/09(火) 11:49:25
ryoさんの発言をやや補足させてもらうと、スタイルによって異なりますが
WM_NCACTIVATEまたはWM_ACTIVATEを処理するのが多分正解です。
ただし、これらのメッセージはトップレベルのフレームにしか送られなかった
という記憶があるので、CListBoxをクリエイトするときにトップレベル、
つまりデスクトップの子として作成しなければならないと思います。

show 2010/11/09(火) 21:28:55
ryoさん、仲澤@失業者さん、レスありがとうございます。

表示したいタイミングで、デスクトップの子としてCListBoxを継承したクラスを
Createしてみたのですが、WM_ACTIVATEも受け取れず、
ダイアログの後ろに表示されるだけで、うまくいきませんでした。

WM_NCACTIVATEやWM_ACTIVATEがトップレベルのウィンドウでしか
受けられないのであれば、CListBoxを派生したコントロールでは、
受けられないので、どこで受け取るのでしょうか?

WM_NCACTIVATEとWM_ACTIVATEで調べてみたのですが、
有効な情報もえられませんでした。

ryo 2010/11/09(火) 22:10:35
リストボックスは子ウィンドウで作ってください。
アクティブは、メインダイアログで受けます。

「メインダイアログがアクティブになったとき
 リストボックスが表示されていたら(たとえば、newで確保したまま)
 リストボックスを破棄する」

で、どうしょうか?

show 2010/11/09(火) 22:32:33
ryoさん、リストボックスを子ウィンドウというのは、どういう意味でしょうか?

メインダイアログを親とするコントロールとして作成する?

ダイアログにコンボボックスを貼り付けたときと同じような動作にしたいと
思っていますので、メインダイアログはすでにアクティブである必要があり、
「メインダイアログがアクティブになったとき〜破棄する」
ではないと思いますが。。

モードレスダイアログにリストボックスを貼り付けるようなイメージ?
リストボックスのウィンドウがアクティブになってしまい、
メインダイアログが非アクティブになりませんか?

すみません、イメージがつかめませんでした。。

仲澤@失業者 2010/11/10(水) 10:42:21
あれっ?WM_ACTIVATEはともかくWM_NCACTIVATEはWS_BORDERスタイルが
付いていれば必ず来ると思っていました。変ですねぇ、う〜む(vv;)。

デゴルガン 2010/11/10(水) 21:23:29
リストボックスはWS_CHILDではなくWS_POPUPで作るといいのでは?
ドロップダウンしたときにダイアログからはみ出る場合も対処できますし。
WM_ACTIVATEが受け取れるかどうかは分かりませんが。

ryo 2010/11/11(木) 00:37:28
>モードレスダイアログにリストボックスを貼り付けるようなイメージ?
>リストボックスのウィンドウがアクティブになってしまい、
>メインダイアログが非アクティブになりませんか?
このイメージでした。

show 2010/11/11(木) 09:39:21
[[解決]]
デゴルガンさんへ

リストボックスは、WS_POPUPで作れるのですか?
Createしてみたのですが、wincore.cppのCreateでdwStyleにWS_POPUPがついていると
アサーションされるようになっていてCreateできませんでした。

イメージとしては、WS_POPUPでよさそうなのですが。。。

ryoさんへ

通常のコンボボックスでは、ドロップダウンリストを表示したときに、
親ウィンドウは非アクティブにならないため、
違和感がありそうです。。。

コンボボックスのドロップダウンリストやポップアップメニュー、
リストコントロールのエディットラベルなど、
他の箇所のクリックや、他のウィンドウをアクティブにしたとたんに
消えるような昔からあるWindowsの標準コントロールは、
一般的でよくつかわれるものなので、同じようなものを作成するノウハウが
あるのではないかと思い、調べていたのですが見つからず、
質問をさせていただいたのですが、
決定的な方法もなさそうですので、
標準コントロールを何とかして使うということで解決としたいと思います。

皆様ありがとうございました。

古いスレッドには追加発言できません。