Добавить тень к окну с без рамок (почти получилось)

Окно без рамок (BorderStype = bsNone) может выглядеть слишком плоско и непривычно. Поэтому поискав в интернете смог понять, как добавить тень вручную:

  TForm1 = class(TForm)
   ...
   procedure CreateParams(var Params:TCreateParams); override;
  end;
 
procedure TForm1.CreateParams(var Params:TCreateParams);
 begin
  inherited;
  Params.Style:=Params.Style or WS_SIZEBOX; //WS_THICKFRAME
 end;

Результат оказался тем, что нужно, но с некоторой неожиданностью. Помимо тени так же появилась тонкая белая полоса на месте заголовка окна (Windows 10).

Окно без рамок с тенью

Моих навыков уже не достаточно, чтобы убрать её самостоятельно. На этом мои полномочия окончены :C

  1. Как убрать эту белую полоску?
  2. Или как иначе можно добавить обычную тень (как у окон с рамкой) к окну без рамок?
  3. Ещё был вариант с Params.WindowClass.Style := Params.WindowClass.Style or CS_DROPSHADOW;, но это не подходит. Тень совсем другая и не годится для окна с возможностью изменения размера.

Ответы (1 шт):

Автор решения: ugorek

Это решило все мои проблемы:

 
interface
 
 uses
  Windows,Messages,SysUtils,Controls,Forms,DwmApi,UxTheme,Classes,StdCtrls;
 
 type
  TForm1=class(TForm)
   function SetBordelessShadow:Boolean;
   procedure CreateWindowHandle(const AParams:TCreateParams); override;
   procedure WndProc(var AMsg:TMessage); override;
  end;
 
 var
  Form1:TForm1;
 
implementation
 
{$R *.dfm}
 
function TForm1.SetBordelessShadow:Boolean;
  var
   LMargins:TMargins;
   LPolicy:LongInt;
 begin
  LPolicy:=DWMNCRP_ENABLED;
  Result:=Succeeded(DwmSetWindowAttribute(Handle,DWMWA_NCRENDERING_POLICY,@LPolicy,SizeOf(Integer)))and(DwmCompositionEnabled);
  if Result then
   begin
    LMargins.cxLeftWidth:=1;
    LMargins.cxRightWidth:=1;
    LMargins.cyTopHeight:=1;
    LMargins.cyBottomHeight:=1;
    Result:=Succeeded(DwmExtendFrameIntoClientArea(Handle,LMargins));
   end;
 end;
 
procedure TForm1.CreateWindowHandle(const AParams: TCreateParams);
 begin
  inherited;
  if TOSVersion.Major>=6 then
   SetBordelessShadow;
 end;
 
procedure TForm1.WndProc(var AMsg:TMessage);
 begin
  case AMsg.Msg of
   WM_DWMCOMPOSITIONCHANGED,WM_DWMNCRENDERINGCHANGED:
    if SetBordelessShadow then
     Exit;
  end;
  inherited;
 end;
 
end.
→ Ссылка