Hier habe ich erklärt, wie man eine AppBar erstellt. Diese ist jetzt immer sichtbar. Interessant wäre also eine Möglichkeit, dass die AppBar nur zu sehen ist, wenn man mit der Maus an den Rand kommt.
Ich habe folgende Variante selbst entwickelt. Sie sollte allerdings funktionieren.
Um nicht ein ständiges neujustieren der Fenster zu erzwingen, sollten nur wenige Pixel reserviert werden. Aus dem oben genannten Beitrag muss also die Zeile
aAppBarData.rc.Bottom := self.ClientHeight;
in
aAppBarData.rc.Bottom := 5;
geändert werden.
Damit werden nur 5 Pixel für die AppBar registriert.
Als nächstes muss auf die Nachricht
CM_MOUSEENTER reagiert werden, die gesendet wird, wenn die Maus das Formular berührt:
Delphi-Quellcode:
// Message-Handler im private-Abschnitt des AppBar-Fensters
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
// ...
var
bVisible: boolean = false;
// ...
procedure TfrmMain.CMMouseEnter(var Message: TMessage);
begin
// Mouse enters form
// Verhindern, dass Fenster neu ausgerichtet wird, wenn nur von einem Button die Maus in's Formular wandert
if bVisible then Exit
else bVisible := true;
// Formular neu ausrichten
MoveWindow(aAppBarData.hWnd, aAppBarData.rc.Left, aAppBarData.Rc.Top,
GetSystemMetrics(SM_CXSCREEN), self.Tag, true);
// hier sollte einem Control der Fokus übergeben werden!
inherited;
end;
Zusätzlich muss noch
vor der AppBar-Registrierung folgendes geschrieben werden (bspw. im OnCreate-Ereignis):
self.Tag := self.ClientHeight;
Zu guter Letzt muss noch programmiert werden, dass das Fenster wieder verschwindet. Wir reagieren also auf das
OnDeactivate-Ereignis der Applikation:
Delphi-Quellcode:
procedure TfrmMain.ApplicationDeactivate(Sender: TObject);
begin
// Fenster wieder auf 5 Pixel verkleinern.
MoveWindow(aAppBarData.hWnd, aAppBarData.rc.Left, aAppBarData.Rc.Top,
GetSystemMetrics(SM_CXSCREEN), aAppBarData.rc.Bottom, true);
// Sichtbar-Flag wieder zurücksetzen
bVisible := false;
end;
// Ereignis zuweisen (bspw. im OnCreate-Ereignis):
Application.OnDeactivate := ApplicationDeactivate;
Nun sollte die AppBar sozusagen "On Demand" reagieren.
[edit=flomei]Link gefixt... flomei[/edit]