Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Problem mit Vista und Taskbar-Preview (https://www.delphipraxis.net/94280-problem-mit-vista-und-taskbar-preview.html)

Assertor 19. Jun 2007 09:50


Problem mit Vista und Taskbar-Preview
 
Hallo DPler,

ich habe da ein Problem. Es geht um Vista und die Taskbar-Preview.

Ich verwende eine AboutBox mit dem BorderStyle "bsNone". Wenn ich nun die Taskbar und/oder Flip3D Preview durchgehe, wird nur ein Teil meines MainForms in der Größe der AboutBox gezeigt.

Ach ja: Ich habe die "Korrekturen" für die Delphi Form Aktivierung richtig drin, wirklich ;) Von beiden Seiten bei InstallationExcellence.

Die normale Preview klappt ja auch, aber sobal ein Modalform mit Borderstyle bsNone auf ist, wird der Ausschnitt kleiner.

Ich habe dann testhalber dem Modalform mal ein eigenen Taskbarbutton verpasst und dann ist es so, daß der Preview des Modals perfekt ist (wie sonst auch beim MainForm), aber das MainForm dann plötzlich im Preview nur einen Ausschnitt in der Größe der AboutBox zeigt. :?:

Was kann man da machen?

Gruß winkel79

Hier die üblichen bekannten:

MainForm:
Delphi-Quellcode:
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle and not WS_EX_TOOLWINDOW or
    WS_EX_APPWINDOW;
end;

procedure TForm1.WMSyscommand(var Message: TWmSysCommand);
begin
  case (Message.CmdType and $FFF0) of
    SC_MINIMIZE:
    begin
      ShowWindow(Handle, SW_MINIMIZE);
      Message.Result := 0;
    end;
    SC_RESTORE:
    begin
      ShowWindow(Handle, SW_RESTORE);
      Message.Result := 0;
    end;
  else
    inherited;
  end;
end;

procedure TForm1.WMActivate(var Message: TWMActivate);
begin
  if (Message.Active = WA_ACTIVE) and not IsWindowEnabled(Handle)
    and not (IsWindowEnabled(Application.Handle)) then
  begin
    SetActiveWindow(Application.Handle);
    Message.Result := 0;
  end else
    inherited;
end;

...

procedure TForm1.Create(Sender: TObject);
begin
  ...
  if not (csDesigning in ComponentState) then
  begin
    ShowWindow(Application.Handle, SW_HIDE);
    SetWindowLong(Application.Handle, GWL_EXSTYLE,
      GetWindowLong(Application.Handle, GWL_EXSTYLE) and not WS_EX_APPWINDOW
      or WS_EX_TOOLWINDOW);
    ShowWindow(Application.Handle, SW_SHOW);
  end;
  ...
end;
und halt ggf. im ModalForm die gleichen CreateParams, damit es auch einen Taskbar-Button bekommt.

Assertor 19. Jun 2007 13:58

Re: Problem mit Vista und Taskbar-Preview
 
Ich habe gerade rausgefunden, daß es nur zu einem falschen Preview kommt, wenn die AboutBox als BorderStyle "bsNone" und als Position "poMainFormCenter" oder "poOwnerFormCenter" hat...

Ich suche jetzt in der Forms.pas nach den Unterschieden, denke aber das hat irgendwas mit VCL Eigenheiten zu tun (SetBounds für das Modal).

Edit: Es ist tatsächlich ein Problem mit SetBounds. Wenn ich als Position "poDefaultPosOnly" eingebe und manuell im OnShow: SetBounds(300, 500, Width, Height) aufrufe, tritt das Problem auch auf. :wall:

Also geht die Suche in Controls.pas los...

Assertor 19. Jun 2007 15:17

Re: Problem mit Vista und Taskbar-Preview
 
Das Problem tritt tatsächlich in dieser Konstellation immer auf.

Für alle anderen, die etwas langsamer sind und erst in ein paar Monaten überhaupt auf das Problem aufmerksam werden (so wie mit meinen Threads über Indy oder die Vista Tooltips/QC bei Codegear) jetzt die Erklärung und Lösung ;)

Betroffen:
Alle Pre-D2007, Getestet mit leerer Installation

Konstellation:
1) Applikation enthält Fix von InstallationExcellence, um TaskBarPreview zu ermöglich
2) ModalForm hat BorderStyle "bsNone" und Position "poMainFormCenter"/"poScreenCenter".
Das Parent wird vor ShowModal korrekt festgelegt (unerheblich für den Fehler)

Auswirkung:
MainForm erhält im Taskbar Preview/Flip3D ein Cropped-Thumbnail (also nur in der Größe des Modals und zusätzlich seitlich verschoben).

Lösung:
Im CreateParams des Modals fest einstellen:
Delphi-Quellcode:
procedure TfrmMyModal.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle or WS_EX_TOOLWINDOW;
end;
Dann geht alles!

Gruß winkel79

:dp:

Edit: Hat das eigentlich was zu bedeuten, wenn man die meisten seiner Threads selber beantwortet, insbesondere immer bei diesen komplizierten Bugs? ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:28 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