AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

AppBar on Demand

Ein Thema von CalganX · begonnen am 20. Jun 2004 · letzter Beitrag vom 20. Jun 2004
Antwort Antwort
CalganX

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

AppBar on Demand

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

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#2

Re: AppBar on Demand

  Alt 20. Jun 2004, 15:11
Sevus Chakotay1308,

schau dir am besten mal den Source von AppBar 1.4 auf torry.net an.
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
CalganX

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

Re: AppBar on Demand

  Alt 20. Jun 2004, 15:19
Hi,
hm... 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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz