![]() |
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:
Funktioniert wie gesagt nicht. Keine Fehlermeldung oder so, es wird einfach nicht angezeigt.
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; Hat jemand eine Idee, wie sich das realisieren lässt? Chris |
Re: AppBar on Demand
|
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:
Und für das Verstecken muss das OnDeactivate-Ereignis von Application verwendet werden:
// 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;
Delphi-Quellcode:
Bei mir funktioniert's jetzt, auch wenn es noch ein bisschen Buggy ist. ;)
// 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; 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