Добавить тень к окну с без рамок (почти получилось)
Окно без рамок (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
- Как убрать эту белую полоску?
- Или как иначе можно добавить обычную тень (как у окон с рамкой) к окну без рамок?
- Ещё был вариант с
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.
