こんな風に、マウスポインタを合わせるとボタンが浮き出てくるツールバーのことを、フラットツールバーと言います。今回は前回の標準ツールバーのプログラムにちょっと手を加え、オシャレなフラットツールバーにしてみましょう。
今回作成するプログラムのサンプルファイルを置いておきますので、参考にしたい方はどうぞ☆
Toolbar2.zip(プロジェクトに必要なファイルがすべて入っています)



どこに手を加えるかというと…

ツールバーのウィンドウスタイルに TBSTYLE_FLAT を加えるだけです。
えー、めっちゃ簡単じゃん。それではCreateToolbarEx関数の第1パラメータを…
ちょっとお待ちください。実験してみると分かりますが、ツールバー生成時にダイレクトに TBSTYLE_FLAT を指定してしまうと、不思議なことにツールバーの背面が白になってしまいます。
ということで、今回のポイントは、ワンテンポ遅れる形で TBSTYLE_FLAT を指定するというところになります。具体的には、以下のような流れになります。

CreateToolbarEx関数でツールバーを作成

GetWindowLong関数でツールバーのウィンドウスタイルを取得

ウィンドウスタイルに TBSTYLE_FLAT を追加

SetWindowLong関数でツールバーのウィンドウスタイルを更新

ここから作業開始

ステップ24のプログラムからの変更点を太字で表しています。
プロジェクト内の "MainWnd.sbp" を開き、以下のようなプログラムに編集しましょう。

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

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

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

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

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



↑先頭部分に変更点はありません。

Sub MainWnd_Destroy()
   Toolbar_DestroyObjects()
   PostQuitMessage(0)
End Sub



↑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)
End Sub



↑Createイベントでは、style変数、hToolbar変数の定義を行います。CreateToolbarEx関数の戻り値をhToolbar変数に格納してするのも忘れずに!
最後に、TBSTYLE_FLATスタイルを加え、SetWindowLong関数でツールバーに反映させます。

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



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



これで作業は完了です。とても簡単でしたね☆次回は、このフラットツールバーにホットイメージ機能を付け加え、さらにオシャレにしてみます。