Windows Programmierung: Statusbar
Willemers Informatik-Ecke

Einführende Informationen über die Programmierung von Kontrollelementen werden hier vorausgesetzt.

Die Statusbar gehört zu den Common Controls. In C-Programmen ist das Einbinden der Datei COMMCTRL.H notwendig und die comctl32.lib muss zum Programm gelinkt werden.

Erzeugen der Statusbar

#include <commctrl.h>

HWND CreateStatusBar(HWND hWnd, UINT ResID)
{
HWND hWndStatus;

	hWndStatus = CreateWindowEx (0L, // extended style
		STATUSCLASSNAME, "",
		WS_CHILD | WS_BORDER | WS_VISIBLE | SBS_SIZEGRIP, // window styles
		0, 0, 0, 0, // x, y, width, height
		hWnd, (HMENU)ResID, hInst, NULL);
	return hWndStatus;
}

Grössenänderungen (WM_SIZE)

Die Anwendung muss sich darum kümmern, dass sie bei der nächsten Grössenveränderung des Hauptfensters nicht verlorengeht. Die WM_SIZE-Behandlung sieht etwa so aus:

case WM_SIZE:
	RECT rSB;
	GetWindowRect(hwndStatus, &rSB);
	MoveWindow (hwndStatus, 0, HIWORD(lParam) - 10, LOWORD(lParam), HIWORD(lParam), TRUE);
	MoveWindow(hwndList, 0, rcl.bottom - rcl.top, LOWORD(lParam), 
			HIWORD(lParam) - (rSB.bottom - rSB.top) + 1, TRUE );
	break;

Im Beispiel wird davon ausgegangen, dass das Hauptfenster von einer Listbox mit dem Handle hwndList vollständig gefüllt ist. Diese muss sich etwas einschränken, um der Statusbar Platz zu machen.

Statusbar mit Text bestücken

void SetStatusText(HWND hWndStatus, char *Text)
{
	SendMessage (hWndStatus, SB_SETTEXT, 0, (LPARAM)Text);
}

Statusbar mit mehreren Feldern

Das Zerteilen in mehrere Teile:

static int aWidths [2] = {200,300};
   SendMessage (hWndStatus, SB_SETPARTS, 2, (LPARAM)aWidths); 
   SendMessage (hWndStatus, SB_SETTEXT, 0, (LPARAM)"Linkes Feld");
   SendMessage (hWndStatus, SB_SETTEXT, 1, (LPARAM)"noch n Feld");

Und wieder zurück:

   SendMessage (hWndStatus, SB_SIMPLE, 0, 0);