第182章 レバーコントロールの基礎


レバーコントロールとは、IE4.0のツールバーのように左端に 「とって(レバー)」がついたものです。このレバーをドラッグする 事によりその上に乗っているコントロール類の表示のされ方を変える ことができます。



左の図ではレバーコントロールに「ボタン」と「コンボボックス」 が乗っています。コンボボックスのレバーを左右にドラッグすると それぞれのコントロールの幅を変えることができます。また、「ボタン」 と「コンボボックス」の位置を反対にすることもできます。 「ボタン」「コンボボックス」などの文字だけを表示して コントロール自体を隠すこともできます。



さらに、左の図のように各コントロールを1列ずつ表示させる 事も可能です。コントロールの大きさは自動的に調整されます。

こりゃ、作るのが難しそうだな!!

それが意外に簡単に作れます。ただ、ちょっとだけ煩雑です。 またcomctl32.dllのバージョンは4.71以降が必要です(バージョンはX:\windows\systemにある このファイルを右クリックして「プロパティ」を選択するとわかります)。

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を繰り返す

親ウィンドウ(メインウィンドウ)の子供として、レバーコントロールが 作られます。レバーコントロールの子供として各コントロール類が作られます。 さて、ここでちょっと疑問がわきませんか?

実際にユーザーが操作するのはレバーコントロールの子供であるボタンなどです。 これらのコントロール類が操作されたことをどうやって知れば良いのでしょうか。 普通は通知メッセージはその親に届きます。レバーコントロール上のボタンが 押されると通知メッセージはレバーコントロールのプロシージャに来るはずです。 レバーコントロールをサブクラス化しないとだめかな・・・と思いませんか。 実は、レバーコントロールでは子供から来た通知メッセージをそのままその親に 送ります。したがってコントロール類のイベントはメインウィンドウのプロシージャで 知ることが出きるのです。要するに孫のイベントを知ることができるわけです。 また、レバーコントロールが破棄される時それに乗っているすべての子供も 破棄されます。

では、少しずつ構造体などを解説します。

typedef struct tagREBARINFO{ UINT cbSize; UINT fMask; HIMAGELIST himl; } REBARINFO, FAR *LPREBARINFO;

cbSizeはこの構造体の大きさです。

fMaskは現在のところRBIM_IMAGELIST しか設定できません。 イメージリストを使わない場合は0にします。

himlはイメージリストのハンドルです。使わない時はNULLにします。

RB_SETBARINFO wParam = 0; lParam = (LPARAM)(LPREBARINFO) lprbi;

レバーコントロールの特徴をセットするメッセージです。
lprbiはREBARINFO構造体へのポインタです。

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_BACKGROUNDhbmBackメンバが有効です。
RBBIM_CHILD hwndChildメンバが有効です。
RBBIM_CHILDSIZE cxMinChild, cyMinChild, cyChild, cyMaxChild,
cyIntegralメンバが有効です。
RBBIM_COLORSclrFore, clrBackメンバが有効です。
RBBIM_HEADERSIZEcxHeaderメンバが有効です。
RBBIM_IDEALSIZEcxIdealメンバが有効です。
RBBIM_IDwIDメンバが有効です。
RBBIM_IMAGEiImageメンバが有効です。
RBBIM_LPARAMlParamメンバが有効です。
RBBIM_SIZEcxメンバが有効です。
RBBIM_STYLEfStyleメンバが有効です。
RBBIM_TEXTlpTextメンバが有効です。

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構造体へのアドレスを指定します。

これで、レバーコントロール関連の最低限の構造体やらメッセージが 出揃いました。具体的なプログラミングは次章以降で解説します。


[SDK第2部 Index] [総合Index] [Previous Chapter] [Next Chapter]

Update 10/Mar/1999 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。