Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Мышь в Pascal'e

Автор: Игорь 20.10.2003 8:50

Помогите.
Мне нужно мышью рисовать линии на экране (т.е. нажал на одно место экрана, потом потащил (мышь) и линия рисуется за ней).
Пробовал по разному, но при перетаскивании постоянно остаются какие-нибудь следы.
Думаю, что нужно ставить свои обработчики (процедуры) на действия мыши, но не знаю как.
Помогите кто может.

P.S. может есть другие способы рисования линий таким способом.

Автор: GLuk 23.10.2003 9:01

Конечно можно, ты знаком с ассемблером? Но это для написания своего обработчика. Впрочем, можно обойтись и паскалем. А следы остаются от того, что указатель мыши нужно скрывать при каждом прямом доступе к видеопамяти

Автор: Nightmare 24.10.2003 22:28

Я очень надеюсь, что это применяется в графическом режиме... (режим?, драйвер?)

Автор: GLuk 25.10.2003 1:48

Вряд ли он рисует их в режиме 0-3.. ;)
Хотя принципиально - это возможно

Автор: Nightmare 25.10.2003 16:51

Вообще-то действительно вряд ли... Извиняюсь, стормозил... ( просто у меня где-то валялся пакет для изменения указателя мыши для текстового режима /вид и движения получались как в графическом режиме/)

Тогда очень интересно как, и с помощью чего выводится указатель мыши?
У меня, например, таких проблем с мышью не наблюдалось.

Автор: GLuk 25.10.2003 21:45

Дык с помощью дров ессесно. Существует два части в стандартном драйвере от микрософта: монитор мыши и монитор экрана. Первый считает кол-во шагов, а второй следит за перемещением указателя и если чо, увеличивает скорость перемещения. На физическом уровне это осуществляется путем сохранения части экрана, затем туда накладывается изображение курсора, после восстанавливается действительное изображение. Как следствие перед прямым доступом к видеопамяти следует скрывать указатель.
И ишшо бывает телега по типу почему указатель не появляется в VESA-режимах, дык это значит драйвер старенький и не поддерживает вывод курсора в этих режимах (100h-101h-...), но можно поставить свой обработчик и, следственно, выводить свой курсор...
типа того   smile.gif

Автор: Nightmare 31.10.2003 1:32

Я делаю так:

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;


SETMOUSE.ASM

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.



На время прорисовки и обработки мышу лучше прятать, а то она помнит, что было под указателем. Иногда мыша вообще отказывается показываться, хотя и работает - это зависит от .BGI драйвера. Для стандартных, типа EGAVGA.BGI всё пашет отлично.

Автор: Glin 1.12.2003 19:07

Здравия всем.
Надо написать свой модуль для мышки, а ассемблера не знаю.
Помогите пожалуйста. Скажите с чего начать или ссылки на какие-нибудь доки
подкинте. В общем, от каждого по возможностям. Поймите проблему лаймера.  ???

Автор: GLuk 1.12.2003 22:06

Чуть-чуть выше, ежели не заметил NightMare постил модуль для мышки.
Ну глянь ишшо:
http://pascal.sources.ru/mouse/l_mouse.htm

Автор: BRS 3.11.2004 23:49

Сори граждане за повтор вопроса, но не как с мышой не разберусь.

Вобщем так : как написть след. вешь:

1) при движении мышки вправо на пиксель - x := x -1;
при движении мышки влево на пиксель - x := x+1;
при движении мышки вниз на пиксель - y := y+1;
при движении мышки вверх на пиксель - y := y -1;

2) ограничить перемещения мышки в прямоугольнике с диагональю (x1,y1,x2,y2);

Автор: GoodWind 4.11.2004 0:00

Nightmare, недурно..


to admins: предлагаю плюсик для Nightmare

Автор: Altair 4.11.2004 13:20

Сделал. Кстати все это есть в FAQ'е.
Так что по вопросам мышачим смотрите там, наверняка найдете ответ smile.gif

Автор: APAL 4.11.2004 15:02

???? blink.gif На дату создания топика смотрели?

Автор: Altair 4.11.2004 18:32

APAL, честно говоря нет. Но разве это имеет значение? ;)

Автор: Тюняга 6.07.2008 2:25

ПАМАГИТЕ!!!!! Я чайник , дурак и ламер, случайно удалил в DOS`е драйвер мыши , а именно mouse.com . Комп настолько старый для этого времени (1988г.!!!) И для того что бы на комп записать что-либо , тоже проблема-флоппи диск тож старый 5.4 помойму. И без мыши ну ПРОСТО НИКАК wacko.gif sad.gif Паскаль на этом компе установлен. Может как-нибудь написать этот драйвер???? HELP!!!

Автор: andriano 27.07.2008 1:46

Написать драйвер мыши можно, но гораздо дешевле купить новый комп.