ドロップダウンのコンボボックスの振舞い – プログラミング – Home

ドロップダウンのコンボボックスの振舞い
 
通知
すべてクリア

[解決済] ドロップダウンのコンボボックスの振舞い

固定ページ 1 / 2

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

コンボボックスのリストの項目は選択(入力)の履歴を表示していました
次回起動時は履歴はレジストリやファイルから取得させます
リストの項目を一切持っていない状態というのは一番最初しかなく今まで気づいてなか
ったんですけど,
リストの項目を一切持っていない状態での振舞いがなにかおかしかったのです

まずCComboBoxを以下の感じでCreateします
DWORD dwStyle
=WS_VISIBLE|WS_CHILD|WS_CLIPSIBLINGS|WS_TABSTOP|CBS_HASSTRINGS|CBS_AUT
OHSCROLL|CBS_DROPDOWN;

m_combo.Create( dwStyle,CRect(10,10,100,150),this,0x1234 );

でリストを一切追加しない状態(AddStringをしない)時に▼ボタンを押すとリストが表示
されません
でも,ダイアログ上で貼り付けたコンボボックスはリストを一切追加しない状態
(AddStringをしない)時に▼ボタンを押すとリストが表示されます
ダイアログ上で貼り付けたコンボボックスと同じ振舞いにしたいのですけど,いったい何
が足りないのでしょうか?

スタイルが違うのかと思いダイアログ上で貼り付けたコンボボックスからGetWindowLong
等でスタイルとスタイルExを取得して,そのスタイルを利用してCreateExで作成したとき
もリストが表示されませんでした…

気になったのは▼ボタンを押した後,おそらくリストが表示されているのではないかと思
われる領域にあるコントロールがクリック
できなくなっています
リストは表示されているけど見えていないかのような状態?な感じです

VS9 MFC WinXP,WinVistaです
よろしくおねがいします


引用未解決
トピックタグ
えーと
 えーと
(@えーと)
ゲスト
結合: 19年前
投稿: 54
 

m_combo.Create( dwStyle,CRect(10,10,100,150),this,0x1234 );

だと、高さが40しかないので、リスト部分がほぼない状態だと思います。

リソースエディタだと、コンボボックスは幅のみ変更でき
クリックするとリストの高さを調整できるようになっています。

コンボボックスのリストを表示しないときの高さは固定なので
コンボボックスを作成するときは、リストの高さを含めて指定する必要が
あったかと思います。

なので、150の値を大きくしてみてください。


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

えーとさん,どうもありがとうございます

CRectのコンストラクタだと
CRect( 左,上,右,下 )だったと思いますけど,
一応,150の値を大きくしてみても変わりません
更にCRect( CPoint(10,10),CSize(100,150) )でも変わりません

ちなみに貼り付けたコンボボックスのサイズを取得(GetDroppedControlRect)して
その取得したRectの位置にMoveWindowしても症状は改善されませんでした

ただ,リストの項目が1つ以上あると正しい感じになります...


返信引用
えーと
 えーと
(@えーと)
ゲスト
結合: 19年前
投稿: 54
 

>ちなみに貼り付けたコンボボックスのサイズを取得(GetDroppedControlRect)して
>その取得したRectの位置にMoveWindowしても症状は改善されませんでした

私もコンボボックスを動的に作っても、いつも項目は1つ以上追加してました
ものですから。。。

http://www.mulveyfamily.com/~katy/VisualC/Code/cbresize.html
ここにドロップダウンリストの高さを調整すうサンプルがあります。

とりあえず、項目を追加しない場合はこれを呼び出してみて下さい。

何か別の手段があればまた報告します。


返信引用
えーと
 えーと
(@えーと)
ゲスト
結合: 19年前
投稿: 54
 

hiroccoさん

ウィザードでダイアログベースで作り、
1.ダイアログにCComboBoxのメンバm_comboを追加
2.OnInitDialogでhiroccoさんの載せた部分を追加
3.OnDestroyで
m_combo.DestroyWindow()を追加

で、項目なしで行いましたが問題ないようです。
開発環境,VS2010
OS:XP

あと、先程の大きさの件は150を50と勘違いしていました。
すみません。

なので、状態が発生しているプロジェクトの形式や追加した
イベント関数部分などを報告してもらうと良いかもしれません。


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

ウィザードでダイアログベースで作り、
1.ダイアログのヘッダファイルにCComboBox型のメンバm_comboを記述で追加
2.OnInitDialogで
DWORD dwStyle=WS_VISIBLE|WS_CHILD|WS_CLIPSIBLINGS|
WS_TABSTOP|CBS_HASSTRINGS|CBS_AUTOHSCROLL|CBS_DROPDOWN;

m_combo.Create( dwStyle,CRect(10,10,100,150),this,0x1234 );

雛形からの改造は以上で試しました

3.OnDestroyは割愛します

えーとさんが試された状況とほぼ同じかと…

開発環境,VS2010
OS:XP

開発環境,VS2008
OS:Vista
で試しましたがこちらではどちらもダメな感じです

気になるところなんですが,
大き目のリストを予定してCreateしたコンボボックスの▼を押すと
予定していた領域の場所にある別のコントロールをクリックすることができなくなりま

ひょっとしたらリストは出てるけど描画がうまくいっていない?
なんて気もします


返信引用
えーと
 えーと
(@えーと)
ゲスト
結合: 19年前
投稿: 54
 

ひょっとして視覚効果を使用していませんか?

試しに動的作成ではなく、リソースにコンボを貼り付けて項目なしの
状態にしてみて下さい。
これでリストが表示されていない場合なら、これが原因です。

視覚効果の中に、「コンボボックスをスライドして開く」の項目が
あり、これを有効にしてしまうと発生します。

