Win32プログラミング講座 〜 Step26. ツールバーを使うB 〜


フラットツールバーにホットイメージ機能を付け加えます。ホットイメージとは、1つのボタンに対し、通常画像と浮き上がったときの画像を持たせる機能のことです。今回は、フルカラーのボタンイメージを採用するので、なかなかの見栄えになるかと思います。

今回作成するプログラムのサンプルファイルを置いておきますので、参考にしたい方はどうぞ☆
Toolbar3.zip(プロジェクトに必要なファイルがすべて入っています)

前回(ステップ25)のソースプログラムに変更を加える形で作業を進めていきます。前回からの変更箇所を太字で示しています。新規にプロジェクトを作成させる方は、プロジェクトオプションで「コモンコントロールを使用する」にチェックを入れておくのを忘れないようにしましょう。



チェックしておきたい関数は?

コモンコントロールのイメージリスト機能を使用するため、ImageList_LoadImage関数を使用します。この関数は、以下のようなパラメータを持ちます。

ImageList_LoadImage( _
    hi As DWord, _                'インスタンスハンドル(GetModuleHandle関数で取得)
    lpbmp As BytePtr, _           'リソース内のビットマップID
    cx As Long, _                 'ビットマップ(ボタン)の幅
    cGrow As Long, _              '初期イメージを越したときに新しく割り当てるイメージの数
    crMask As DWord, _            '透明色
    uType As DWord, _             'IMAGE_BITMAP、IMAGE_CURSOR、IMAGE_ICON のいずれかを指定
    uFlags As DWord _             'オプションフラグ
) As DWord
※関数が成功すると、イメージリストのハンドルが返ります。

今回はフルカラーのビットマップを読み込むため、uFlagsのオプションフラグには、LR_CREATEDIBSECTION を指定しておきます。
また、イメージリストの使用が終了したら、ImageList_Destroy関数でイメージを破棄する必要があります。



ツールバーボタンの画像を準備

今回は、2つの画像(通常時の画像と、選択時の画像)を用意します。それぞれ、右クリックで「対象をファイルに保存」を指定し、プロジェクト内に保存しておいて下さい。(以前の "toolbutton.bmp" が存在する場合は、上書きを行って下さい)

toolbutton.bmptoolbutton_hot.bmp


ToolbarプロジェクトのBitmapリソースにこの2つのファイルを挿入します。"toolbutton.bmp" のIDを IDB_BITMAP1 に、"toolbutton_hot.bmp" のIDを IDB_BITMAP2 にセットしておきます。

新規にプロジェクトを作成している方は、ステップ24を参考に、メニュー("MainMenu")の作成をしておきましょう。



コーディング

"MainWnd.sbp" を開き、以下のプログラムをコーディングしていきましょう。

' ----------------------------------------------------------------------------
'  イベント プロシージャ
' ----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd

' メモ - 以下の領域を、変数、構造体、定数、関数を宣言するための、
'        グローバル領域として利用することができます。
' ----------------------------------ここから----------------------------------

Const ID_TOOLBAR = 70    'ツールバーのID

Dim hImageList As DWord  'イメージリストのハンドル

Sub SetTbButtonData(ByRef ptb As TBBUTTON,
    iBitmap As Long,
    idCommand As Long,
    fsState As Byte,
    fsStyle As Byte)
    'ptb(TBBUTTON構造体)にボタン情報を格納する
    With ptb
        .iBitmap=iBitmap
        .idCommand=idCommand
        .fsState=fsState
        .fsStyle=fsStyle
        .dwData=0
        .iString=0
    End With
End Sub

' ----------------------------------ここまで----------------------------------

↑先頭部分では、イメージリストのハンドルを保存するためのhImageList変数を定義します。

Sub MainWnd_Destroy()
    'イメージリストを破棄
    ImageList_Destroy(hImageList)

    Toolbar_DestroyObjects()
    PostQuitMessage(0)
End Sub

↑Destroyイベントでは、ImageList_Destroy関数を使用してイメージリストを破棄します。

Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
    Dim ic As INITCOMMONCONTROLSEX
    Dim tbb[4] As TBBUTTON
    Dim style As Long
    Dim hToolbar As DWord

    'コモンコントロールの初期化
    ic.dwSize=Len(ic)
    ic.dwICC=ICC_BAR_CLASSES
    InitCommonControlsEx(ic)

    'ボタン情報をセット
    SetTbButtonData(tbb[0],0,IDM_NEW,TBSTATE_ENABLED,TBSTYLE_BUTTON)
    SetTbButtonData(tbb[1],1,IDM_OPEN,TBSTATE_ENABLED,TBSTYLE_BUTTON)
    SetTbButtonData(tbb[2],2,IDM_SAVE,TBSTATE_ENABLED,TBSTYLE_BUTTON)
    SetTbButtonData(tbb[3],0,0,TBSTATE_ENABLED,TBSTYLE_SEP)
    SetTbButtonData(tbb[4],3,IDM_ABOUT,TBSTATE_ENABLED,TBSTYLE_BUTTON)

    'ツールバーを生成
    hToolbar=CreateToolbarEx(hMainWnd, _
        WS_CHILD or WS_VISIBLE, _
        ID_TOOLBAR, _
        4, _
        GetModuleHandle(0), _
        IDB_BITMAP1, _
        tbb, _
        5, _
        0,0, _
        16,15, _
        Len(tbb[0]))

    'ウィンドウスタイルにTBSTYLE_FLATを追加
    style=GetWindowLong(hToolbar,GWL_STYLE)
    style=style or TBSTYLE_FLAT
    SetWindowLong(hToolbar,GWL_STYLE,style)

    'イメージリストを作成(フルカラー)
    hImageList=ImageList_LoadImage(GetModuleHandle(0), _
        IDB_BITMAP2, _
        16, 0, RGB(192,192,192), _
        IMAGE_BITMAP,LR_CREATEDIBSECTION)

    'ホットイメージを設定
    SendMessage(hToolbar, TB_SETHOTIMAGELIST, 0, hImageList)
End Sub

↑Createイベントでは、作成したイメージリストをホットイメージとしてツールバーに割り当てています。割り当てには、TB_SETHOTIMAGELIST メッセージを使用します。TB_SETHOTIMAGELIST メッセージでは、wParamは無視され、lParamにイメージリストのハンドルを指定します。

Sub MainWnd_IDM_NEW_MenuClick()
    MessageBox(hMainWnd, "新規作成", "Test of Toolbar", MB_OK)
End Sub

Sub MainWnd_IDM_OPEN_MenuClick()
    MessageBox(hMainWnd, "開く", "Test of Toolbar", MB_OK)
End Sub

Sub MainWnd_IDM_SAVE_MenuClick()
    MessageBox(hMainWnd, "保存", "Test of Toolbar", MB_OK)
End Sub

Sub MainWnd_IDM_EXIT_MenuClick()
    SendMessage(hMainWnd,WM_CLOSE,0,0)
End Sub

Sub MainWnd_IDM_ABOUT_MenuClick()
    MessageBox(hMainWnd, "ツールバーテスト Ver1.0", "バージョン情報", MB_OK)
End Sub

↑これらのダミーメッセージに変更点はありません。



これで作業は完了です。自分のアプリケーションで色鮮やかなツールバーが踊るのは悪い気分ではありませんね☆

前へ戻る - 次へ進む
トップへ戻る


©2005 Discoversoft