ツールチップ
ツールチップの表示
ツールバーボタンにはツールチップ(ツールヒント)を表示することができます。
これはボタン上にカーソルを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
構造体の別名です。