Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2009, 16:57   #1
-=LD=-
 
Регистрация: 22.04.2009
Сообщений: 4
Стрелка Как изменить маску курсора в TP

Нужно изменить маску курсора, но не понимаю как это сделать,хотя и читал по этой теме литературу. Там где я читал создаётся константа в виде массива,у которого каждая ячейка расписана - это,как я понял, и называется маской. Но как это связать с курсором не понятно.
Немного уточню то что мне надо.
Есть информация что описание курсора мыши делается с помощью прерывания $33 :
AX=0009h
BX=ширина
CX=высота
EX=адрес сегмента битового поля(незнаю что это)
DX=aдрес смещения битового поля(незнаю что это)
Как с этим работать?

Есть функции получения координат курсора мыши:

Код:
function mouseX:word;
   var
   r:registers;
   x:word;
   begin
   R.AX := 3;
   Intr($33, R);
   mouseX:= R.CX;
   end;

              function mouseY:word;
              var
              r:registers;
              Y:word;
              begin
              R.AX := 3;
              Intr($33, R);
              mouseY:= R.DX;

Суть задачки такая создать прицел, который будет двигаться по экрану с помощью мыши. У меня есть два варианта её решения: либо рисовать через стандартные процедуры circle и.т.д, но тогда придёться использовать clearviewport, и изображение получается мерцающим, либо изменить маску курсора тогда, наверно, всё будет норм работать.
Спасибо всем, кто хоть чем то поможет

Последний раз редактировалось Stilet; 24.11.2009 в 11:41.
-=LD=- вне форума Ответить с цитированием
Старый 11.11.2009, 10:30   #2
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

Чтобы не мерцало, можно использовать две видеостраницы, правда, в режиме 640x480 это невозможно (в неSVGA режиме, по крайней мере) из–за нехватки видеопамяти. Зато это возможно в режиме 640x350, но придётся учитывать аспект. В этом режиме семь пикселов по вертикали занимают столько же места, сколько восемь пикселов по горизонтали.

Ну либо «классический» 320x200, в котором возможен быстрый вывод на экран и видеопамяти хватает на несколько видеостраниц.
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Старый 11.11.2009, 10:43   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
но тогда придёться использовать clearviewport
Кто это сказал?
Рисуешь прицел цветом фона в старых координатах, потом рисуешь колором в новых при движении.
Никакой clearviewport тут ниразу не нужен.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.11.2009, 14:38   #4
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Я тут проверял работу с мышью, методом тыка удалось установить что регистр BL отвечает за клавиши мыши он возвращает 1 если нажата ЛКМ и 2 если нажата ПКМ, только вот с Y координатой проблемы она у меня почему то максиум возвращает 200. Почему?
В планах порабощение вселенной...

Последний раз редактировалось zumm; 21.11.2009 в 14:52.
zumm вне форума Ответить с цитированием
Старый 23.11.2009, 19:34   #5
Anatole
Форумчанин
 
Аватар для Anatole
 
Регистрация: 07.04.2009
Сообщений: 245
По умолчанию

Цитата:
она у меня почему то максиум возвращает 200.
А в каком видеорежиме работаеш в этот момент времени
Всякое безобразие должно быть единообразным. Тогда это называется порядком.
Anatole вне форума Ответить с цитированием
Старый 24.11.2009, 11:07   #6
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

обычный VGA, 640х480
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 02.12.2009, 15:08   #7
-=LD=-
 
Регистрация: 22.04.2009
Сообщений: 4
По умолчанию

Всё с предыдущей прогой успешно разобрался)))Всем спасибо за ответы. Терь делаю следующюю, нужно создать список и уметь его редактировать.
Код:
program two;
uses CRT;
const
norm=$17;
sel=$70;
N=5;
type
one=^Tspisok;
Tspisok=object
head:one;
inf:string;
next:one;
procedure DelData;
procedure addData(info:string);
procedure printData;
procedure seData;
{procedure DelData(info:string);}
end;

procedure Tspisok.seData;
var cur:one;s:string;
begin
readln(s);
cur:=head;
while (cur<>nil) and (cur^.inf<>s) do
cur:=cur^.next;
if cur^.inf=s then writeln(cur^.inf);


end;
procedure Tspisok.addData(info:string);
var
cur:one;
           begin
        clrscr;
             new(cur);
              cur^.inf:=info;
               cur^.next:=head;
                 head:=cur;
                   end;
procedure Tspisok.printData;
var
cur:one;
begin
  cur:=head;
  while cur<>nil do
  begin
