コンボボックスの初期値の設定とドロップダウンリストに適切な縦方向サイズを設定するには?


TK  2008-04-18 01:13:16  No: 68060

WinXP VS2005を使用しています。

CComboBoxの派生クラスを使用してコンボボックスを作成しています。
1.テキスト部分に初期値を入力するには?
  起動時に、テキスト部分に初期値が入っている状態にしたいのですが、
  SetWindoTextだと何も入力されません。
  この初期値は、ドロップダウンリストの中にある1つなので、
  初期値がドロップダウンリストの文字列と一致するIndexをとってあげて、
  SetCurSelをすればOKなのですが、もっと簡単にできるやり方は無いのでしょうか?

2.ドロップダウンリストの適切なサイズを設定する方法は?
  CComboBoxの派生クラスをコンボボックスのテキスト領域のRECT情報でMoveWindowさせると、
  ドロップダウンリストが表示されなくなってしまいます。
  そのRECT情報のDOWNに適当な値を足してあげると、ドロップダウンリストを表示することができます。
  かつ、余分なRECT領域があれば、CComboBoxの内部で適切なサイズを返してくれて、きれいなドロップダウンリストを表示することができます。
  ただ、RECT情報のDOWNに適当な値を足してあげているので、何か納得がいかないのですが、
  いい方法はないでしょうか?

同じ箇所に2つ質問をしてしまい、すみません。
みなさま、ご教授お願いいたします。


  2008-04-18 06:00:41  No: 68061

1.だけ
m_combo.SelectString(0,"XXXXXXX"); // XXXXXXXは選択したい文字列


  2008-04-18 10:20:43  No: 68062

2.は何が問題か良くわかりません。

リストを展開したときの高さの上限の値を設定しておけばよいだけなので
どういう動作が納得できる物なのかが不明です。

http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200804/08040015.txt
でも思ったのですが

>どのようにしたら、水平スクロールバーが出るのでしょうか?
に回答したのに、結局やりたい事は違っていたようです。

作成したコンボをなぜMoveWindowする必要があるのかなども
書いてみませんか?


TK  2008-04-18 19:53:35  No: 68063

とさまありがとうございます。
そうですね、説明不足で失礼しました。

>作成したコンボをなぜMoveWindowする必要があるのかなども
動的に配置が変わるように作りたいため、MoveWindowしています。
MoveWindowするときに、ComboBoxのテキスト領域のRECTを指定すると、
ドロップダウンリストが表示されなくなってしまいます。

>リストを展開したときの高さの上限の値を設定しておけばよいだけなので
これは、どのように計算するのでしょうか?
リストの中身も動的に変わるので、上限の値を計算しないといけない気がします。
例えば、リストの中身の文字列に対して、GetTextExtentして文字列の高さのピクセル数を取得し、且つリストのアイテム間にマージンを付加する・・・
とすると、計算が複雑になってしまいます。
このような場合、MoveWindowのRECT.down情報にプラス10000とか、適当な大きい値を設定すると、CComboBoxは適切なリストサイズにしてくれて、きれいにドロップダウンリストが表示できますが、適当な値をプラスするという処理で本当に良いのかどうか分かりません。

他に良い方法があれば、教えていただきたいのですが。
よろしくお願いいたします。


TK  2008-04-18 20:03:37  No: 68064

>m_combo.SelectString(0,"XXXXXXX"); // XXXXXXXは選択したい文字列
これでも初期値は表示されませんでした。  何かほかの設定が影響するのでしょうか?Createの引数は、下記なのですが。。。
<WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_HSCROLL|CBS_DROPDOWNLIST>


TK  2008-04-18 20:20:11  No: 68065

1に関してですが、AddStringする前に、SelectStringしていました。
MSDNをよく見てなかったです。すみません。。
1に関しては解決です。


  2008-04-19 09:21:00  No: 68066

申し訳ありません。
2.については適切な回答を持っていません。

SendMessageで解決できる問題ですか?
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200803/08030073.txt


  2008-04-19 09:44:56  No: 68067

えと、マージンとかの話ではなくて「リストの高さ」は
オーバーしていてもアイテム数で自動できっちり
押さえてくれますよね?

自分がどの程度の高さが欲しいのかを上限とすれば
よいのではないでしょうか?

と 2008/04/19(土) 00:21:00 

SendMessage(CB_SETITEMHEIGHT,500,0);
とかで制御できるのを確認してみてください。

MFCの関数だとうまく出来ませんでしたので
調べてみてください。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加