第203章 ステータスバーのツールチップ


今回はステータスバーにツールチップをつけます。 簡単に実現できますが、ツールバーの時とは違って マウスをポイントすれば必ず表示されるというものではありません。



ステータスバーのツールチップがサポートされているのは Comctl32.dllのバージョンが4.71以降です。

1.コモンコントロールの前準備 2.スタイルにSBT_TOOLTIPSを指定してステータスバーを作る 3.ステータスバーにSB_SETTIPTEXTメッセージを送る

SB_SETTIPTEXTメッセージは次のように使います。

SB_SETTIPTEXT wParam = (WPARAM)(INT)iPart; lParam = (LPARAM)(LPCTSTR)lpszTooltip;

iPartはステータスバーのパートのインデックスを指定します。(0から始まる)
lpszTooltipはツールチップのテキストです。

たったこれだけです。
ステータスバーにツールチップが表示されるのは

1.アイコンを持っていて、テキストが何も表示されていないパート 2.テキストがパートに表示しきれない時

だけです。またシンプルモードでは表示されません。

最初のパートはテキストが表示しきれていないのでマウスでポイントすると ツールチップが表示されます。
次のパートはアイコンが表示されていてテキストがないのでツールチップが 表示されます。
最後のパートはテキストがすべて表示されているのでツールチップは 表示されません。しかし、ウィンドウを小さくしていってテキストが 全部は表示されない状態になるとツールチップが表示可能となります。



では、プログラムを見てみましょう。リソース・スクリプトは 前章と同じなので省略します。

// newst02.cpp #ifndef STRICT #define STRICT #endif #include <windows.h> #include <commctrl.h> #define ID_STATUS 100 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); char szClassName[] = "newst02"; //ウィンドウクラス HINSTANCE hInst; int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; hInst = hCurInst; if (!InitApp(hCurInst)) return FALSE; if (!InitInstance(hCurInst, nCmdShow)) return FALSE; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } //ウィンドウ・クラスの登録 ATOM InitApp(HINSTANCE hInst) { WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; //プロシージャ名 wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst;//インスタンス wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; //メニュー名 wc.lpszClassName = (LPCSTR)szClassName; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); return (RegisterClassEx(&wc)); } //ウィンドウの生成 BOOL InitInstance(HINSTANCE hInst, int nCmdShow) { HWND hWnd; hWnd = CreateWindow(szClassName, "猫でもわかるステータス・バー", //タイトルバーにこの名前が表示されます WS_OVERLAPPEDWINDOW, //ウィンドウの種類 CW_USEDEFAULT, //X座標 CW_USEDEFAULT, //Y座標 CW_USEDEFAULT, //幅 CW_USEDEFAULT, //高さ NULL, //親ウィンドウのハンドル、親を作るときはNULL NULL, //メニューハンドル、クラスメニューを使うときはNULL hInst, //インスタンスハンドル NULL); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id; static HWND hStatus; INITCOMMONCONTROLSEX ic; int sb_size[] = {100, 200, -1}; HICON hIcon; char *str1 = "今日はよい天気です。明日もよい天気かどうかはわかりません。"; char *str2 = "粂井康孝"; switch (msg) { case WM_CREATE: ic.dwSize = sizeof(INITCOMMONCONTROLSEX); ic.dwICC = ICC_BAR_CLASSES; InitCommonControlsEx(&ic); hStatus = CreateStatusWindow(WS_CHILD | WS_VISIBLE | SBT_TOOLTIPS, "", hWnd, ID_STATUS); SendMessage(hStatus, SB_SETPARTS, (WPARAM)3, (LPARAM)sb_size); SendMessage(hStatus, SB_SETTEXT, (WPARAM)0 | 0, (LPARAM)str1); SendMessage(hStatus, SB_SETTEXT, (WPARAM)2 | 0, (LPARAM)str2); hIcon = LoadIcon(hInst, "MYICON"); SendMessage(hStatus, SB_SETICON, (WPARAM)1, (LPARAM)hIcon); SendMessage(hStatus, SB_SETTIPTEXT, (WPARAM)0, (LPARAM)str1); SendMessage(hStatus, SB_SETTIPTEXT, (WPARAM)1, (LPARAM)"2番目のパートです"); SendMessage(hStatus, SB_SETTIPTEXT, (WPARAM)2, (LPARAM)str2); break; case WM_SIZE: SendMessage(hStatus, WM_SIZE, wp, lp); break; case WM_CLOSE: id = MessageBox(hWnd, "終了してもよいですか", "終了確認", MB_YESNO | MB_ICONQUESTION); if (id == IDYES) { DestroyWindow(hStatus); DestroyWindow(hWnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; }

今回も簡単なので一気にソースを表示しました。
[SDK第3部 Index] [総合Index] [Previous Chapter] [Next Chapter]

Update 19/May/1999 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。