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

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

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

 
 Ответить  Открыть новую тему 
> Мышь в Pascal'e
сообщение
Сообщение #1


Гость






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

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


Профи
****

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

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


Конечно можно, ты знаком с ассемблером? Но это для написания своего обработчика. Впрочем, можно обойтись и паскалем. А следы остаются от того, что указатель мыши нужно скрывать при каждом прямом доступе к видеопамяти
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

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

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


Я очень надеюсь, что это применяется в графическом режиме... (режим?, драйвер?)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Профи
****

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

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


Вряд ли он рисует их в режиме 0-3.. ;)
Хотя принципиально - это возможно
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

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

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


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

Тогда очень интересно как, и с помощью чего выводится указатель мыши?
У меня, например, таких проблем с мышью не наблюдалось.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Профи
****

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

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


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


Новичок
*

Группа: Пользователи
Сообщений: 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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






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


Профи
****

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

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


Чуть-чуть выше, ежели не заметил NightMare постил модуль для мышки.
Ну глянь ишшо:
http://pascal.sources.ru/mouse/l_mouse.htm
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

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

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


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

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

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

2) ограничить перемещения мышки в прямоугольнике с диагональю (x1,y1,x2,y2);
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Автооответчик
*****

Группа: Пользователи
Сообщений: 1 188
Пол: Мужской
Реальное имя: Александр

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


Nightmare, недурно..


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


--------------------
Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

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


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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Смотрю...
*****

Группа: Пользователи
Сообщений: 1 055
Пол: Мужской
Реальное имя: Пшеничный Алексей Анатольевич

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


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


--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

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


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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






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


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

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


Написать драйвер мыши можно, но гораздо дешевле купить новый комп.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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