Probleme mit AppBar

Rund um die LCL und andere Komponenten
Antworten
gekd1407
Beiträge: 10
Registriert: Sa 17. Aug 2013, 22:09
OS, Lazarus, FPC: Win10/11pro 64Bit (L 2.2.6 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Marl

Probleme mit AppBar

Beitrag von gekd1407 »

Hallo Leute,

habe ein Problem mit der AppBar über SHAppBarMessage unter Lazarus...

Die AppBar wird erstellt, aber andere Fenster können immer noch in diesen Bereich gehen.
Er sollte für sie gesperrt. Unter Delphi habe ich es hinbekommen.

Hat jemand einen Tipp für mich?

Karsten

Code: Alles auswählen

 
procedure TForm1.Button1Click(Sender: TObject);
begin
  with AppBarData do
  begin
    cbSize := SizeOf(TAppBarData);
    hWnd := Form1.Handle;
    uCallbackMessage := WM_APP;
    uEdge := ABE_TOP;
    rc.Left := 0;
    rc.Top := 0;
    rc.Right := Screen.Width;
    rc.Bottom := 50;
  end;
  if SHAppBarMessage(ABM_NEW, @AppBarData) = 0 then
  begin
    ShowMessage('AppBar konnte nicht registriert werden');
    exit;
  end;
  SHAppBarMessage(ABM_QUERYPOS, @AppBarData);
  SHAppBarMessage(ABM_SETPOS, @AppBarData);
  Form1.BorderStyle := bsNone;
  Form1.FormStyle := fsSystemStayOnTop;
  MoveWindow(Form1.Handle, 0, 0, Screen.Width, 50, True);
end;
 

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Probleme mit AppBar

Beitrag von Michl »

Ok, habe mal ein bischen probiert. Bei mir funktioniert folgender Code problemlos:

Code: Alles auswählen

uses
  Windows, ..., ShellApi; 
...
procedure TForm1.Button1Click(Sender: TObject);
var
  ABD: TAppBarData;
begin
  Self.BorderStyle := bsNone;
 
  ABD.cbSize := SizeOf(TAppBarData);
  ABD.hWnd := Self.Handle;
  ABD.uCallbackMessage := WM_USER + $01;
  ABD.uEdge := ABE_TOP;
  ABD.lParam := ABS_ALWAYSONTOP;
  ABD.rc.Left := 0;
  ABD.rc.Top := 0;
  ABD.rc.Right := Screen.Width;
  ABD.rc.Bottom := 50;
 
  if SHAppBarMessage(ABM_NEW, @ABD) = 0 then
  begin
    ShowMessage('AppBar konnte nicht registriert werden');
    exit;
  end;
  SHAppBarMessage(ABM_QUERYPOS, @ABD);
  SHAppBarMessage(ABM_SETPOS, @ABD);
 
  Application.ProcessMessages;
  MoveWindow(Self.Handle, 0, 0, Screen.Width, 50, True);
end;
Das Problem ist, wenn Du das Borderstyle Deiner Form nachträglich änderst, wird windowsintern dieses wieder, von einer Appbar, in eine normale Form verwandelt. Am längsten hatte ich gesucht, warum das MoveWindow nicht funktionierte...ein Application.ProcessMessages war dann die einfache und zielführende Lösung.

Weitere Infos: http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

gekd1407
Beiträge: 10
Registriert: Sa 17. Aug 2013, 22:09
OS, Lazarus, FPC: Win10/11pro 64Bit (L 2.2.6 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Marl

Re: Probleme mit AppBar

Beitrag von gekd1407 »

Hallo Michl,

danke für Deine Hilfe.
Habe schon getestet und es funzt.

Deine Einwand zum BorderStyle kann ich nach vollziehen.
Unter Delphi hatte es so geklappt...
Wieder was gelernt.

Karsten

Antworten