「ステップ31 「ツールバーを使う④(ツールチップを表示する)」」の編集履歴(バックアップ)一覧はこちら

ステップ31 「ツールバーを使う④(ツールチップを表示する)」」(2010/05/02 (日) 06:58:14) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

サンプルファイルをつかえばok
[[ステップ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" を開き、以下のプログラムをコーディングしていきましょう。 #asciiart(blockquote){ ' ---------------------------------------------------------------------------- ' イベント プロシージャ ' ---------------------------------------------------------------------------- ' このファイルには、ウィンドウ [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 ' ----------------------------------ここまで---------------------------------- } ↑先頭部分に変更点はありません。 #asciiart(blockquote){ Sub MainWnd_Destroy() 'イメージリストを破棄 ImageList_Destroy(hImageList) Toolbar_DestroyObjects() PostQuitMessage(0) End Sub } ↑Destroyイベントに変更点はありません。 #asciiart(blockquote){ 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 を追加しておきます。 #asciiart(blockquote){ 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 } ↑これらのダミーメッセージに変更点はありません。 #asciiart(blockquote){ 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メンバでツールチップ用のテキストを設定します。 これで作業は完了です。

表示オプション

横に並べて表示:
変化行の前後のみ表示: