unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ShellApi;
type
TForm1 =
class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
fAppBarData: _AppBarData;
public
{ Public declarations }
end;
const
WM_APPBARMSG = WM_USER + 1;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
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;
// 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(fAppBarData.hWnd, fAppBarData.rc.Left, fAppBarData.Rc.Top,
GetSystemMetrics(SM_CXSCREEN), fAppBarData.rc.Bottom, true);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SHAppBarMessage(ABM_REMOVE, fAppBarData);
end;
end.