1 (изменено: Freeman, 05.12.2020 в 16:55)

Тема: Magnify

Этот пример отображает увеличенную область экрана под указателем мыши.

misc.php?action=pun_attachment&item=60&download=0

Исходный код:

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 — уже скомпилированное и сжатое приложение.

Post's attachments

Иконка вложений Magnify.kex 799 b, 114 скачиваний с 2020-10-07 

magnify.PNG, 7.83 Кб, 373 x 392
magnify.PNG 7.83 Кб, 75 скачиваний с 2020-10-07