Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi AppBar on Demand (https://www.delphipraxis.net/24392-appbar-demand.html)

CalganX 20. Jun 2004 13:52


AppBar on Demand
 
Hi,
ich versuche gerade ein kleines AppBar-Tool so umzuschreiben, dass er nur erscheint, wenn man über den 5 Pixel sichtbaren Streifen (Teil vom Formular) fährt. Sozusagen "automatisch im Hintergrund".

Ich fange das Event CM_MOUSEENTER ab und das funktioniert soweit, allerdings bekomme ich es nicht hin, dass die AbbBar das gleiche verhalten zeigt, wie die DesktopBands, also dass das gesamte Formular erscheint, während man drauf ist und wieder verschwindet, wenn man das Formular verlässt.
Kurz gesagt passiert bei mir nichts, was darauf schließen lassen würde, dass mein Formular sich "öffnet".

Nach mehreren unsinnigen Versuchen steht in meinem selbst gefrickelten OnMouseEnter-Event folgendes:
Delphi-Quellcode:
procedure TfrmMain.CMMouseEnter(var Message: TMessage);
var
  Result: integer;
begin
  // Mouse enters form

  SHAppBarMessage(ABM_REMOVE, aAppBarData);

  aAppBarData.cbSize := SizeOf(TAppBarData);
  aAppBarData.hWnd := Self.Handle;
  aAppBarData.uCallbackMessage := WM_APPBAR;
  aAppBarData.uEdge := ABE_TOP;

  aAppBarData.rc.Left := 0;
  aAppBarData.rc.Top := 0;
  aAppBarData.rc.Right := 0;
  aAppBarData.rc.Bottom := self.ClientHeight;

  result := SHAppBarMessage(ABM_NEW, aAppBarData);

  if Result = 0 then
  begin
    ShowMessage('Sorry, Windows is too stupid to show a simple AppBar!');
    exit;
  end;

  self.Width := screen.Width;

  SHAppBarMessage(ABM_QUERYPOS, aAppBarData);
  SHAppBarMessage(ABM_SETPOS, aAppBarData);
  Application.ProcessMessages;
  MoveWindow(aAppBarData.hWnd, aAppBarData.rc.Left, aAppBarData.Rc.Top, GetSystemMetrics(SM_CXSCREEN), aAppBarData.rc.Bottom, true);

  inherited;
end;
Funktioniert wie gesagt nicht. Keine Fehlermeldung oder so, es wird einfach nicht angezeigt.

Hat jemand eine Idee, wie sich das realisieren lässt?

Chris

MrKnogge 20. Jun 2004 15:11

Re: AppBar on Demand
 
Sevus Chakotay1308,

schau dir am besten mal den Source von AppBar 1.4 auf torry.net an.

CalganX 20. Jun 2004 15:19

Re: AppBar on Demand
 
Hi,
hm... :gruebel: Ist nicht so ganz das Wahre. ;)

Hab es aber gerade durch Zufall hinbekommen. :)
Im OnMouseEnter-Event (bzw. einem CM_MOUSEENTER-Messagehandler) muss für die Anzeige folgendes stehen:
Delphi-Quellcode:
  // Mouse enters form

  {bValue ist eine globale Boolean-Variable}
  if bVisible then Exit
  else bVisible := true;

  SHAppBarMessage(ABM_REMOVE, aAppBarData);

  self.Height := self.Tag;
  aAppBarData.rc.Bottom := self.ClientHeight;

  {Result ist ein lokaler Integer}
  result := SHAppBarMessage(ABM_NEW, aAppBarData);

  if Result = 0 then
  begin
    ShowMessage('AppBar konnte nicht registriert werden');
    exit;
  end;

  self.Width := screen.Width;

  SHAppBarMessage(ABM_QUERYPOS, aAppBarData);
  SHAppBarMessage(ABM_SETPOS, aAppBarData);
  Application.ProcessMessages;
  MoveWindow(aAppBarData.hWnd, aAppBarData.rc.Left, aAppBarData.Rc.Top,
    GetSystemMetrics(SM_CXSCREEN), aAppBarData.rc.Bottom, true);

  inherited;
Und für das Verstecken muss das OnDeactivate-Ereignis von Application verwendet werden:
Delphi-Quellcode:
  // Application loses focus

  SHAppBarMessage(ABM_REMOVE, aAppBarData);

  aAppBarData.rc.Bottom := 5;

  {Result ist ein lokaler Integer}
  result := SHAppBarMessage(ABM_NEW, aAppBarData);

  if Result = 0 then
  begin
    ShowMessage('AppBar konnte nicht registriert werden');
    exit;
  end;

  self.Width := screen.Width;

  SHAppBarMessage(ABM_QUERYPOS, aAppBarData);
  SHAppBarMessage(ABM_SETPOS, aAppBarData);
  Application.ProcessMessages;
  MoveWindow(aAppBarData.hWnd, aAppBarData.rc.Left, aAppBarData.Rc.Top,
    GetSystemMetrics(SM_CXSCREEN), aAppBarData.rc.Bottom, true);

  {bVisible ist ein globaler Boolean}
  bVisible := false;
Bei mir funktioniert's jetzt, auch wenn es noch ein bisschen Buggy ist. ;)

Chris


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz