Sogenannte
AppBars sind bspw. Formulare, die an einer Deskseite sitzen und sich verhalten, wie die Taskleiste: es kann z.B. kein Fenster darüber liegen und es ist immer zu sehen.
Diese AppBar's lassen sich auch mit Delphi-Mitteln relativ einfach erzeugen. Im folgenden will ich das einmal kurz erklären.
Als erstes brauchen wir eine Variable vom Typ
_AppBarData. Diese Variable enthält alle wichtige Informationen über die AppBar, die wir an Windows senden. Die Variable muss global bzw. ein Feld des Formulares sein, weil wir auf sie mehrmals im Programm zugreifen müssen.
Dann füllen wir dieses Record mit Daten:
Delphi-Quellcode:
uses {...}, ShellApi,
{...};
{...}
type
TfrmMain =
class(TForm)
{...}
private
fAppBarData: _AppBarData;
{...}
end;
const
// Konstante, die als CallBack für die AppBar arbeitet
WM_APPBARMSG = WM_USER + 1;
{...}
// bspw. im OnCreate-Ereignis des Formulares, welches als AppBar dienen soll
var
iResult: integer;
begin
// Größe der ganzen Struktur
fAppBarData.cbSize := SizeOf(TAppBarData);
// Handle des Formulares, das als AppBar dienen soll
fAppBarData.hWnd := Self.Handle;
// Callback-Message
fAppBarData.uCallbackMessage := WM_APPBARMSG;
// Wo soll die AppBar sein?
fAppBarData.uEdge := ABE_TOP;
{Alternative Werte: ABE_BOTTOM, ABE_LEFT, ABE_RIGHT}
// Rect für den reservierten Platz, wo keine Anwendung "hin darf"
fAppBarData.rc.Left := 0;
fAppBarData.rc.Right := 0;
fAppBarData.rc.Top := 0;
fAppBarData.rc.Bottom := self.ClientHeight;
Die letzten Zeilen Code zeigen den zu reservierenden Platz. Das Formular kann durchaus größer/kleiner sein (dann müsste bei
rc.Bottom ein anderer Wert stehen). Allerdings würde das bewirken, dass der reservierte Platz nicht mehr dem Formular entspricht und es somit zu durchaus komischen Konstruktionen kommen kann.
Delphi-Quellcode:
// AppBar erstellen
iResult := SHAppBarMessage(ABM_NEW, fAppBarData);
// Hat das Erzeugen geklappt?
if iResult = 0 then
begin
ShowMessage('Die AppBar konnte nicht erzeugt werden. Unter Umständen existiert bereits eine AppBar an dieser Position.');
Exit;
end;
// Formular genauso breit machen, wie Bildschirm
self.Width := screen.Width;
// Position abfragen und nochmal setzen
SHAppBarMessage(ABM_QUERYPOS, fAppBarData);
SHAppBarMessage(ABM_SETPOS, fAppBarData);
// Nachrichtenschleife abarbeiten
Application.ProcessMessages;
// Bringt das Fenster an die gewünschte Position. Dazu werden die vorher festgelegten Werte verwendet.
MoveWindow(aAppBarData.hWnd, fAppBarData.rc.Left, fAppBarData.Rc.Top,
GetSystemMetrics(SM_CXSCREEN), fAppBarData.rc.Bottom, true);
end;
Die AppBar wurde nun erzeugt. Am Ende muss der reservierte Platz auf jedenfall wieder freigegeben werden:
Delphi-Quellcode:
// zum Beispiel im OnDestroy-Ereignis des Formulars
begin
SHAppBarMessage(ABM_REMOVE, aAppBarData);
end;
Fertig ist die AppBar.