左の図ではレバーコントロールに「ボタン」と「コンボボックス」
が乗っています。コンボボックスのレバーを左右にドラッグすると
それぞれのコントロールの幅を変えることができます。また、「ボタン」
と「コンボボックス」の位置を反対にすることもできます。
「ボタン」「コンボボックス」などの文字だけを表示して
コントロール自体を隠すこともできます。
さらに、左の図のように各コントロールを1列ずつ表示させる
事も可能です。コントロールの大きさは自動的に調整されます。
親ウィンドウ(メインウィンドウ)の子供として、レバーコントロールが 作られます。レバーコントロールの子供として各コントロール類が作られます。 さて、ここでちょっと疑問がわきませんか?1.コモンコントロールの前準備 (commctrl.hのインクルード, Comctl32.libのリンク) 2.INITCOMMONCONTROLSEX構造体のdwICCメンバをICC_COOL_CLASSES に設定してInitCommonControlsEx関数を実行 3.ウィンドウクラスをREBARCLASSNAMEにしてレバーコントロールを作成(hRebar) 4.REBARINFO構造体を設定してhRebarにRB_SETBARINFOを送る 5.REBARBANDINFO構造体を設定してhRebarの子供としてコントロールを作る 6.hRebarにRB_INSERTBANDを送る 7.5,6を繰り返す
実際にユーザーが操作するのはレバーコントロールの子供であるボタンなどです。 これらのコントロール類が操作されたことをどうやって知れば良いのでしょうか。 普通は通知メッセージはその親に届きます。レバーコントロール上のボタンが 押されると通知メッセージはレバーコントロールのプロシージャに来るはずです。 レバーコントロールをサブクラス化しないとだめかな・・・と思いませんか。 実は、レバーコントロールでは子供から来た通知メッセージをそのままその親に 送ります。したがってコントロール類のイベントはメインウィンドウのプロシージャで 知ることが出きるのです。要するに孫のイベントを知ることができるわけです。 また、レバーコントロールが破棄される時それに乗っているすべての子供も 破棄されます。
では、少しずつ構造体などを解説します。
cbSizeはこの構造体の大きさです。typedef struct tagREBARINFO{ UINT cbSize; UINT fMask; HIMAGELIST himl; } REBARINFO, FAR *LPREBARINFO;
fMaskは現在のところRBIM_IMAGELIST しか設定できません。 イメージリストを使わない場合は0にします。
himlはイメージリストのハンドルです。使わない時はNULLにします。
レバーコントロールの特徴をセットするメッセージです。RB_SETBARINFO wParam = 0; lParam = (LPARAM)(LPREBARINFO) lprbi;
長い構造体です。typedef struct tagREBARBANDINFO{ UINT cbSize; UINT fMask; UINT fStyle; COLORREF clrFore; COLORREF clrBack; LPTSTR lpText; UINT cch; int iImage; HWND hwndChild; UINT cxMinChild; UINT cyMinChild; UINT cx; HBITMAP hbmBack; UINT wID; #if (_WIN32_IE >= 0x0400) UINT cyChild; UINT cyMaxChild; UINT cyIntegral; UINT cxIdeal; LPARAM lParam; UINT cxHeader; #endif } REBARBANDINFO, FAR *LPREBARBANDINFO;
cbSizeはこの構造体のサイズです。
fMaskはこの構造体のどのメンバが有効かを示すフラグです。 次のものの組み合わせで指定します。
RBBIM_BACKGROUND | hbmBackメンバが有効です。 |
RBBIM_CHILD | hwndChildメンバが有効です。 |
RBBIM_CHILDSIZE | cxMinChild, cyMinChild, cyChild, cyMaxChild, cyIntegralメンバが有効です。 |
RBBIM_COLORS | clrFore, clrBackメンバが有効です。 |
RBBIM_HEADERSIZE | cxHeaderメンバが有効です。 |
RBBIM_IDEALSIZE | cxIdealメンバが有効です。 |
RBBIM_ID | wIDメンバが有効です。 |
RBBIM_IMAGE | iImageメンバが有効です。 |
RBBIM_LPARAM | lParamメンバが有効です。 |
RBBIM_SIZE | cxメンバが有効です。 |
RBBIM_STYLE | fStyleメンバが有効です。 |
RBBIM_TEXT | lpTextメンバが有効です。 |
fStyleはバンドスタイルを指定します。次のものの 組み合わせで指定します。
RBBS_BREAK | バンドは新しい列の上にあります。 |
RBBS_CHILDEDGE | バンドは子供ウィンドウの上と底の境界線を持ちます。 |
RBBS_FIXEDBMP | バンドがリサイズされた時背景のビットマップは不動です。 |
RBBS_FIXEDSIZE | バンドは固定サイズです。 |
RBBS_GRIPPERALWAYS | レバーに1つしかバンドがなくてもサイズグリップを 持ちます。 |
RBBS_HIDDEN | バンドは見えません。 |
RBBS_NOGRIPPER | バンドはサイズグリップを持ちません。 |
RBBS_NOVERT | レバーコントロールがCCS_VERTスタイルを使った時 バンドは表示されません。 |
RBBS_VARIABLEHEIGHT | レバーコントロールによってバンドは リサイズされることができます。 |
clrForeとclrBackはバンドの前景、背景の色です。
lpTextはバンドに表示されるテキストのアドレスです。
cchはlpTextのサイズです。
iImageはイメージのインデックスです。イメージリストはRB_SETBANDINFOメッセージ によってセットすることができます。
バンドに含まれる子供ウィンドウのハンドルです。
cxMinChildは子供ウィンドウの最小の幅を指定します。ピクセル単位です。
cyMinChildは子供ウィンドウの最小の高さです。
cxはバンドの長さです。
hbmBackはバンドの背景に使われるビットマップのハンドルです。
wIDはコントロールがこのバンドを識別するために使うIDです。カスタムドロー通知 メッセージのためのものです。
cyChildはバンドの初期状態での高さです。
cyMaxChildはバンドの最大高さを指定します。
cyIntegralはバンドが伸ばされたり縮められる時の1ステップのピクセル数です。(縦方向)
cxIdealはバンドの理想的な幅を指定します。
lParamはアプリケーション定義の32ビット値を指定します。
cxHeaderはバンドヘッダのサイズをピクセル単位で指定します。バンドヘッダとは 境界線から子供ウィンドウまでの領域を指します。
レバーコントロールに新しいバンドを挿入するメッセージです。RB_INSERTBAND wParam = (WPARAM)(UINT) uIndex; lParam = (LPARAM)(LPREBARBANDINFO) lprbbi;
uIndexにはバンドが挿入される位置を指定します。−1を指定すると最後に 挿入されます。
lprbbiはREBARBANDINFO構造体へのアドレスを指定します。
これで、レバーコントロール関連の最低限の構造体やらメッセージが 出揃いました。具体的なプログラミングは次章以降で解説します。
Update 10/Mar/1999 By Y.Kumei