コンボボックスはエディットボックスとリストボックスを組み合わせたコントロール
ユーザーにアイテム選択をさせるために使う
標準ではエディットボックス脇のボタンを押すことによってリストが表示されるドロップダウンタイプになっている
[edit]
コンボボックスのスタイル †

RADで設定できるスタイルについて
無効(使用不可)~タブストップ
他と同じなので省略
タイプ
コンボボックスの種類
ドロップダウン、ドロップダウンリスト、デフォルトの3種類
デフォルトはエディットボックスにリストボックス付けただけの代物。別々に作った方が良いと思う
ドロップダウンはコントロール右側の▼を押すとリストボックスが表示されるタイプ。空白部分はエディットボックスで編集可能
ドロップダウンリストはドロップダウンと大体同じだがエディットボックス部分は編集できない
オーナー描画~文字列あり
加筆plz
ソート
コンボボックスに追加された文字列が自動的にソートされる
これをチェックして無い場合は終端に文字列が追加される
垂直スクロールバー
コンボボックスのウィンドウサイズ内でリストボックスが表示しきれなくなった時にスクロールバーを出して対応する
チェックしておかないと一定数以上のアイテムを表示できない
水平オートスクロール
ボタン脇のエディットボックスを編集した時に文字列があふれたらスクロールを行なう
スクロールバーを表示
リストボックスに常にスクロールバーが表示される
大文字変換
エディットボックスに入力された文字を大文字にする
小文字変換
エディツトボックスに入力された文字を小文字にする

[edit]
操作サンプル †

以下の例では特に記述が無ければhComboBoxはコンボボックスのハンドルを示す

[edit]
文字列を追加する †
SendMessage(hComboBox,CB_ADDSTRING,0,buf)

bufは追加したい文字列のポインタ
文字列は終端に追加される

[edit]
指定位置に文字列を追加する †
SendMessage(hComboBox,CB_INSERTSTRING,index,buf)

indexにアイテムを追加する位置を示すインデックスを指定します
indexの位置に既にアイテムがある場合は既にあったアイテムが下にずれます
bufは追加したい文字列のポインタ

ウィンドウスタイルのソートオプションを無視します

[edit]
アイテムが持つ文字列の長さを取得 †
return = SendMessage(hComboBox,CB_GETLBTEXTLEN,index,0)

indexに文字列の長さを取得するアイテムのインデックスを指定する
リストボックスの一番上のアイテムがindex=0で、一番下がindex=アイテム数-1
returnに文字数が入る

[edit]
アイテムが持つ文字列を取得 †
return = SendMessage(hComboBox,CB_GETLBTEXT,index,buf)

indexに文字列を取得するアイテムのインデックスを指定する
bufに取得した文字列を入れるバッファを指定する
returnに取得した文字数が入る

システムはバッファの大きさを見ていませんのでバッファが足りないと即座にバッファオーバーランします
CB_GETLBTEXTLENで文字数を取得して十分な長さのバッファを確保しておくか
文字列の長さを一定値以下に抑える工夫が必要です

[edit]
コンボボックスが持つアイテム数を取得 †
return = SendMessage(hComboBox,CB_GETCOUNT,0,0)

returnにコンボボックスが持つアイテム数が入ります

[edit]
アイテムを削除する †
return = SendMessage(hComboBox,CB_DELETESTRING,index,0)

indexに削除するアイテムのインデックスを指定する
returnに削除後にコンボボックスが持っているアイテム数が入ります

[edit]
アイテムを全削除する †
SendMessage(hComboBox,CB_RESETCONTENT,0,0)

アイテムを全て削除します

[edit]
文字列を検索する †
return = SendMessage(hComboBox,CB_FINDSTRING,index,buf)

indexは検索を開始するアイテムのインデックスを指定する
indexで指定したアイテムを含めてリストボックスの下に向けてbufで指定した文字列を検索していく
returnに見つけたアイテムのインデックスが入る。見つからなかった場合はCB_ERRを返す

文字列は完全一致しないと駄目

[edit]
アイテムを選択する †
SendMessage(hComboBox,CB_SETCURSEL,index,0)

indexは選択するアイテムのインデックス

[edit]
特定の文字列を持つアイテムを選択する †

要はCB_FINDSTRINGとCB_SETCURSELの複合
return = SendMessage(hComboBox,CB_SELECTSTRING,index,buf)

indexは検索を開始するアイテムのインデックスを指定する
indexで指定したアイテムを含めてリストボックスの下に向けてbufで指定した文字列を検索し、初めに見つけたアイテムを選択する
returnに見つけたアイテムのインデックスが入る。見つからなかった場合はCB_ERRを返す

やはり文字列は完全一致

[edit]
選択中のアイテムの位置を取得する †
return = SendMessage(hComboBox,CB_GETCURSEL,0,0)

returnに選択されているアイテムのインデックスが入る
選択されていなければCB_ERRが入っている

[edit]
リストボックスを開く/閉じる †
SendMessage(hComboBox,CB_SHOWDROPDOWN,show,0)

show=1でリストボックスを表示させる。show=0で閉じる

[edit]
コンボボックスが持つエディットボックスを操作する †
hEdit = GetWindow(hComboBox,GW_CHILD)

hEditにコンボボックスが持つエディットボックスのハンドルが入る
普通のエディットボックスと同様に操作できる

またコンボボックスに対してCB_*EDIT*(*は一文字以上のアルファベット)形式のメッセージを送ることでもある程度操作できる

[edit]
ファイルやフォルダの一覧を得る †
SendMessage(hComboBox,CB_DIR,attrs,path)

pathで検索パス、attrsで列挙するファイルやフォルダの属性を指定する
検索パスは円記号で終わっては駄目。円記号で終わる場合は*(複数文字ワイルドカード)をつける

例(フォルダのみ列挙)
SendMessage(hComboBox,CB_DIR,DDL_EXCLUSIVE Or DDL_DIRECTORY,"C:\WINDOWS\*")
ListBox_Dir(hList,DDL_EXCLUSIVE Or DDL_DIRECTORY,"C:\WINDOWS\*")

例2(文字「a」を含むフォルダを列挙)
SendMessage(hComboBox,CB_DIR,DDL_EXCLUSIVE Or DDL_DIRECTORY,"C:\WINDOWS\*a*")

フラグの値は以下
/*
*_DIRのフラグ
指定したフラグのどれかが該当するファイルを列挙する

/

Const DDL_READWRITE = &H0000
Const DDL_READONLY = &H0001
Const DDL_HIDDEN = &H0002
Const DDL_SYSTEM = &H0004
Const DDL_DIRECTORY = &H0010
Const DDL_ARCHIVE = &H0020
Const DDL_POSTMSGS = &H2000
Const DDL_DRIVES = &H4000

/*
*_DIRの排他フラグ
これを指定すると残りのフラグが全て該当したファイルのみ列挙する

/

Const DDL_EXCLUSIVE = &H8000