コンボボックスに水平スクロールバーを追加するには?

解決


TK  2008-04-16 22:52:54  No: 68035

WinXP VC2005を使用しています。

CComboBoxの派生クラスを使用して、Createの引数に、
WS_VSCROLL|WS_HSCROLL  を入れています。

垂直スクロールバーは出るのですが、水平スクロールバーが出ません。AddStringで長い文字列を入れると横にはみ出して見えません。
どのようにしたら、水平スクロールバーが出るのでしょうか?

また、上記ができない場合、
リストに入る文字列のピクセルの最大幅をCreateのRECTの引数に入れようと思うのですが、
CComboBoxからGetDCできないため、GetTextExtentが使えません。
どのようにしたら、リストにある最大幅(最大ピクセル)を取得し、適切なCComboBoxをCreateできるのでしょうか?

すみませんが、ご教授願います。


  2008-04-16 23:10:46  No: 68036

WS_HSCROLLは必須でCreateした後に
SendMessage( hCmbBox, CB_SETHORIZONTALEXTENT, 400, 0 );
でどうでしょう。


TK  2008-04-16 23:41:32  No: 68037

とさまありがとうございます。
必須なのですが。。SendMessageするなら、GetTextExtentしてリストにある文字列の最大ピクセルをCreateするときに設定したいのですが、CComboBoxでGetDCできないです。  リストにある文字列の最大長をCreate時のRECTに入れてあげるうまい方法はないでしょうか?

ご教授お願いします。


subaru  2008-04-17 09:10:10  No: 68038

メモリDCを作成してコンボボックスと同じフォントを選択してやれば
とりあえず幅は計れませんかね。


そだ  2008-04-17 21:15:29  No: 68039

リスト内で一番長い文字の文字数を数えておいて、
テキストボックスのフォントをGetFontで取得して文字幅取得し
先ほどの文字数の積とって最大横幅とするとか。

メモリDCに書くのもいいけど
幅計るのに更新領域取得できたっけ?
1pxずつ見ていくのはつらそう。


subaru  2008-04-17 22:51:26  No: 68040

>メモリDCに書くのもいいけど
>幅計るのに更新領域取得できたっけ?
>1pxずつ見ていくのはつらそう。

メモリDCに「書く」のではなく、フォントの選択のみを行います。
リスト内の一番長い文字列を使用してCDC::GetTextExtentで測るって意味です。


TK  2008-04-18 00:57:10  No: 68041

解決しました。
ドロップダウンリストにある文字列を1つ1つGetTextExtentで測って、
一番長いサイズをRECTで渡してあげるようにしました。
みなさま、大変ありがとうございました。


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

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






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