unit Unit1;
interface
uses
Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.ExtCtrls, Magnification,
Vcl.StdCtrls;
type
TForm1 =
class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
Initialized: BOOL;
magWindowRect: TRect;
hwndMag: HWND;
HandleToMagnifier: HWND;
function MyCreateDIBSection(
DC: HDC; Width, Height: integer; BitCount: integer): HBITMAP;
procedure DrawMagnifier(Width, Height: Integer);
procedure RefreshMagnifier(rc:TRect);
// procedure ResizeMagnifier;
procedure InitializeMagnifier;
public
{ Public declarations }
end;
const
MagFactor = 2.0;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.MyCreateDIBSection(
DC: HDC; Width, Height, BitCount: integer): HBITMAP;
var
lpbmi: TBitmapInfo;
P: Pointer;
AbITmAP : hbitmap;
db : tbitmap;
begin
Fillchar(lpbmi, SizeOf(TBitmapInfo), 0);
lpbmi.bmiHeader.biSize := sizeof(lpbmi.bmiHeader);
lpbmi.bmiHeader.biHeight := - Height;
lpbmi.bmiHeader.biWidth := width;
lpbmi.bmiHeader.biPlanes := 1;
lpbmi.bmiHeader.biBitCount := BitCount;
lpbmi.bmiHeader.biCompression := BI_RGB;
Result := CreateDIBSection(
DC, lpbmi, DIB_RGB_COLORS, P, 0, 0);
end;
procedure TForm1.DrawMagnifier(Width, Height: Integer);
var
aBitmap: HBITMAP;
DC: HDC;
bmp: TBitmap;
begin
DC := GetWindowDC(HwndMag);
bmp := TBitmap.Create;
aBitmap := 0;
try
aBitmap := Form1.MyCreateDIBSection(
DC, Width, Height, 32);
SelectObject(
DC, aBitmap);
bmp.Handle := aBitmap;
bmp.SaveToFile('
Screen.bmp');
finally
DeleteObject(aBitmap);
DeleteDC(
DC);
bmp.Free;
end;
end;
procedure TForm1.RefreshMagnifier(rc: TRect);
begin
MagSetWindowSource(hwndMag, rc);
SetWindowPos(
Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE
or SWP_NOMOVE
or SWP_NOSIZE);
InvalidateRect(hwndMag, rc, true);
end;
procedure TForm1.InitializeMagnifier;
var
matrix: TMagTransform;
desktop : hwnd;
desktoprect, sourceRect: TRect;
filterList: THWNDArray;
m_ScreenX, m_ScreenY, m_ScreenT, m_ScreenL: Integer;
begin
desktop := GetDesktopWindow;
GetWindowRect(desktop, desktoprect);
m_ScreenT := desktoprect.Top;
m_ScreenL := desktoprect.Left;
m_ScreenX := desktoprect.right;
m_ScreenY := desktoprect.bottom;
hwndMag := CreateWindow(WC_MAGNIFIER, '
MagnifierWindow',
WS_CHILD
or MS_SHOWMAGNIFIEDCURSOR, 0, 0, m_ScreenX,
m_ScreenY, Form1.handle, 0, hInstance,
nil);
if hwndMag = 0
then
close;
FillChar(matrix, Sizeof(matrix), 0);
matrix.v[0][0] := MagFactor;
matrix.v[1][1] := MagFactor;
matrix.v[2][2] := 1.0;
if MagSetWindowTransform(hWndMag, matrix)
then
// tmr1.Enabled := true;
end;
procedure MagScreenShot;
var
desktop : hwnd;
desktoprect, sourceRect: TRect;
filterList: THWNDArray;
m_ScreenX, m_ScreenY, m_ScreenT, m_ScreenL: Integer;
begin
Form1.WindowState := wsMaximized;
desktop := GetDesktopWindow;
GetWindowRect(desktop, desktoprect);
Form1.DrawMagnifier(desktoprect.Right, desktoprect.Bottom);
Form1.RefreshMagnifier(desktoprect);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MagScreenShot;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Initialized := MagInitialize;
if not Initialized
then
begin
Application.MessageBox('
Init magnification failed', '
Error',
mb_Ok + mb_IconError);
close;
end;
InitializeMagnifier;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if (initialized)
then
MagUninitialize;
end;
end.