1個でも項目があれば問題ありませんが、項目がない場合
hiroccoさんが言われる症状が発生します。

これを解消するにはCComboBoxを派生し、CBN_DROPDOWNメッセージを処理してください。
void CComboBoxXXX::OnCbnDropdown()
{
if( GetCount() == 0 ){
COMBOBOXINFO info;
info.cbSize = sizeof( info );
GetComboBoxInfo( &info );
::SetWindowPos( info.hwndList, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE |
SWP_NOSIZE | SWP_SHOWWINDOW | SWP_DRAWFRAME);
}
}

あれこれネットで検索している内に、FormアプリでFormをTopMostにしていると
リストが隠れるとあり、これが原因かな?と思いあれこれ調べていくと
視覚効果に辿りつきました。
OS側のバグと言えばバグですね。
なので、項目がないときに、無理やり表示し直しするようにしました。

正確にはこの効果が有効な時だけ行えばよいのでその処理を入れれば
良いと思います。

視覚効果の状態を取得するAPIは知りませんが、レジストリから判定できるので
以下のサイトを見て下さい。
http://bonsansan.blog93.fc2.com/?m&no=19

これ以外なら私にはもうわかりません。


返信引用
えーと
 えーと
(@えーと)
ゲスト
結合: 19年前
投稿: 54
 

補足です。
これは「ドロップダウンリスト」では起こりません。
「ドロップダウン」の時だけのようです。

※リソースエディタの「ダイアログのテスト」で確認。


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

スタイルにWS_VSCROLLがなかったということに気づきました
WS_VSCROLLを足してCreateでリソースエディタで追加したコンボボックスと同じ振る舞
いになりました

リソースエディタで追加したコンボボックスのプロパティVertical ScrollbarをFalse
にすると
WS_VSCROLLを足さないでCreateしたコンボボックスと同じ振る舞いになりました

コンボボックスのスタイルをGetWindowLong等で取得しにいくと
いづれののコンボボックスWS_VSCROLLがスタイルに含まれていません...
デフォルトはWS_VSCROLLが必要ないのかと思ってしまいいました

「Vertical ScrollbarプロパティをTrueに設定する」と「WS_VSCROLLを足して
Create」は完全ではないでしょうけど同義なのかと思いました

ちなみに視覚効果は使用していません
ただ,あえてのコンボボックスVertical ScrollbarプロパティがFalseの場合でのリス
トの項目が存在しない場合は
▼ボタンを押した後の振舞いはおかしいものです
リストはおそらくドロップダウンしていますが描画されていないという感じです
これはバグなのか使い方が悪いのかわからないままですが
一応,今回の原因の要素がわかったので解決とします

でも,ドロップダウンしていますが描画されていないという感じってバグっぽい気もする
んですけどね...

いろいろ,ありがとうございます


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

おっと,カイケツです


返信引用
えーと
 えーと
(@えーと)
ゲスト
結合: 19年前
投稿: 54
 

hiroccoさん

解決出来て何よりです。
ただ、こちらはhiroccoさんの提示していたソース(WS_VSCROLLなし)で
問題なく表示されているので、不思議です。

WS_VSCROLLを付けておかないと、動かす環境ではこのような症状
が起こるとを言うことが判ったのでこちらも、注意したいと思います。


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

えーとさん,どうもありがとうございます

ちなみに動的作成ではなく,リソースにコンボを貼り付けて,プロパティウィンドウ
のVertical ScrollbarのプロパティをFalseにした時ってそちらではどういう感じにな
りますか?
問題ない感じですか?

問題ない感じだとすると何か環境が違うのでしょうかねぇ
こちらでは違うVisualStudioと違うOSと違うPCで同じようになっていたのですがwww


返信引用
えーと
 えーと
(@えーと)
ゲスト
結合: 19年前
投稿: 54
 

>ちなみに動的作成ではなく,リソースにコンボを貼り付けて,プロパティウィンドウ
>のVertical ScrollbarのプロパティをFalseにした時ってそちらではどういう感じに

>りますか?
>問題ない感じですか?

こちらでは、視覚効果のコンボの項目が無効な時は
動的生成と、リソースエディタ上でこの問題が発生することはありません。
hiroccoさんの言うVertical ScrollbarのTrue/False関係なくです。

有効な時でしか確認できないですが、
リストは表示しているけど、背景消去なしで透過したみたいに表示されている感じです
ね。

>こちらでは違うVisualStudioと違うOSと違うPCで同じようになっていたのですがwww
どこかに、影響するものがあるのでしょうね。きっと。
不思議です。


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

> ひょっとして視覚効果を使用していませんか?
>
これって,こちらではデフォルトです
つまり使用してるってことですねwww
すみません,ウソをついてたようです

作ったアプリケーションを使うユーザーのPCの設定に影響されちゃうってことですね

こちらの設定状態は
「コンピュータに応じて最適なものを自動的に選択する」になっていて,
チェックボックスは全てチェックが入っている状態でした…
おそらく,これかと思います
すべてチェックを入れていただければ再現するかと思います


返信引用
えーと
 えーと
(@えーと)
ゲスト
結合: 19年前
投稿: 54
 

>すべてチェックを入れていただければ再現するかと思います

返事が遅くなりまして申し訳ありません。
# テストする時間がありませんでした。
同じ設定(視覚効果全てON)で試みましたが、Vertical Scrollbar
をON,WS_VSCROLLを付けても本件の問題が発生します。

>つまり使用してるってことですねwww
視覚効果が原因であるのは確かなようですね。
Vertical ScrollbarがTrueもしくはWS_VSCROLLを付けることに
より解決できればすっきりするのですが...


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

返信する

投稿者名

投稿者メールアドレス

タイトル *

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