ドロップダウンのコンボボックスの振舞い

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

まず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です
よろしくおねがいします

えーと 2011/05/13(金) 13:15:16
m_combo.Create( dwStyle,CRect(10,10,100,150),this,0x1234 );

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

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

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

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

hirocco 2011/05/13(金) 13:28:26
えーとさん,どうもありがとうございます

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

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

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

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

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

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

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

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

えーと 2011/05/13(金) 14:02:17
hiroccoさん

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

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

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

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

hirocco 2011/05/13(金) 14:15:56
ウィザードでダイアログベースで作り、
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したコンボボックスの▼を押すと
予定していた領域の場所にある別のコントロールをクリックすることができなくなりま
す
ひょっとしたらリストは出てるけど描画がうまくいっていない?
なんて気もします

えーと 2011/05/13(金) 15:48:49
ひょっとして視覚効果を使用していませんか?

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

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

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

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

えーと 2011/05/13(金) 15:53:57
補足です。
これは「ドロップダウンリスト」では起こりません。
「ドロップダウン」の時だけのようです。

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

hirocco 2011/05/13(金) 16:17:45
スタイルに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 2011/05/13(金) 16:19:15
[[解決]]
おっと,カイケツです

えーと 2011/05/13(金) 16:42:12
hiroccoさん

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


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

hirocco 2011/05/13(金) 16:58:48
えーとさん,どうもありがとうございます

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

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

えーと 2011/05/13(金) 17:52:25
>ちなみに動的作成ではなく,リソースにコンボを貼り付けて,プロパティウィンドウ
>の"Vertical Scrollbar"のプロパティをFalseにした時ってそちらではどういう感じに>りますか?
>問題ない感じですか?

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

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

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

hirocco 2011/05/13(金) 18:09:08
> ひょっとして視覚効果を使用していませんか?
> 
これって,こちらではデフォルトです
つまり使用してるってことですねwww
すみません,ウソをついてたようです

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

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

えーと 2011/05/16(月) 10:56:08
>すべてチェックを入れていただければ再現するかと思います

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

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

hirocco 2011/05/16(月) 11:12:06
ユーザでの視覚効果をオールONにしてもらうか,
問題がおきないコンボを自作もしくは派生させるか,
はたまた思い切って気にしないかってところでしょうかねぇ
実際,今回の場合は,リストの項目が一つも無いというのは一番最初の
利用時のみというかなり限定された状況だけですから,
リストの項目が一つも無い時だけコンボぶったエディットに切替えるかっていうのもあ
りなのかな?ん〜...

ちなみにこの場合のジャンルはバグなのか,それとも
リストの項目が一つも無いという使い方がダメなのでしょうかねぇ

えーとさん,色々ありがとうございました

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