ツールチップ

ツールチップの表示

ツールバーボタンにはツールチップ(ツールヒント)を表示することができます。
これはボタン上にカーソルを0.5秒ほど重ねると表示される、ボタンの機能を説明するためのテキスト情報です。
ツールチップの表示

ツールチップを使用するにはツールバーのスタイルにTBSTYLE_TOOLTIPSスタイルを追加する必要があります。

ツールチップを実装する方法はいくつかありますが、最も柔軟な方法はTTN_GETDISPINFO通知コードを使用する方法です。
これにはWM_NOTIFYメッセージを使用します。

WM_NOTIFYメッセージ

WM_NOTIFYメッセージは、コモンコントロールからのイベントの発生やコントロールが何らかの情報を要求する時に親ウィンドウに送られてくるメッセージです。

WPARAMはメッセージを送信するコモンコントロールの識別子です。
LPARAMは送られてきた情報を含むNMHDR構造体のポインタです。

typedef struct _nmhdr {
 HWND hwndFrom;
 UINT idFrom;
 UINT code;
} NMHDR;
WM_NOTIFYメッセージから送られてくる情報を格納する構造体。

hwndFromメンバはメッセージを送信するコントロールのウィンドウハンドルです。
idFromメンバはメッセージを送信するコントロールの識別子です。
codeメンバは通知コードです。
ここにTTN_GETDISPINFOという通知コードが格納されていれば、ツールチップの表示の要求という意味になります。


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_NOTIFY: //コモンコントロールからの通知
		switch (((NMHDR*)lParam)->code)
		{
		case TTN_GETDISPINFO: //ツールチップ表示
		//以降省略

TTN_GETDISPINFO通知コード

WM_NOTIFYメッセージでTTN_GETDISPINFO通知コードが送られてくるとき、LPARAMはNMTTDISPINFO構造体のポインタが格納されています。
先ほどはLPARAMはNMHDR構造体へのポインタと説明しましたが、NMTTDISPINFO構造体は内部にNMHDR構造体を含んでいます。
(先頭のメンバがNMHDR構造体であるため、NMTTDISPINFO構造体はNMHDR構造体にキャストして各メンバにアクセスできる)
この構造体にツールチップの表示のための情報を格納することで、実際に表示することができます。

typedef struct tagNMTTDISPINFOW {
 NMHDR hdr;
 LPWSTR lpszText;
 WCHAR szText[80];
 HINSTANCE hinst;
 UINT uFlags;
 LPARAM lParam;
} NMTTDISPINFOW, *LPNMTTDISPINFOW;
ツールチップの情報を格納する構造体。

hdrメンバはNMHDR構造体です。

lpszTextメンバはツールチップとして表示するテキストを格納する文字列です。
このメンバにツールチップテキストをセットします。
後述するhinstメンバがNULLでない場合、文字列リソースの識別子を指定します。
(文字列型なのでMAKEINTRESOURCEマクロが必要です)

szTextメンバはツールチップテキストを格納する文字列バッファです。
lpszTextメンバの代わりに、80文字分までならばここに文字列を格納することができます。

hinstメンバはツールチップテキストに文字列リソースを使用する場合に、リソースを格納するモジュールのインスタンスハンドルを指定します。
lpszTextメンバに文字列バッファへのポインタを指定する場合、このメンバにはNULLを指定します。

uFlagsメンバはhdrメンバ(NMHDR構造体)のidFromメンバの解釈方法を示すフラグです。
以下の定数の組み合わせです。

定数 説明
TTF_IDISHWND idFromはハンドルであることを示す
このフラグが指定されていない場合は識別子であることを示す
TTF_RTLREADING このフラグを追加すると、テキストの方向を親ウィンドウとは逆にする
アラビア語やヘブライ語などの、右から左方向へ読む言語用
TTF_DI_SETITEM このフラグを追加すると、ツールチップコントロールに情報が保存され、再度要求されなくなる

lParamメンバはアプリケーション定義の値です。
任意の値を関連付けることができます。

サンプルコード

ツールチップの表示のサンプルコードです。
必要な箇所以外は省略しているので、ツールバー#全体のサンプルコードのページなどを参考にしてください。


HWND CreateToolbar(HWND hWnd)
{
	//CreateWindowEx関数のスタイルに
	//TBSTYLE_TOOLTIPSを追加
	HWND hToolbar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL,
		WS_CHILD | WS_VISIBLE | TBSTYLE_TOOLTIPS, 
		0, 0, 0, 0,
		hWnd, NULL, hInst, NULL);

	//他は省略
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static HWND hToolbar;
	NMTTDISPINFO* ttdi;

	switch (message)
	{
	case WM_NOTIFY: //コモンコントロールからの通知
		switch (((NMHDR*)lParam)->code)
		{
		case TTN_GETDISPINFO: //ツールチップの情報の要求
			ttdi = (NMTTDISPINFO*)lParam;

			switch (ttdi->hdr.idFrom)
			{
			case IDC_A:
				ttdi->lpszText = L"「あ」を表示する";
				break;
			case IDC_I:
				ttdi->lpszText = L"「い」を表示する";
				break;
			case IDC_U:
				ttdi->lpszText = L"「う」を表示する";
				break;
			case IDC_E:
				ttdi->lpszText = L"「え」を表示する";
				break;
			case IDC_O:
				ttdi->lpszText = L"「お」を表示する";
				break;
			}
			break;
		}
		break;
	//以降省略

LPARAMはNMHDR構造体でもありNMTTDISPINFO構造体でもあるので(どちらもポインタ)、都度キャストして使用します。
なお、LPNMHDR構造体LPNMTTDISPINFO構造体といったポインタ型も定義されているので、そちらを使用しても良いです。


//LPxxx型を使用しても良い

(LPNMHDR)lParam)->code;
LPNMTTDISPINFO ttdi = (LPNMTTDISPINFO)lParam;

NMTTDISPINFO構造体TOOLTIPTEXTという別名でも使用できます。
LPNMTTDISPINFO構造体LPTOOLTIPTEXT構造体の別名です。