Другие языки программирования и технологии

Как в Паскале можно описать курсор мыши? Именно вывести его на экран и определить его положение при выполнении программы

Доброго времени суток.

Для графического режима можно использовать такой модуль

unit GMouse;
{$O+}
interface
uses Objects;
type
TCursorShape = (csArrow, csCross, csWatch);
TCursor = record BitMap : array[1..32] of Word; ZeroW, ZeroH: Word; Shape: TCursorShape; end;

const
CursorVisible : Boolean = False;
mbMiddleButton = 4;

CursorShape : TCursorShape = csArrow;

{ Cursor shape records }
ArrowCursor : TCursor = (
BitMap : ($9fff,$8fff,$87ff,$83ff,$81ff,$80ff,$807f,$803f,
$801f,$800f,$80ff,$887f,$987f,$fc3f,$fc3f,$fe7f,
$0000,$2000,$3000,$3800,$3c00,$3e00,$3f00,$3f80,
$3fc0,$3e00,$3600,$2300,$0300,$0180,$0180,$0000);
ZeroW : $0000;
ZeroH : $00ff;
Shape : csArrow );

CrossCursor : TCursor = (
BitMap : ($ffff,$ffff,$feff,$feff,$feff,$feff,$feff,$c007,
$feff,$feff,$feff,$feff,$feff,$ffff,$ffff,$ffff,
$0000,$0000,$0100,$0100,$0100,$0100,$0100,$3ff8,
$0100,$0100,$0100,$0100,$0100,$0000,$0000,$0000);
ZeroW : $0007;
ZeroH : $0007;
Shape : csCross);

GlassWatch : TCursor = (
BitMap : ($8003,$efef,$efef,$efef,$f45f,$fabf,$fd7f,$fc7f,
$fd7f,$fbbf,$f7df,$eeef,$ec6f,$e82f,$8003,$ffff,
$7ffc,$1010,$1010,$1010,$0ba0,$0540,$0280,$0380,
$0280,$0440,$0820,$1110,$1390,$17d0,$7ffc,$0000);
ZeroW : $0007;
ZeroH : $0007;
Shape : csWatch);

procedure ShowMouse;
procedure HideMouse;
procedure GetMousePos(var P: TPoint);
procedure SetMousePos(P: TPoint);
procedure SetMouseRegionX(NewX,NewY: Integer);
procedure SetMouseRegionY(NewX,NewY: Integer);
procedure SetMouseRegion(R: TRect);
procedure SetCursorShape(Shape: TCursorShape);

implementation
uses Dos;

procedure ShowMouse;
begin
if not CursorVisible then
asm
push ax
mov ax, 0001h
int 33h
pop ax
end;
CursorVisible:=True;
end;

procedure HideMouse;
begin
if CursorVisible then
asm
push ax
mov ax, 0002h
int 33h
pop ax
end;
CursorVisible:=False;
end;

procedure GetMousePos(var P: TPoint);
var
R : Registers;
begin
R.AX:=3;
Intr($33, R);
P.X:=R.CX;
P.Y:=R.DX;
end;

procedure SetMousePos(P: TPoint);
var
R : Registers;
begin
R.AX:=4;
R.Cx:=P.X;
R.DX:=P.Y;
Intr($33, R);
end;

procedure SetMouseRegionX(NewX,NewY: Integer);
var
R : Registers;
begin
R.AX:=7;
R.Cx:=NewX;
R.DX:=NewY;
Intr($33, R);
end;

procedure SetMouseRegionY(NewX,NewY: Integer);
var
R : Registers;
begin
R.AX:=8;
R.CX:=NewX;
R.DX:=NewY;
Intr($33, R);
end;

procedure SetMouseRegion(R: TRect);
begin
SetMouseRegionX(R.A.X, R.B.X);
SetMouseRegionY(R.A.Y, R.B.Y);
end;

procedure SetCursorShape(Shape: TCursorShape);
var
Sg, Off : Word;
Cursor : TCursor;
begin
case Shape of
csArrow : Cursor:=ArrowCursor;
csCross : Cursor:=CrossCursor;
csWatch : Cursor:=GlassWatch;
else Exit;
end;
Sg:=Seg(Cursor.BitMap);
Off:=Ofs(Cursor.BitMap);
asm
mov ax, 0009h
mov bx, Cursor.ZeroW
mov cx, Cursor.ZeroH
mov es, Sg
mov dx, Off
int 33h
end;
CursorShape:=Cursor.Shape;
end;

end.

Остальные функции 33 прерывания, которое отвечает за работу с курсором не реализовывал за ненадобностью.

Удачи!
Maxim Anisimov
Maxim Anisimov
59 613
Лучший ответ
Turbo Pascal - Учебник (С. А. Немнюгин)
Глава 4, 5 - Использование мыши в текстовом и графическом режимах
Слава Диор
Слава Диор
7 015