НИИ МЛЯ
(прокрастинация. профанация. прострация.)
На главную Отдел ИИ Отдел ПА Отдел РП Лаборатория ЕН Лаборатория ЭХ
Лаборатория разработки программ

TurboPascal 7.0 - Рисование линий мышью в графическом режиме

(Принято к публикации 2014-11-07)

Хочется... Хочется иногда тряхнуть стариной и сделать что-нибудь этакое... винтажное... Вспомнить, одним словом, как программировали наши дедушки в своём пионерском детстве.

PROGRAM test0;

USES
    DOS, Crt, Graph;

    FUNCTION InitMouse :Boolean;
    VAR
        Reg :Registers;
    BEGIN
    Reg.AX := $0;
    Reg.BX := $0;
    Intr($33, Reg);
    InitMouse := (Reg.AX = $FFFF);
    END;

    PROCEDURE GetMouseXYB(var x, y, b:Integer);
    VAR
        Reg :Registers;
    BEGIN
    Reg.AX := $3;
    Intr($33, Reg);
    b := Reg.BX;
    x := Reg.CX;
    y := Reg.DX;
    END;

    PROCEDURE DrawMouseCursor(x, y:Integer);
    BEGIN
    SetColor(10);
    SetWriteMode(XorPut);
    Line(x, y, x, y+10);
    Line(x+1, y+10, x+4, y+7);
    Line(x+5, y+7, x+7, y+7);
    Line(x+6, y+6, x, y);
    END;

VAR
    Dr, Mo            :Integer;

    x, y, b           :Integer;

    mouse_x, mouse_y  :Integer;

    line_x0, line_y0,
    line_x1, line_y1  :Integer;

BEGIN

mouse_x := -1;
line_x0 := -1;

Dr := Detect;
InitGraph(Dr, Mo, 'c:\tp7\bgi');

InitMouse;

REPEAT
    GetMouseXYB(x, y, b);
    IF (mouse_x <> x) OR (mouse_y <> y) THEN
        BEGIN
        IF (mouse_x >= 0) THEN
            DrawMouseCursor(mouse_x, mouse_y);
        mouse_x := x;
        mouse_y := y;
        DrawMouseCursor(mouse_x, mouse_y);
        END;

    IF (b AND 1 <> 0) THEN
        BEGIN
        IF (line_x0 < 0) THEN
            BEGIN
            line_x0 := mouse_x;
            line_y0 := mouse_y;
            line_x1 := mouse_x;
            line_y1 := mouse_y;
            SetColor(15);
            SetWriteMode(XorPut);
            Line(line_x0, line_y0, line_x1, line_y1);
            END;
        IF (mouse_x <> line_x1) OR (mouse_y <> line_y1) THEN
            BEGIN
            SetColor(15);
            SetWriteMode(XorPut);
            Line(line_x0, line_y0, line_x1, line_y1);
            line_x1 := mouse_x;
            line_y1 := mouse_y;
            Line(line_x0, line_y0, line_x1, line_y1);
            END;
        END
    ELSE
        BEGIN
        IF (line_x0 >= 0) THEN
            BEGIN
            DrawMouseCursor(mouse_x, mouse_y);
            SetColor(15);
            SetWriteMode(NormalPut);
            Line(line_x0, line_y0, line_x1, line_y1);
            line_x0 := -1;
            DrawMouseCursor(mouse_x, mouse_y);
            END;
        END;
UNTIL KeyPressed;

ReadKey;

CloseGraph;

END.