Einzelnen Beitrag anzeigen

CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#1

AppBar nur anzeigen, wenn nötig

  Alt 20. Jun 2004, 20:52
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]
  Mit Zitat antworten Zitat