writeln(cur^.inf);
  cur:=cur^.next
  end;
  end;
procedure Tspisok.DelData;
var cur,pred:one;Idel:string;
begin
clrscr;
writeln('Enter del data:');
cur:=head;
readln(Idel);
while (cur<>nil) and (cur^.inf<>Idel) do
cur:=cur^.next;
if cur^.inf=Idel then
begin
       cur:=Pred^.next;
       Pred^.next:=Pred^.next^.next;
       {Idel:=cur^.inf; }
writeln('Del data:',cur^.inf);
 dispose(cur);{<= Ругаеться матом #204 - указатель пуст или указывает не на кучу}
end;
readln;
end;
{var
cur:one;
begin
cur:=head;
head:=head^.next;
info:=cur^.inf;
dispose(cur);
end;   }
var
i:word;
data:string;
obj:Tspisok;
     menu:array[1..N] of string[20];
     punkt:integer;
     ch:char;
     x,y:integer;
Procedure MenuToScr;
var i:integer;
begin
     ClrScr;
     for i:=1 to N do begin
          GoToXY(x,y+i-1);
          write(menu[i]);
     end;
     TextAttr:=SEL;
     GoToXY(x,y+punkt-1);
     write(menu[punkt]);
     TextAttr:=NORM;
end;
begin
     menu[1]:=' Add your data ';
     menu[2]:=' Print your data ';
     menu[3]:=' Del data ';
     menu[4]:=' Exit ';
     menu[5]:='s';
     punkt:=1;
     x:=5;
     y:=5; TextAttr:=NORM;
     MenuToScr;
     repeat
          ch:=ReadKey;
          if ch=char(0) then begin
               ch:=ReadKey;
               case ch of
                    chr(80):
                         if punkt<N then begin
                              GoToXY(x,y+punkt-1);
                              write(menu[punkt]);
                              punkt:=punkt+1;
                              TextAttr:=SEl;
                              GoToXY(x,y+punkt-1);
                              write(menu[punkt]);
                              TextAttr:=NORM;
                         end;
                    chr(72):
                         if punkt>1 then begin
                              GoToXY(x,y+punkt-1);
                              write(menu[punkt]);
                              punkt:=punkt-1;
                              TextAttr:=SEl;
                              GoToXY(x,y+punkt-1);
                              write(menu[punkt]);
                              TextAttr:=NORM;
                         end;
                 end;
              end
          else
               if ch=chr(13) then begin
                    case punkt of
1:begin
  clrscr;
  writeln('Add your data:  ');
  readln(data);
  obj.adddata(data);
  end;
2:begin
  clrscr;
  writeln('Your data: ');
  obj.printdata;
  readln;
  end;
3:begin
  clrscr;
  obj.deldata;
  end;
                          4:ch:=chr(27);
5:begin
clrscr;
obj.seData;
readln;
end;
                    end;
                    MenuToScr;
               end;
     until ch=chr(27);
end.
В самом конце процедурки Deldata ругаеться, что мол либо указатель пуст, либо указывает на элемент вне кучи. Но у меня то он указывает на поле Inf => по идеи должен уничтожать его.И вообще мне не понятно как вставлять\удалять в произвольное место списка элементы, объясните пожалуйста.
Вот процедура, в кторой ошибка:
Код:
procedure Tspisok.DelData;
var cur,pred:one;Idel:string;
begin
clrscr;
writeln('Enter del data:');
cur:=head;
readln(Idel);
while (cur<>nil) and (cur^.inf<>Idel) do
cur:=cur^.next;
if cur^.inf=Idel then
begin
       cur:=Pred^.next;
       Pred^.next:=Pred^.next^.next;
       Idel:=cur^.inf; 
writeln('Del data:',cur^.inf);
 dispose(cur);{Вот тут Ошибка 204}
end;
readln;
end;
И маленький вопросик: Как поменять название темы? Новую создавать нехочеться.

Последний раз редактировалось -=LD=-; 02.12.2009 в 15:14.
-=LD=- вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать маску цены в TMaskEdit? cLiFFero Помощь студентам 7 25.08.2010 15:09
Как наложить битовую маску? Никки Общие вопросы .NET 6 28.08.2009 13:01
Как правильно составить маску? Pavell PHP 1 05.01.2009 15:58
Как создать маску ввода даты в TextBox? AnnNet Microsoft Office Excel 6 24.07.2008 10:42
как определить координаты курсора snaem Общие вопросы .NET 0 23.04.2008 22:27