procedure TZoom.DrawMonitor;
var
X, Y, TempX, TempY: real;
begin
// Находим размеры области "увеличительного стекла"
FormMonitor := Rect( 0, 0, Zoom.Width, Zoom.Height );
// "Область увеличения" вокруг курсора
S := Rect( Kursor.X - Round( Zoom.Width / 2 / _Zoom ),
Kursor.Y - Round( Zoom.Height / 2 / _Zoom ),
Kursor.X + Round( Zoom.Width / 2 / _Zoom ),
Kursor.Y + Round( Zoom.Height / 2 / _Zoom ) );
{ Альтернативный способ установки "Области увеличения"
X := Image.Width / ( _Zoom * 2 );
Y := Image.Height / ( _Zoom * 2 );
// Позиционируем "Область увеличения" в точку курсора
S := Rect( Kursor.x, Kursor.y, Kursor.x, Kursor.y );
// Растягиваем "Область увеличения" с учетом коэффициента увеличения
InflateRect( S, Round( X ), Round( Y ) ); }
X := Image.Width / ( _Zoom * 2 );
Y := Image.Height / ( _Zoom * 2 );
// Позиционируем "Область увеличения" в точку курсора
S := Rect( Kursor.x, Kursor.y, Kursor.x, Kursor.y );
// Растягиваем "Область увеличения" с учетом коофициента увеличения
InflateRect( S, Round( X ), Round( Y ) );
// Проверка выхода "Области увеличения" за границы экрана
if S.Left < 0 then OffsetRect( S, -S.Left, 0 );
if S.Top < 0 then OffsetRect( S, 0, -S.Top );
if S.Right > Screen.Width then
OffsetRect( S, -( S.Right - Screen.Width ), 0 );
if S.Bottom > Screen.Height then
OffsetRect( S, 0, -( S.Bottom - Screen.Height ) );
C := TCanvas.Create;
try
C.Handle := GetDC( GetDesktopWindow );
Image.Canvas.CopyRect( FormMonitor, C, S );
// Рисуем крестик в центре линзы и рамку по контуру линзы
with Image.Canvas do
begin
// Рисуем крестик
TempX := _Zoom * ( Kursor.X - S.Left );
TempY := _Zoom * ( Kursor.Y - S.Top );
MoveTo( Round( TempX - ( Image.Width div 8 ) ), Round( TempY ) );
LineTo( Round( TempX + ( Image.Width div 8 ) ), Round( TempY ) );
MoveTo( Round( TempX ), Round( TempY - ( Image.Height div 8 ) ) );
LineTo( Round( TempX ), Round( TempY + ( Image.Height div 8 ) ) );
// Рисуем рамку
MoveTo( 0, 0 );
LineTo( Width-1, 0 );
LineTo( Width-1, Height-1 );
LineTo( 0, Height-1 );
LineTo( 0, 0 );
end;
finally
ReleaseDC( 0, C.Handle );
C.Free;
end;
Application.ProcessMessages;
end;
|