EternalWindows
ステータスバー / ステータスバーの作成

ステータスバーとは、ウインドウの下部に存在するコントロールのことです。

ステータスバーには、主にそのアプリケーションにおける補足情報が表示されます。 たとえば、メニュー項目を内容を記述した説明文や現在のキャレットの位置などがあります。

今回のプログラムは、ステータスバーを作成する例を示しています。

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

#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 hwndStatus = NULL;
	
	switch (uMsg) {
		
	case WM_CREATE: {
		INITCOMMONCONTROLSEX ic;
		
		ic.dwSize = sizeof(INITCOMMONCONTROLSEX);
		ic.dwICC  = ICC_BAR_CLASSES;
		InitCommonControlsEx(&ic);
		
		hwndStatus = CreateWindowEx(0, STATUSCLASSNAME, TEXT(""), WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hwnd, (HMENU)1, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
		
		SendMessage(hwndStatus, SB_SIMPLE, TRUE, 0);

		return 0;
	}

	case WM_LBUTTONDOWN: {
		int   x, y;
		TCHAR szBuf[256];

		x = LOWORD(lParam);
		y = HIWORD(lParam);

		wsprintf(szBuf, TEXT("x : %d, y : %d"), x, y);
		SendMessage(hwndStatus, SB_SETTEXT, 255 | 0, (LPARAM)szBuf);

		return 0;
	}

	case WM_SIZE:
		SendMessage(hwndStatus, WM_SIZE, wParam, lParam);
		return 0;

	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;

	default:
		break;

	}

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

ステータスバーを作成する場合は、InitCommonControlsExにICC_BAR_CLASSESを指定します。 ステータスバーの作成に使用する関数は、通常のコントロールと同じようにCreateWindowExであり、 第2引数のウインドウクラスにはSTATUSCLASSNAMEを指定します。 また、第4引数のウインドウスタイルには、子ウインドウであることを示すWS_CHILDと表示状態であることを示すWS_VISIBLEを指定します。 ステータスバーの位置やサイズには0を指定していますが、 これはWM_SIZEでステータスバーにWM_SIZEを送信すればよいことになっているからです。 ステータスバーの作成にはCreateStatusWindowという関数を呼び出すこともできますが、 この関数は現在では古いとされているので呼び出すべきではありません。 ステータスバーに送信するメッセージはSBから始まり、 SB_SIMPLEはステータスバーがパートを持つことになるかを伝えます。 WPARAMがTRUEである場合は、ステータスバーがパートを持たないシンプルなものであることを示します。

マウスの左ボタンが押された場合は、その位置をステータスバーに表示するためにSB_SETTEXTを送信しています。 WPARAMはパートのインデックスですが、今回はパートを持たないシンプルなステータスバーを作成しているため、 指定するインデックスは255という値にしなければなりません。 0を論理和で足しているのは、インデックスと共に描画タイプを指定できることを明確にするためです。 たとえば、0の代わりにSBT_NOBORDERSを指定するとボーダーが表示されなくなります。 当然ながら、0を論理和で足しても値は変わりませんから、コードから外しても問題はありません。 LPARAMは、設定したいテキストを指定します。


戻る