Тема: Magnify
Этот пример отображает увеличенную область экрана под указателем мыши.
Исходный код:
program Magnify;
uses
KolibriOS;
const
WINDOW_BORDER_SIZE = 5; // defined by kernel
DL_INVERT_COLOR = $1000000; // flag for DrawLine procedure
GAP = 3; // between rectangles
AREA_MARGIN = 12;
M = 17;
var
WndLeft, WndTop: LongInt;
WndHeight: LongWord;
WndWidth: LongWord = WINDOW_BORDER_SIZE * 2 + AREA_MARGIN * 2 + M * M + GAP * (M - 1) + 1;
function EnsureRange(Min, Max, Value: LongInt): LongInt;
begin
if Value < Min then
EnsureRange := Min
else
if Value > Max then
EnsureRange := Max
else
EnsureRange := Value;
end;
procedure DrawArea;
var
Scr: TSize;
MousePos: TPoint;
i, j, X, Y, Color, T, L: LongInt;
begin
MousePos := GetMousePos;
Scr := GetScreenSize;
j := 0;
While j < M do
begin
L := j * (M + Gap) + AREA_MARGIN + 1;
X := MousePos.X + j - M div 2;
i := 0;
While i < M do
begin
T := i * (M + Gap) + AREA_MARGIN + 1;
Y := MousePos.Y + i - M div 2;
X := EnsureRange(0, Scr.Width - 1, X);
Y := EnsureRange(0, Scr.Height - 1, Y);
Color := GetPixel(X, Y);
DrawRectangle(L, T, M, M, Color);
Inc(i);
End;
Inc(j);
End;
DrawLine(
M div 2 * (M + GAP) + AREA_MARGIN + 1 + M div 2,
M div 2 * (M + GAP) + AREA_MARGIN + 1 - GAP div 2,
M div 2 * (M + GAP) + AREA_MARGIN + 1 + M div 2,
M div 2 * (M + GAP) + AREA_MARGIN + 1 + M + GAP div 2 - 1,
DL_INVERT_COLOR);
DrawLine(
M div 2 * (M + GAP) + AREA_MARGIN + 1 - GAP div 2,
M div 2 * (M + GAP) + AREA_MARGIN + 1 + M div 2,
M div 2 * (M + GAP) + AREA_MARGIN + 1 + M + GAP div 2 - 1,
M div 2 * (M + GAP) + AREA_MARGIN + 1 + M div 2,
DL_INVERT_COLOR);
End;
begin
WndHeight := WINDOW_BORDER_SIZE + GetSkinHeight + AREA_MARGIN * 2 + M * M + GAP * (M - 1) + 1;
with GetScreenSize do
begin
WndLeft := (Width - WndWidth) div 2;
WndTop := (Height - WndHeight) div 2;
end;
SetEventMask(EM_REDRAW or EM_BUTTON);
while True do
case CheckEvent of
REDRAW_EVENT:
begin
BeginDraw;
DrawWindow(WndLeft, WndTop, WndWidth, WndHeight, 'Magnify', $00CFCFCF,
WS_SKINNED_FIXED + WS_CLIENT_COORDS + WS_CAPTION, CAPTION_MOVABLE);
EndDraw;
end;
BUTTON_EVENT:
Break;
else
DrawArea;
end;
end.
Я думаю, что вот эти константы необходимо вынести в модуль KolibriOS
const
WINDOW_BORDER_SIZE = 5; // defined by kernel
DL_INVERT_COLOR = $1000000; // flag for DrawLine procedure
Лет эдак 8 назад я делал похожую программу на ассемблере: MagniPicker
Также прикладываю Magnify.kex — уже скомпилированное и сжатое приложение.