EternalWindows
ツールバー / ツールチップの表示

今回は、ツールバーのボタンにツールチップが表示されるようにします。 また、趣向を凝らすために、これまでとは違ったビットマップイメージを使用します。

#include <windows.h>
#include <commctrl.h>

#define ID_TOOLBAR 100
#define ID_BACK    200
#define ID_FORWARD 300

#pragma comment (lib, "comctl32.lib")

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
	TCHAR      szAppName[] = TEXT("sample");
	HWND       hwnd;
	MSG        msg;
	WNDCLASSEX wc;

	wc.cbSize        = sizeof(WNDCLASSEX);
	wc.style         = 0;
	wc.lpfnWndProc   = WindowProc;
	wc.cbClsExtra    = 0;
	wc.cbWndExtra    = 0;
	wc.hInstance     = hinst;
	wc.hIcon         = (HICON)LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_SHARED);
	wc.hCursor       = (HCURSOR)LoadImage(NULL, IDC_ARROW, IMAGE_CURSOR, 0, 0, LR_SHARED);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName  = NULL;
	wc.lpszClassName = szAppName;
	wc.hIconSm       = (HICON)LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_SHARED);
	
	if (RegisterClassEx(&wc) == 0)
		return 0;

	hwnd = CreateWindowEx(0, szAppName, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinst, NULL);
	if (hwnd == NULL)
		return 0;

	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);
	
	while (GetMessage(&msg, NULL, 0, 0) > 0) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return (int)msg.wParam;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	static HWND hwndToolbar = NULL;
	
	switch (uMsg) {
		
	case WM_CREATE: {
		TBBUTTON tbButton[] = {
			{HIST_BACK, ID_BACK, TBSTATE_ENABLED, BTNS_BUTTON, 0, 0},
			{HIST_FORWARD, ID_FORWARD, TBSTATE_ENABLED, BTNS_BUTTON, 0, 0}
		};
		int                  nCount = sizeof(tbButton) / sizeof(tbButton[0]);
		INITCOMMONCONTROLSEX ic;
		
		ic.dwSize = sizeof(INITCOMMONCONTROLSEX);
		ic.dwICC  = ICC_BAR_CLASSES;
		InitCommonControlsEx(&ic);
		
		hwndToolbar = CreateToolbarEx(hwnd, WS_CHILD | WS_VISIBLE | TBSTYLE_TOOLTIPS, ID_TOOLBAR, 0, HINST_COMMCTRL, IDB_HIST_LARGE_COLOR, tbButton, nCount, 0, 0, 0, 0, sizeof(TBBUTTON));
		return 0;
	}
	
	case WM_NOTIFY:
		if (((LPNMHDR)lParam)->code == TTN_GETDISPINFO) {
			LPTOOLTIPTEXT lpText = (LPTOOLTIPTEXT)lParam;

			if (lpText->hdr.idFrom == ID_BACK)
				lpText->lpszText = TEXT("戻る");
			else if (lpText->hdr.idFrom == ID_FORWARD)
				lpText->lpszText = TEXT("進む");
			else
				;
		}
		return 0;

	case WM_SIZE:
		MoveWindow(hwndToolbar, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
		return 0;

	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;

	default:
		break;

	}

	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

今回のビットマップイメージがこれまでのものと異なっているのは、 CreateToolbarExの第6引数にIDB_HIST_LARGE_COLORを指定しているからです。 この定数を指定した場合は、TBBUTTON構造体の最初のメンバにHIST_BACKやHIST_FAVORITESを指定することができます。 ツールバーのウインドウスタイルにTBSTYLE_TOOLTIPSを指定した場合は、 カーソルをボタンの上に乗せた際にWM_NOTIFYが送られることになります。 このときの通知コードはTTN_GETDISPINFO及びTBN_GETINFOTIPであり、 前者の場合はlParamにTOOLTIPTEXT構造体のアドレスが格納されています。 この構造体のlpszTextに文字列を指定すればそれがツールチップとして表示されるため、 ボタンのID毎に指定する文字列を分けることになります。

今回はTTN_GETDISPINFOを処理してツールチップを表示していますが、 TBN_GETINFOTIPを処理することでもツールチップを表示することができます。 次に例を示します。

case WM_NOTIFY:
	if (((LPNMHDR)lParam)->code == TBN_GETINFOTIP) {
		LPNMTBGETINFOTIP lpInfoTip = (LPNMTBGETINFOTIP)lParam;

		if (lpInfoTip->iItem == ID_BACK)
			lpInfoTip->pszText = TEXT("戻る");
		else if (lpInfoTip->iItem == ID_FORWARD)
			lpInfoTip->pszText = TEXT("進む");
		
		lpInfoTip->cchTextMax = lstrlen(lpInfoTip->pszText);
	}
	return 0;

TBN_GETINFOTIPの場合は、lParamにNMTBGETINFOTIP構造体のアドレスが格納されており、 pszTextにツールチップとして表示したいテキストを指定します。 cchTextMaxには、pszTextに指定した文字列のサイズを指定します。


戻る