Текущий архив: 2003.10.30;
Скачать: CL | DM;
Вниз
Мышь в Pascal e Найти похожие ветки
← →
Аноним (2003-10-20 08:48) [0]Помогите.
Мне нужно мышью рисовать линии на экране (т.е. нажал на одно место экрана, потом потащил (мышь) и линия рисуется за ней).
Пробовал по разному, но при перетаскивании постоянно остаются какие-нибудь следы.
Думаю, что нужно ставить свои обработчики (процедуры) на действия мыши, но не знаю как.
Помогите кто может.
P.S. может есть другие способы рисования линий таким способом.
← →
MBo © (2003-10-20 08:56) [1]рисовать с режимом пера (Pen.Mode) pmXor, pmNot
Второе рисование по тому же месту сотрет.
← →
Zergling © (2003-10-20 08:56) [2]Вопрос уже задовался на форуме. Ищи > резиновые линии
← →
Аноним (2003-10-20 09:03) [3]Мне нужет ответ по сабж"у ( Turbo Pascal).
← →
MBo © (2003-10-20 09:10) [4]совет про режим рисования остается в силе. просто посмотри, как это называется в Graph Паскаля.
← →
Аноним (2003-10-20 09:22) [5]Пробовал. Остаются следы в некоторых местах (точки)
← →
pasha_golub © (2003-10-20 10:31) [6]Если под ДОС, то надо обрабатывать $13 прерывание
← →
Аноним (2003-10-20 10:40) [7]TO pasha_golub
Во-первых, не $13, а $33. Во-вторых, я это и так делаю, проблема в другом. Как мне "поставить" свою процедуру на мышь. (нажатие, отжатие, движение и т.п.)
← →
MBo © (2003-10-20 10:50) [8]>Остаются следы в некоторых местах (точки)
А ты скрываешь мышиный курсор на время графического вывода?
← →
Аноним (2003-10-20 10:53) [9]Нет. А надо?
← →
Pat © (2003-10-20 10:56) [10]В древности когда-то баловался. Может поможет...
uses crt,graph,dos;
procedure egavgadrv;external;
{$l egavga.obj}
var r:registers;
g:char;
a,x,y,x1,y1,d,m:integer;
begin
if registerbgidriver(@egavgadrv)<0 then
begin
writeln("Ошибка");
halt;
end;
d:=vga;
m:=vgahi;
initgraph(d,m,"");
asm
mov ax,0;
int 33h;
mov ax,1;
int 33h
end;
repeat
r.ax:=3;
intr($33,r);
if r.bx<>0 then begin
x:=r.cx;
y:=r.dx;
putpixel(r.cx,r.dx-1,11);
break;end;
until false;
repeat
r.ax:=1;
intr($33,r);
r.ax:=5;
intr($33,r);
x1:=r.cx;
y1:=r.dx;
if r.bx=1 then
begin
r.bx:=0;
r.ax:=2;
intr($33,r);
line(x1,y1,x,y);
x:=x1;
y:=y1;end;
until keypressed;
closegraph;
end.
Вторая:
uses graph,crt,dos;
procedure egavgadrv;external;
{$L egavga.obj}
var
mx,my,d,m,x,y,a:integer;
g:char;
r:registers;
begin
clrscr;
textcolor(11);
window(30,1,80,25);
writeln("МЫШЬ В КЛЕТКЕ");
window(1,2,80,25);
writeln("Демонстрация возможностей мыши в графическом режиме.");
writeln("Pаботают:"+", "-", ESC, левая и правая кнопки мыши - сам поймешь как.");
writeln("Курсор сейчас убрал специально...");
r.ah:=$001;
r.ch:=$20; {Курсора нет}
r.cl:=$00;
intr($10,r);
readkey;
(*with r do ax:=$12; {Графический режим(не работает)}
intr($10,r);*)
if registerbgidriver(@egavgadrv)<0 then halt;
d:=vga;
m:=vgahi; {Графический режим}
initgraph(d,m,"");
r.ax:=0; {Инициализация крысы}
intr($33,r);
randomize;
r.ax:=4;
r.cx:=random(640); {Произвольные координаты крысы}
r.dx:=random(480);
intr($33,r);
with r do
begin
ax:=$007;
cx:=100; {Вертикальные границы крысы}
dx:=540;
end;
intr($33,r);
with r do
begin
ax:=$008;
cx:=100; {Горизонтальные границы крысы}
dx:=380;
end;
intr($33,r);
r.ax:=1; {Крыса на экране}
intr($33,r);
repeat
asm
mov ax,3
int 33h
mov a,bx {Определение состояния крысы:а-кнопка,х,у-координаты}
mov x,cx
mov y,dx
mov cx,mx
mov dx,my {Устанавливаем чувствительность крысы}
mov ax,0fh
int 33h
end;
if keypressed then
begin
if g="+" then begin mx:=mx+5;my:=my+5;end;
if g="-" then begin mx:=mx-5;my:=my-5;
if (mx<=0) or (my<=0) then begin mx:=0;my:=0;end;
end;
end;
if a=1{левая} then putpixel(x,y-1,11);
if a=2{правая}then putpixel(x,y-1,13);
while keypressed do g:=readkey;{очищение буфера клавиатуры(чтобы не пищал)}
until g=#27;
with r do ax:=$3; {Текстовый режим}
intr($10,r);
end.
P.S. Сорри за стиль оформления - писал в начальные времена занятия Паскалем, сейчас править влом
← →
MBo © (2003-10-20 10:59) [11]>Нет. А надо?
Да, надо.
← →
Pat © (2003-10-20 11:02) [12]А вот еще на асме, практически то, что тебе надо..только линия не тянется, а рисуется между двумя точками от мыши
.model tiny
.code
org 100h
.186
start:
mov ax,12h
int 10h
mov ax,0
int 33h
mov ax,1
int 33h
mov ax,000ch
mov cx,0002h
mov dx,offset handler
int 33h
mov ah,0
int 16h
mov ax,000ch
mov cx,0000h
int 33h
mov ax,3
int 10h
ret
handler:
push 0a000h
pop es
push cs
pop ds
push cx
push dx
mov ax,2
int 33h
cmp word ptr previous_x,-1
je first_point
call line_bresenham
exit_handler:
pop dx
pop cx
mov previous_x,cx
mov previous_y,dx
mov ax,1
int 33h
retf
first_point:
call putpixel1b
jmp short exit_handler
line_bresenham:
mov ax,cx
sub ax,previous_x
jns dx_pos
neg ax
mov word ptr x_increment,1
jmp short dx_neg
dx_pos: mov word ptr x_increment,-1
dx_neg: mov bx,dx
sub bx,previous_y
jns dy_pos
neg bx
mov word ptr y_increment,1
jmp short dy_neg
dy_pos: mov word ptr y_increment,-1
dy_neg:
shl ax,1
shl bx,1
call putpixel1b
cmp ax,bx
jna dx_le_dy
mov di,ax
shr di,1
neg di
add di,bx
cycle:
cmp cx,word ptr previous_x
je exit_bres
cmp di,0
jl fractlt0
add dx,word ptr y_increment
sub di,ax
fractlt0:
add cx,word ptr x_increment
add di,bx
call putpixel1b
jmp short cycle
dx_le_dy:
mov di,bx
shr di,1
neg di
add di,ax
cycle2:
cmp dx,word ptr previous_y
je exit_bres
cmp di,0
jl fractlt02
add cx,word ptr x_increment
sub di,bx
fractlt02:
add dx,word ptr y_increment
add di,ax
call putpixel1b
jmp short cycle2
exit_bres:
ret
putpixel1b:
pusha
xor bx,bx
mov ax,dx
imul ax,ax,80
push cx
shr cx,3
add ax,cx
mov di,ax
mov si,di
pop cx
mov bx,0080h
and cx,07h
shr bx,cl
lods es:byte ptr some_label
or ax,bx
stosb
popa
ret
previous_x dw -1
previous_y dw -1
y_increment dw -1
x_increment dw -1
some_label:
end start
← →
Аноним (2003-10-20 11:03) [13]Всем приогромное спасибо.
← →
Pat © (2003-10-20 11:04) [14]Ой..блин..это то же самое, что и первая на Паскале :-)) Гы...склЯроз :)
← →
CMeX © (2003-10-20 11:17) [15]Да ну? ;))
asm
mov ax,0;
int 33h; // зачем? Хватит одного раза (внизу)=0)
mov ax,1; // а не ah? ;)
<mov bx,cx (по-моему, если память не изменяет)>
int 33h
end;
Страницы: 1 вся ветка
Текущий архив: 2003.10.30;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.034 c