unit kz.forms.dimm;
(*
project: dimmed form class
author: KodeZwerg
copyright: (c) 2024 by KodeZwerg
license: Royalty free, the unlicense
*)
{$Define Debug}
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, Forms, Graphics, Controls {$If Defined(Debug)}, Dialogs{$IfEnd};
type
{ TkzDimmedForm }
TkzDimmedForm = class(TObject)
strict private
FDimmedForm: TForm;
strict private
function FormTop(const AForm: TForm): Integer;
function FormLeft(const AForm: TForm): Integer;
function FormHeight(const AForm: TForm): Integer;
public
constructor Create(const AForm: TForm; const AColor: TColor = clBlack; const AAlphaBlendValue: Integer = 127);
destructor Destroy; override;
end;
implementation
{ TkzDimmedForm }
constructor TkzDimmedForm.Create(const AForm: TForm; const AColor: TColor = clBlack; const AAlphaBlendValue: Integer = 127);
begin
inherited Create;
FDimmedForm := nil;
if (not Assigned(AForm)) then
raise Exception.Create('TkzDimmedForm - Error, source form not assigned!');
FDimmedForm := TForm.CreateNew(nil, 0);
FDimmedForm.AlphaBlend := True;
FDimmedForm.AlphaBlendValue := AAlphaBlendValue;
FDimmedForm.Color := AColor;
FDimmedForm.BorderIcons := [];
FDimmedForm.BorderStyle := bsNone;
FDimmedForm.Top := FormTop(AForm);
FDimmedForm.Left := FormLeft(AForm);
FDimmedForm.Width := AForm.ClientRect.Width;
FDimmedForm.Height := FormHeight(AForm);
FDimmedForm.Visible := True;
{$If Defined(Debug)}
ShowMessage(Format('Top: %d Left: %d Width: %d Height: %d' + sLineBreak +
'Top: %d Left: %d Width: %d Height: %d' ,
[FDimmedForm.Top, FDimmedForm.Left, FDimmedForm.Width, FDimmedForm.Height,
AForm.Top, AForm.Left, AForm.Width, AForm.Height]));
{$IfEnd}
end;
destructor TkzDimmedForm.Destroy;
begin
if FDimmedForm <> nil then
begin
FDimmedForm.Free;
FDimmedForm := nil;
end;
inherited Destroy;
end;
function TkzDimmedForm.FormHeight(const AForm: TForm): Integer;
var
global_pos: TPoint;
begin
global_pos := AForm.ClientToScreen(Point(0, 0));
Result := global_pos.Y - Succ(AForm.Top) + AForm.ClientHeight;
end;
function TkzDimmedForm.FormTop(const AForm: TForm): Integer;
var
global_pos: TPoint;
begin
global_pos := AForm.ClientToScreen(Point(0, 0));
Result := Screen.Monitors[Screen.MonitorFromWindow(AForm.Handle, mdNearest).MonitorNum].Top + global_pos.Y - (Screen.Monitors[Screen.MonitorFromWindow(AForm.Handle, mdNearest).MonitorNum].Top + (FormHeight(AForm) - AForm.ClientRect.Height));
end;
function TkzDimmedForm.FormLeft(const AForm: TForm): Integer;
var
global_pos: TPoint;
begin
global_pos := AForm.ClientToScreen(Point(0, 0));
Result := Screen.Monitors[Screen.MonitorFromWindow(AForm.Handle, mdNearest).MonitorNum].Left + global_pos.X;
end;
end.