ステップ26 「ツールバーを使う③(ホットイメージ)」の続きです。ホットイメージツールバーにツールチップを表示してみます。
今回作成するプログラムのサンプルファイルを置いておきますので、参考にしたい方はどうぞ☆
Toolbar4.zip(プロジェクトに必要なファイルがすべて入っています)




ツールチップの表示方法

WM_NOTIFYメッセージを感知し、ツールチップ用の文字列をセットするだけという、非常に簡単な流れになります。具体的には、以下のような流れになります。
① WM_NOTIFYメッセージがメッセージコードTTN_NEEDTEXTとともに送られる
② TOOLTIPTEXT構造体のlpszTextメンバに文字列を示すポインタをセットする


Type TOOLTIPTEXT
   hdr As NMHDR       'NMHDR構造体にコマンド情報が格納されます
   lpszText As BytePtr'ツールチップ文字列を受けるためのポインタ変数
   szText[79] As Byte 'ツールチップ文字列を受けるためのバッファ(lpszTextメンバが0のとき)
   hinst As DWord     'lpszTextメンバにストリングリソースのIDを指定したときに、
                      '対象となるアプリケーションのインスタンスハンドルを指定します
   uFlags As DWord
   lParam As DWord
End Type

ここでは、uFlagsメンバ、lParamメンバは意味をなしていないので、無視して下さい。
ツールチップを表示するためのTOOLTIPTEXT構造体の操作は、以下の3通りの方法が存在します。今回は、一番上の方法を採用します。

  • lpszTextメンバに文字列ポインタを指定する。
  • szTextメンバに文字列バッファをコピーする。
  • lpszTextメンバにストリングリソースのIDを指定し、hinstメンバにインスタンスハンドルを指定する。


コーディング

ステップ26 「ツールバーを使う③(ホットイメージ)」のソースコードに変更を加えていく形で解説を進めます。変更点は太字で示します。
"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

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


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


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

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 or TBSTYLE_TOOLTIPS, _
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イベントでは、CreateToolbarEx関数のウィンドウスタイルに TBSTYLE_TOOLTIPS を追加しておきます。


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


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


Sub MainWnd_Notify(ByRef nmHdr As NMHDR)
Dim ToolTipText As TOOLTIPTEXT
If nmHdr.code=TTN_NEEDTEXT Then
memcpy(VarPtr(ToolTipText),VarPtr(nmHdr),Len(ToolTipText))
Select Case nmHdr.idFrom
Case IDM_NEW
ToolTipText.lpszText="新規作成"
Case IDM_OPEN
ToolTipText.lpszText="開く"
Case IDM_SAVE
ToolTipText.lpszText="保存"
Case IDM_EXIT
ToolTipText.lpszText="終了"
Case IDM_ABOUT
ToolTipText.lpszText="ヘルプ"
End Select
memcpy(VarPtr(nmHdr),VarPtr(ToolTipText),Len(ToolTipText))
End If
End Sub


↑MainWndに対するWM_NOTIFYイベントです。nmHdr構造体の後部に、ツールチップ表示に関する情報が追加されているので、TOOLTIPTEXT構造体を代用し、lpszTextメンバでツールチップ用のテキストを設定します。


これで作業は完了です。