コンボボックスのリストボックスを作りたい – プログラミング – Home

コンボボックスのリストボックスを作りた...
 
通知
すべてクリア

[解決済] コンボボックスのリストボックスを作りたい


show
 show
(@show)
ゲスト
結合: 14年前
投稿: 4
Topic starter  

WinXP、VS2008、MFCです。

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

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

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

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

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

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

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


引用未解決
トピックタグ
ryo
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

フォーカスではなく、アクティブか否か?で判断するのはどうでしょうか?


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

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


返信引用
show
 show
(@show)
ゲスト
結合: 14年前
投稿: 4
Topic starter  

ryoさん、仲澤@失業者さん、レスありがとうございます。

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

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

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


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

リストボックスは子ウィンドウで作ってください。
アクティブは、メインダイアログで受けます。

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

で、どうしょうか?


返信引用
show
 show
(@show)
ゲスト
結合: 14年前
投稿: 4
Topic starter  

ryoさん、リストボックスを子ウィンドウというのは、どういう意味でしょうか?

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

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

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

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


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

あれっ?WM_ACTIVATEはともかくWM_NCACTIVATEはWS_BORDERスタイルが
付いていれば必ず来ると思っていました。変ですねぇ、う~む(vv;)。


返信引用
デゴルガン
 デゴルガン
(@デゴルガン)
ゲスト
結合: 16年前
投稿: 20
 

リストボックスはWS_CHILDではなくWS_POPUPで作るといいのでは?
ドロップダウンしたときにダイアログからはみ出る場合も対処できますし。
WM_ACTIVATEが受け取れるかどうかは分かりませんが。


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

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


返信引用
show
 show
(@show)
ゲスト
結合: 14年前
投稿: 4
Topic starter  

デゴルガンさんへ

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

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

ryoさんへ

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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