ページ 11

コンボボックスについて

Posted: 2010年6月21日(月) 10:15
by 爺プログラマー
複数のアイテム(項目)が切れないように高さを設定しているのですが・・・

CreateWindowEx(0, "COMBOBOX", "",WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,
X, Y, X_Size, CBS_NOINTEGRALHEIGHT,
hWnd, (HMENU)IDC_COMBOBOX, h_Inst, NULL);

上記のように記述すると、全てのリストが表示されます。

しかし、下記のようにすると、リストが開きません。

CreateWindowEx(0, "COMBOBOX", "",WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST|CBS_NOINTEGRALHEIGHT,
X, Y, X_Size, 0,
hWnd, (HMENU)IDC_COMBOBOX, h_Inst, NULL);


CBS_NOINTEGRALHEIGHTはスタイルの指定のはずですが原因を教えてください。

Re:コンボボックスについて

Posted: 2010年6月21日(月) 10:26
by へろりくしょん
>CreateWindowEx(0, "COMBOBOX", "",WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST|CBS_NOINTEGRALHEIGHT,
X, Y, X_Size, 0,
hWnd, (HMENU)IDC_COMBOBOX, h_Inst, NULL);


第8引数が0になってますね。 これはウィンドウの高さです。 コンボボックスの場合は、リストを開いたときの総合的な高さになります。

また、CBS_NOINTEGRALHEIGHTの定義は
#define CBS_NOINTEGRALHEIGHT 0x0400Lとなっています。 リストの件数が何件かは知りませんが、おそらくは0x400Lという数値は、すべてのリストを表示するに十分な高さなのでしょう。

CreateWindowEx(0, "COMBOBOX", "",WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,
X, Y, X_Size, CBS_NOINTEGRALHEIGHT,
hWnd, (HMENU)IDC_COMBOBOX, h_Inst, NULL);

というコードでは、コンボボックスの高さに0x400Lと指定しています。

Re:コンボボックスについて

Posted: 2010年6月21日(月) 10:45
by 爺プログラマー
早速の回答ありがとうございます。
CBS_NOINTEGRALHEIGHTは機能指定ではなく単なる数値に過ぎなかったのですね?
でもCBS_NOINTEGRALHEIGHTはスタイル指定の項目に記述するはずですが今回の私の様にここに記述するのは一般的ではないとおいます。

逆にCBS_NOINTEGRALHEIGHTはスタイル指定の場所に記述するだけでは何の意味も持たないと考えますが?
間違っているでしょうか?
見解をお願いします。

Re:コンボボックスについて

Posted: 2010年6月21日(月) 11:14
by へろりくしょん
>CBS_NOINTEGRALHEIGHTは機能指定ではなく単なる数値に過ぎなかったのですね?

その数値を使い機能等を指定します。


>でもCBS_NOINTEGRALHEIGHTはスタイル指定の項目に記述するはずですが今回の私の様にここに記述するのは一般的ではないとおいます。

もちろんその通りです。 ですが、スタイル指定に0x400などと書いても、0x400というのがどんな機能だかスタイルだか解りませんね? だから、#define でわかりやすい名前を与えています。
可読性の問題です。



>逆にCBS_NOINTEGRALHEIGHTはスタイル指定の場所に記述するだけでは何の意味も持たないと考えますが?
>間違っているでしょうか?
>見解をお願いします。


とりあえず、

CreateWindowEx(0, "COMBOBOX", "",WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST|CBS_NOINTEGRALHEIGHT,
X, Y, X_Size, 1000,
hWnd, (HMENU)IDC_COMBOBOX, h_Inst, NULL);

と、

CreateWindowEx(0, "COMBOBOX", "",WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,
X, Y, X_Size, 1000,
hWnd, (HMENU)IDC_COMBOBOX, h_Inst, NULL);

とした場合の違いを見てみてください。
上記の違いは第4引数にCBS_NOINTEGRALHEIGHTを指定しているかしていないかの違いだけです。


追記:
何を言ってるんでしょうね私。 1000なんて数値がどこから出てきたのか自分でも謎です。
50あたりから100ぐらいまでの間を5刻みで少しずつ見ていってください。
CBS_NOINTEGRALHEIGHTを指定した場合としない場合の違いは一目瞭然です。 画像

Re:コンボボックスについて

Posted: 2010年6月21日(月) 11:58
by 爺プログラマー
丁寧にありがとうございます。
CBS_NOINTEGRALHEIGHTがある場合が行の半分でも表示されますが無ければ切り捨てられているようです。
やはり高さ指定が絶対的意味を持つようです。
とりあえず、デスクトップの縦の長さを指定しておきます。