Помогите.
Мне нужно мышью рисовать линии на экране (т.е. нажал на одно место экрана, потом потащил (мышь) и линия рисуется за ней).
Пробовал по разному, но при перетаскивании постоянно остаются какие-нибудь следы.
Думаю, что нужно ставить свои обработчики (процедуры) на действия мыши, но не знаю как.
Помогите кто может.
P.S. может есть другие способы рисования линий таким способом.
Конечно можно, ты знаком с ассемблером? Но это для написания своего обработчика. Впрочем, можно обойтись и паскалем. А следы остаются от того, что указатель мыши нужно скрывать при каждом прямом доступе к видеопамяти
Я очень надеюсь, что это применяется в графическом режиме... (режим?, драйвер?)
Вряд ли он рисует их в режиме 0-3.. ;)
Хотя принципиально - это возможно
Вообще-то действительно вряд ли... Извиняюсь, стормозил... ( просто у меня где-то валялся пакет для изменения указателя мыши для текстового режима /вид и движения получались как в графическом режиме/)
Тогда очень интересно как, и с помощью чего выводится указатель мыши?
У меня, например, таких проблем с мышью не наблюдалось.
Дык с помощью дров ессесно. Существует два части в стандартном драйвере от микрософта: монитор мыши и монитор экрана. Первый считает кол-во шагов, а второй следит за перемещением указателя и если чо, увеличивает скорость перемещения. На физическом уровне это осуществляется путем сохранения части экрана, затем туда накладывается изображение курсора, после восстанавливается действительное изображение. Как следствие перед прямым доступом к видеопамяти следует скрывать указатель.
И ишшо бывает телега по типу почему указатель не появляется в VESA-режимах, дык это значит драйвер старенький и не поддерживает вывод курсора в этих режимах (100h-101h-...), но можно поставить свой обработчик и, следственно, выводить свой курсор...
типа того
Я делаю так:
MOUSE.INC
Procedure SetMouse( Shape: Word ); Far; External;
{$L SETMOUSE.OBJ}
Procedure GetMousePosition( Var X, Y: Word);
Var
R: Registers;
begin
With R do
begin
ax := 3;
Intr( $33, R );
X := cx;
Y := dx;
end;
end;
Function GetMouseStatus: Byte; assembler;
asm
mov ax, 3
int 33h
mov ax, bx
end;
Function GetMouse: Byte;
Var
Status: Byte;
ST: Boolean;
begin
ST := False;
Repeat
Status := GetMouseStatus;
If( Status and 1 = 0 ) and
( Status and 2 = 0 ) and
( Status and 4 = 0 ) then ST := True;
Until ST;
ST := False;
Repeat
Status := GetMouseStatus;
If( Status and 1 = 1 ) or
( Status and 2 = 2 ) or
( Status and 4 = 4 ) then ST := True;
Until ST;
GetMouse := Status;
end;
Procedure Mouse; assembler;
asm
xor ax, ax
int 33h
mov ax, 0Fh
mov cx, 6
mov dx, 12
int 33h
mov ax, 7
mov cx, 0
mov dx, 639
int 33h
mov ax, 8
mov cx, 0
mov dx, 349
int 33h
mov ax, 4
mov cx, 0
mov dx, 0
int 33h
end;
Procedure ShowMouse; assembler;
asm
mov ax, 1
int 33h
end;
Procedure HideMouse; assembler;
asm
mov ax, 2
int 33h
end;
Model TPascal
.Radix 16
locals
.code
PUBLIC SetMouse
proc SetMouse Shape: Word
push ds
push cs
push cs
pop es
pop ds
mov si, [Shape]
cmp si, 25D
jb @@1
mov si, 24D
@@1:
dec si
shl si, 1
mov dx, cs:Shape_Adr[si]
mov bx, cs:Hot_X[si]
mov cx, cs:Hot_Y[si]
mov ax, 9
int 33h
pop ds
ret;**************************************************************************
**
Hot_X dw 8D
Hot_Y dw 8D;***************************************************************************
*
Shape_Adr dw Shape_1;**********************************************************************
******
Shape_1:
dw 0011111111111111B
dw 0001111111111111B
dw 0000111111111111B
dw 0000011111111111B
dw 0000001111111111B
dw 0000000111111111B
dw 0000000011111111B
dw 0000000001111111B
dw 0000000001111111B
dw 0000000111111111B
dw 1110000111111111B
dw 1111000011111111B
dw 1111000011111111B
dw 1111111111111111B
dw 1111111111111111B
dw 1111111111111111B
dw 0000000000000000B
dw 0100000000000000B
dw 0110000000000000B
dw 0111000000000000B
dw 0111100000000000B
dw 0111110000000000B
dw 0111111000000000B
dw 0111111100000000B
dw 0111110000000000B
dw 0000110000000000B
dw 0000010000000000B
dw 0000011000000000B
dw 0000000000000000B
dw 0000000000000000B
dw 0000000000000000B
dw 0000000000000000B
endp
end
Uses Drivers, Graph;
...
type DacPalette256 = array[0..255] of array[0..2] of Byte;
const
SVGA320x200x256 = 0; (* 320x200x256 Standard VGA *)
SVGA640x400x256 = 1; (* 640x400x256 Svga *)
SVGA640x480x256 = 2; (* 640x480x256 Svga *)
SVGA800x600x256 = 3; (* 800x600x256 Svga *)
SVGA1024x768x256 = 4; (* 1024x768x256 Svga *)
(* R,G,B values range from 0 to 63 *)
procedure SetVGAPalette256(PalBuf : DacPalette256);
var
Reg : Registers;
begin
reg.ax := $1012;
reg.bx := 0;
reg.cx := 256;
reg.es := Seg(PalBuf);
reg.dx := Ofs(PalBuf);
intr($10,reg);
end;
Procedure SVGA256M; Far; External;
{$L SVGA256M.OBJ}
Procedure Littr; Far; External;
{$L Littr.OBJ}
Procedure GetMousePosition( Var X, Y: Word ); Forward;
Procedure GetEvents( Var Event: TEvent );
begin
GetMouseEvent( Event );
If( Event.What and evMouse <> 0 ) then
GetMousePosition( Word( Event.Where.X ), Word( Event.Where.Y ) );
If( Event.What = evNothing ) then
GetKeyEvent( Event );
end;
Procedure ClearEvents( Var Event: TEvent );
begin
Event.What := evNothing;
Event.InfoPtr := Nil;
end;
{$I MOUSE.INC}
...
Var
GMode, GDriver, GError, RFont: Integer;
Ev: TEvent;
...
begin
...
GDriver := InstallUserDriver('SVGA256M',Nil);
RegisterBGIDriver( @SVGA256M );
GMode := 3; { 800x600x256 }
RFont := RegisterBGIFont( @Littr );
Pal.Size := MaxColors+1;
Pal.Colors[0] := 0;
For I := 1 to 15 do
Pal.Colors[I] := -1;
Pal.Colors[14] := 0;
InitGraph( GDriver, GMode, '');
GError := GraphResult;
If( GError <> grOk ) then
begin
Writeln( GraphErrorMsg( GError ) );
Halt( 1 );
end;
SetAllPalette( Pal );
SetColor( 7 );
SetBkColor( 0 );
SetTextStyle( RFont, HorizDir, 5 );
InitEvents;
Mouse;
SetMouse( 1 );
SetVisualPage( 0 );
SetActivePage( 0 );
ClearDevice;
...
ShowMouse;
...
Repeat
GetEvents( Ev );
If( Ev.What and evMouse <> 0 ) then
begin
Case Ev.What of
evMouseUp : begin
{ отпустили клавишу мыши }
end;
evMouseDown: begin
{ нажали клавишу мыши }
end;
evMouseAuto: begin
{ нажали и удерживаем клавишу мыши }
end;
else
ClearEvents( Ev );
end;
end;
Until ( Ev.What <> evNothing );
...
HideMouse;
DoneEvents;
ClearDevice;
CloseGraph;
MemW[0:$41A] := MemW[0:$41C];
end.
Здравия всем.
Надо написать свой модуль для мышки, а ассемблера не знаю.
Помогите пожалуйста. Скажите с чего начать или ссылки на какие-нибудь доки
подкинте. В общем, от каждого по возможностям. Поймите проблему лаймера. ???
Чуть-чуть выше, ежели не заметил NightMare постил модуль для мышки.
Ну глянь ишшо:
http://pascal.sources.ru/mouse/l_mouse.htm
Сори граждане за повтор вопроса, но не как с мышой не разберусь.
Вобщем так : как написть след. вешь:
1) при движении мышки вправо на пиксель - x := x -1;
при движении мышки влево на пиксель - x := x+1;
при движении мышки вниз на пиксель - y := y+1;
при движении мышки вверх на пиксель - y := y -1;
2) ограничить перемещения мышки в прямоугольнике с диагональю (x1,y1,x2,y2);
Nightmare, недурно..
to admins: предлагаю плюсик для Nightmare
Сделал. Кстати все это есть в FAQ'е.
Так что по вопросам мышачим смотрите там, наверняка найдете ответ
???? На дату создания топика смотрели?
APAL, честно говоря нет. Но разве это имеет значение? ;)
ПАМАГИТЕ!!!!! Я чайник , дурак и ламер, случайно удалил в DOS`е драйвер мыши , а именно mouse.com . Комп настолько старый для этого времени (1988г.!!!) И для того что бы на комп записать что-либо , тоже проблема-флоппи диск тож старый 5.4 помойму. И без мыши ну ПРОСТО НИКАК Паскаль на этом компе установлен. Может как-нибудь написать этот драйвер???? HELP!!!
Написать драйвер мыши можно, но гораздо дешевле купить новый комп.