IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Мышь в Pascal'e
сообщение
Сообщение #1


Гость






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

P.S. может есть другие способы рисования линий таким способом.
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 48
Пол: Мужской

Репутация: -  1  +


Я делаю так:

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 всё пашет отлично.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.04.2024 10:51
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name