MS VC6.0 not MFC + XP SP2 です。
適当なウインドウを作りそのWM_CREATEハンドラで
以下の分を実行します。
hCmbBox = CreateWindow( COMBOBOX, コンボ,
WS_CHILD|WS_BORDER|WS_VISIBLE|WS_VSCROLL|WS_HSCROLL|CBS_DROPDOWN|
CBS_DISABLENOSCROLL,
0, 0, 80, 400, hWnd, (HMENU)100, hInst, NULL );
SendMessage( hCmbBox, CB_ADDSTRING, 0, (LPARAM)テスト0 );
SendMessage( hCmbBox, CB_ADDSTRING, 0, (LPARAM)テスト1 );
SendMessage( hCmbBox, CB_ADDSTRING, 0, (LPARAM)テスト2 );
SendMessage( hCmbBox, CB_ADDSTRING, 0, (LPARAM)テスト3 );
SendMessage( hCmbBox, CB_ADDSTRING, 0, (LPARAM)テスト4 );
SendMessage( hCmbBox, CB_ADDSTRING, 0, (LPARAM)テスト5長くするためのダラダラ文
ダラダラダラダラダラダラダラダラ );
SendMessage( hCmbBox, CB_SETDROPPEDWIDTH, 160, 0 );
SendMessage( hCmbBox, CB_SETHORIZONTALEXTENT, 600, 0 );
上記の様にした場合、ドロップダウンリストの高さが、
hCmbBoxの高さは十分に大きくしてあるにもかかわらず
横スクロールバーの分足らなくて、全ての項目を表示しきれません。
これを正常に全ての項目を表示しきれるようにする方法
または、ドロップダウンリストの高さを直接制御する方法
を、ご存知の方は教えてください。
よろしくお願いします。
ドロップダウンのメッセージを拾って、MoveWindowするみたい。
VBの例を見つけたけど参考になるかな。
http://www.bcap.co.jp/hanafusa/VBHLP/Combodl.htm
↑の方針で試してみたけど、ちょこちょこっとやった範囲ではできなかった。
じっくり取り組む時間は今ないので、他の人にバトンタッチさせてください。
今夜とか週末とかの時間があるときに、未解決だったら再挑戦してみます。
# 役に立たないと思うけど、バトン↓
GetComboBoxInfo
CB_SETMINVISIBLE
ComboBox_SetMinVisible
CB_SETITEMHEIGHT では駄目ですか?
CB_SETITEMHEIGHT はリストの項目の高さを変えるだけなんで関係なさそうですね。
たいちうさんが挙げてくれた ComboBox_SetMinVisible(CB_SETMINVISIBLEのマクロ) で出
来そうな気がしたんですが、何故か失敗します…
MSDNライブラリの通りに manifest ファイルも作ってみたんですが。
私もバトンタッチさせてもらいます(汗)
http://msdn2.microsoft.com/en-us/library/bb775933(VS.85).aspx
age
縦のサイズですよね?
このスタイルを付ければ良さそうな?→CBS_NOINTEGRALHEIGHT
外してたらごめんなさいね。
CBN_DROPDOWN かコンボボックスを変更した際に、GetComboBoxInfo()でリストのハンド
ルを取ってMoveWindowでしょうか。
CB_SETMINVISIBLEはセットしなくても、デフォルトで30とMSDNにありますね。
でも、マニフェスト入れて_WIN32_WINNTを設定してもダメですね。謎です。
Kさん、ありがとうございます、、しかし
GetComboBoxInfo()もCB_GETCOMBOBOXINFOも
MSVC 6.0には、定義がありません。
どなたか、CB_GETCOMBOBOXINFOの具体的な数値を
お教え下さい。
よろしくお願いします。
com-aさんが書いてますが CBS_DISABLENOSCROLL の代わりに CBS_NOINTEGRALHEIGHT を追
加するのでは駄目?
oopsさん、、駄目です、、確認しました、、
> CBS_NOINTEGRALHEIGHT を追加するのでは駄目?
↑は、リストボックスの行単位での半端なサイズを制御するものでしょう?
例:リストボックスのサイズが10.5行分のサイズの時にサイズを10行分に
規制するかどうか、、
> どなたか、CB_GETCOMBOBOXINFOの具体的な数値を
> お教え下さい。
検索すると0x0164と解ったのですが、、
*************************
typedef struct tagCOMBOBOXINFO {
DWORD cbSize;
RECT rcItem;
RECT rcButton;
DWORD stateButton;
HWND hwndCombo;
HWND hwndItem;
HWND hwndList;
} COMBOBOXINFO, *PCOMBOBOXINFO, *LPCOMBOBOXINFO;
COMBOBOXINFO cbi;
Ret = SendMessage( hCmbBox, 0x0164, 0, (LPARAM)&cbi );
*************************
これの戻り値が0で、cbiの値が変化しません。
何か、スタイル等で設定する必要が有るのでしょうか?
ご存知の方は教えてください。
よろしくお願いします。
>↑は、リストボックスの行単位での半端なサイズを制御するものでしょう?
>例:リストボックスのサイズが10.5行分のサイズの時にサイズを10行分に
>規制するかどうか、、
最後の項目の下に余白を持っときたいってこと?
cbi.cbSize = sizeof(COMBOBOXINFO); としてから CB_GETCOMBOBOXINFO を送ればできる
はず。
ただ cbi.hwndList が MoveWindow でサイズを変えれるかは微妙やと思うけど。
>ただ cbi.hwndList が MoveWindow でサイズを変えれるかは微妙やと思うけど。
発言者責任で試してみましたが、ダメでした。。。
横スクロールバーの有無にかかわらず、アイテム数で強制的に高さ制限されてしまうよ
うです。
高さを小さくすることはできるんですけどね。
VC2005とかのプロパティウィンドウだと、WS_HSCROLLは設定できないようになっていま
す。
コンボボックスで横スクロールバーは使うなというMSのお達しかもしれません。
> cbi.cbSize = sizeof(COMBOBOXINFO); としてから CB_GETCOMBOBOXINFO を送ればでき
るはず。
構造体のサイズが、きっちりと指定されていないと動かなかったのですね、、
CBN_DROPDOWNのタイミングではまだドロップダウンリストが表示されていない
ようで、この時点でサイズを変更しても、その後の実際の表示時に、
内部で再計算されるようでした、、、
仕方が無いので、ドロップダウンリストのウインドウプロシージャをフックして、
何とかしようとして、色々確認すると、
WM_MOVEとWM_SIZEやWM_NCCALCSIZEが何度か来た後に再計算されている様なのですが
特に怪しいのがWM_NCCALCSIZEで、試しにウインドウプロシージャの戻り値を真にして
処理されないようにすると縦・横とも、スクロールバーが表示されなくなりました。
実際にどのメッセージのタイミングで再計算後の再変更をすると良いのか
解りません。
「ちょっとかっこ悪いし、正攻法ではないですが、ドロップダウンのイベントの時にタイ
マーをかけておいて、そのタイマーのイベントで位置を変えるという方法で回避しまし
た。」
検索すると↑の様な方法も在るようです。
もう少し、まともな方法をご存知の方は教えてください。
よろしくお願いします。
cbi.hwndList をサブクラス化して、WM_SIZE でリストの大きさを変更すると高さは再計
算されないみたいやね。
ただ高さが小さくてもスクロールバーが表示されないって欠点はあるけど。