コンボボックスのドロップダウンリストのサイズについて – プログラミング – Home

コンボボックスのドロップダウンリストの...
 
通知
すべてクリア

コンボボックスのドロップダウンリストのサイズについて

固定ページ 1 / 2

obott
 obott
(@obott)
ゲスト
結合: 17年前
投稿: 9
Topic starter  

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の高さは十分に大きくしてあるにもかかわらず
横スクロールバーの分足らなくて、全ての項目を表示しきれません。

これを正常に全ての項目を表示しきれるようにする方法
または、ドロップダウンリストの高さを直接制御する方法
を、ご存知の方は教えてください。

よろしくお願いします。


引用解決済
トピックタグ
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

ドロップダウンのメッセージを拾って、MoveWindowするみたい。
VBの例を見つけたけど参考になるかな。

http://www.bcap.co.jp/hanafusa/VBHLP/Combodl.htm


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

↑の方針で試してみたけど、ちょこちょこっとやった範囲ではできなかった。
じっくり取り組む時間は今ないので、他の人にバトンタッチさせてください。
今夜とか週末とかの時間があるときに、未解決だったら再挑戦してみます。

# 役に立たないと思うけど、バトン↓
GetComboBoxInfo
CB_SETMINVISIBLE
ComboBox_SetMinVisible


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

CB_SETITEMHEIGHT では駄目ですか?


返信引用
oops
 oops
(@oops)
ゲスト
結合: 17年前
投稿: 28
 

CB_SETITEMHEIGHT はリストの項目の高さを変えるだけなんで関係なさそうですね。

たいちうさんが挙げてくれた ComboBox_SetMinVisible(CB_SETMINVISIBLEのマクロ) で出
来そうな気がしたんですが、何故か失敗します…

MSDNライブラリの通りに manifest ファイルも作ってみたんですが。

私もバトンタッチさせてもらいます(汗)

http://msdn2.microsoft.com/en-us/library/bb775933(VS.85).aspx


返信引用
www
 www
(@www)
ゲスト
結合: 17年前
投稿: 1
 

age


返信引用
com-a
 com-a
(@com-a)
ゲスト
結合: 23年前
投稿: 11
 

縦のサイズですよね?
このスタイルを付ければ良さそうな?→CBS_NOINTEGRALHEIGHT

外してたらごめんなさいね。


返信引用
K
 K
(@K)
ゲスト
結合: 23年前
投稿: 98
 

CBN_DROPDOWN かコンボボックスを変更した際に、GetComboBoxInfo()でリストのハンド
ルを取ってMoveWindowでしょうか。

CB_SETMINVISIBLEはセットしなくても、デフォルトで30とMSDNにありますね。
でも、マニフェスト入れて_WIN32_WINNTを設定してもダメですね。謎です。


返信引用
obott
 obott
(@obott)
ゲスト
結合: 17年前
投稿: 9
Topic starter  

Kさん、ありがとうございます、、しかし
GetComboBoxInfo()もCB_GETCOMBOBOXINFOも
MSVC 6.0には、定義がありません。

どなたか、CB_GETCOMBOBOXINFOの具体的な数値を
お教え下さい。

よろしくお願いします。


返信引用
oops
 oops
(@oops)
ゲスト
結合: 17年前
投稿: 28
 

com-aさんが書いてますが CBS_DISABLENOSCROLL の代わりに CBS_NOINTEGRALHEIGHT を追
加するのでは駄目?


返信引用
obott
 obott
(@obott)
ゲスト
結合: 17年前
投稿: 9
Topic starter  

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の値が変化しません。
何か、スタイル等で設定する必要が有るのでしょうか?

ご存知の方は教えてください。

よろしくお願いします。


返信引用
oops
 oops
(@oops)
ゲスト
結合: 17年前
投稿: 28
 

>↑は、リストボックスの行単位での半端なサイズを制御するものでしょう?
>例:リストボックスのサイズが10.5行分のサイズの時にサイズを10行分に
>規制するかどうか、、
最後の項目の下に余白を持っときたいってこと?

cbi.cbSize = sizeof(COMBOBOXINFO); としてから CB_GETCOMBOBOXINFO を送ればできる
はず。

ただ cbi.hwndList が MoveWindow でサイズを変えれるかは微妙やと思うけど。


返信引用
K
 K
(@K)
ゲスト
結合: 23年前
投稿: 98
 

>ただ cbi.hwndList が MoveWindow でサイズを変えれるかは微妙やと思うけど。
発言者責任で試してみましたが、ダメでした。。。

横スクロールバーの有無にかかわらず、アイテム数で強制的に高さ制限されてしまうよ
うです。
高さを小さくすることはできるんですけどね。

VC2005とかのプロパティウィンドウだと、WS_HSCROLLは設定できないようになっていま
す。
コンボボックスで横スクロールバーは使うなというMSのお達しかもしれません。


返信引用
obott
 obott
(@obott)
ゲスト
結合: 17年前
投稿: 9
Topic starter  

> cbi.cbSize = sizeof(COMBOBOXINFO); としてから CB_GETCOMBOBOXINFO を送ればでき
るはず。

構造体のサイズが、きっちりと指定されていないと動かなかったのですね、、

CBN_DROPDOWNのタイミングではまだドロップダウンリストが表示されていない
ようで、この時点でサイズを変更しても、その後の実際の表示時に、
内部で再計算されるようでした、、、

仕方が無いので、ドロップダウンリストのウインドウプロシージャをフックして、
何とかしようとして、色々確認すると、
WM_MOVEとWM_SIZEやWM_NCCALCSIZEが何度か来た後に再計算されている様なのですが
特に怪しいのがWM_NCCALCSIZEで、試しにウインドウプロシージャの戻り値を真にして
処理されないようにすると縦・横とも、スクロールバーが表示されなくなりました。

実際にどのメッセージのタイミングで再計算後の再変更をすると良いのか
解りません。

「ちょっとかっこ悪いし、正攻法ではないですが、ドロップダウンのイベントの時にタイ
マーをかけておいて、そのタイマーのイベントで位置を変えるという方法で回避しまし
た。」
検索すると↑の様な方法も在るようです。

もう少し、まともな方法をご存知の方は教えてください。

よろしくお願いします。


返信引用
oops
 oops
(@oops)
ゲスト
結合: 17年前
投稿: 28
 

cbi.hwndList をサブクラス化して、WM_SIZE でリストの大きさを変更すると高さは再計
算されないみたいやね。

ただ高さが小さくてもスクロールバーが表示されないって欠点はあるけど。


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

返信する

投稿者名

投稿者メールアドレス

タイトル *

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