Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.174] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Сообщ.
#2
,
|
|
|
Дополнительные материалы можно найти на Исходниках:
http://pascal.sources.ru/mouse/ |
Сообщ.
#3
,
|
|
|
Вот пример модуля, работающего с графической мышой в TMT Pascal'е.
Прикреплённый файлTMTmouse.zip (9.53 Кбайт, скачиваний: 385) |
Сообщ.
#4
,
|
|
|
Материал прислал Oleg_Z. 2 Oleg_Z: Требуется привести рабочий пример с использованием процедуры MouseGraphCursor. Готовый материал будет помещён в Программируем мышу. Важно также уделить внимание стилю написания кода, чтобы его понимание не было затруднено. Форма указателя в графическом режиме uses dos {, ...}; {...} Procedure MouseGraphCursor(var ScrCurMask;X,Y: Byte); var reg:registers; begin with Reg do begin ax := $9; bx := X; cx := Y; es := seg(ScrCurMask); dx := ofs(ScrCurMask); Intr($33,Reg) end end; Для использования этой процедуры, пропишите в разделе подключаемых модулей, модуль DOS. Эта процедура специально написанна без использования ассемблера, чтобы у Вас, читающих это, не возникло ощущения отсупления в этой теме, от Паскаля. Все предыдущие процедуры и функции тоже могут быть написанны на Паскале, без использования ассемблера (о переводе Паскаль <--> Ассемблер скоро появится тема...) Здесь ScrCurMasc - это 64 байтный массив, определяющий маску экрана и маску указателя. x,y - смещение координатной точки относительно левого верзенго угла указателя. Попробуем создать свой указатель. Сразу скажу, что максимальный размер указателя - 16*16 пикселей. Для начала нам надо создать 64 байтный массив. Это делается следующим образом: первые 32 байта заполним единицами: const a: array[1..64] of byte = (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, {...} Теперь составляем вторую часть массива (тоже 32 байта ) Тут правило такое: (для удобства) располагаем по 2 столбика: const a: array[1..64] of byte = (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 255,255, 255,255, 255,255, 255,255, 255,255, 255,255, 255,255, 255,255, 255,255, 255,255, 255,255, 255,255, 255,255, 255,255, 255,255, 255,255); Теперь, если мы попробуем создать такой указатель: Var grDriver : Integer; grMode : Integer; Procedure MouseGraphCursor(var ScrCurMask;X,Y: Byte); var reg:registers; begin with Reg do begin ax := $9; bx := X; cx := Y; es := seg(ScrCurMask); dx := ofs(ScrCurMask); Intr($33,Reg) end end; Begin grDriver:=Detect; InitGraph(grDriver, grMode, ''); initmouse; showmouse; testmous.mousegraphcursor(a,0,0); readkey; closegraph; end. (представлено в трудночитаемой форме, т.к. я это вырезал из окна TP.) Предварительно не забудьте прописать uses dos,graph,crt; И описать константу a, как мы это уже сделали. На экране вы увидите белый квадрат 16*16 пикселей. Это получаеться следующим образом: первый столбец (из двух) в константе-массиве, это вторая часть указателя мыши!!! т.е. указатель: ********00000000 ********00000000 ********00000000 ********00000000 ********00000000 ********00000000 ********00000000 ********00000000 ********00000000 ********00000000 ********00000000 ********00000000 ********00000000 ********00000000 ********00000000 ********00000000 нули здесь показывают вторую часть указателя мыши (описываеться первым столбцом в массиве!!!!). И наоборот, первая часть описывается вторым столбцом массива. Каждой число типа byte (эл-т массива) - это как раз 8 бит (как раз половина указателя). Т.е. для создания указателя придется пользоваться двоичной арифметикой. Проще всего запустить стандартный калькулятор в Windows, переключить его в инженерный вид, и в двоичную форму, записать нужное число и конвертировать его в десятичную или шестадцатиричную. Ну и в заключении, вот пример массива - маски, позволяющий создать указатель в виде восклицательного знака: { 00000001 10000000 00000111 11100000 00000111 11100000 00001111 11110000 00001111 11110000 00001111 11110000 00001111 11110000 00001111 11110000 00000111 11110000 00000011 11000000 00000001 10000000 00000001 10000000 00000000 00000000 00000111 11100000 00000111 11100000 00000011 11100000 } a:array[1..64] of byte = (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 128,1, 224,7, 224,7, 240,15, 240,15, 240,15, 240,15, 240,15, 224,7, 192,3, 128,1, 128,1, 0,0, 224,7, 224,7, 192,3); Эта тема была разделена из темы "Неотёсанные топики" Это сообщение было перенесено сюда или объединено из темы "Мышиный курсор" |
Сообщ.
#5
,
|
|
|
Вот исходник немного обновленного модуля для работы с мышой. Опирается на последнюю версию модуля Images.
Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." Прикреплённый файлGrMouse.rar (31.94 Кбайт, скачиваний: 371) |
Сообщ.
#6
,
|
|
|
KiRiK, по-моему, курсор затирает фоновое изображение. Проверь.
А, вообще, мне понравилось. Молодец! Желательно добавить ещё пару демок. Допустим, построение многоугольника с помощью мыши. Каждый клик будет означать новую точку, а двойной щелчок - окончание рисования. 2-я демка - технология Drag'n'Drop: на экране прямоугольник, ты его тянешь в заданную область, и там он становится другим цветом при отпускании кнопки мышки. Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." |
Сообщ.
#7
,
|
|
|
Цитата Romtek @ Желательно добавить ещё пару демок. Допустим, построение многоугольника с помощью мыши. Каждый клик будет означать новую точку, а двойной щелчок - окончание рисования. 2-я демка - технология Drag'n'Drop: на экране прямоугольник, ты его тянешь в заданную область, и там он становится другим цветом при отпускании кнопки мышки. Это, конечно, можно сделать (и, скорее всего, сделаю), только особого смысла, по-моему, нет.. просто сейчас чуток другим занимаюсь. Тут исправление перерисовки (пару минусиков нужно было на плюсики заменить , а я то думал на ЖКмонитор, работающий не в своем режиме): Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." Прикреплённый файлGrMouse.zip (3.76 Кбайт, скачиваний: 356) |
Сообщ.
#8
,
|
|
|
Цитата Romtek @ Допустим, построение многоугольника с помощью мыши. Каждый клик будет означать новую точку, а двойной щелчок - окончание рисования. Рисует ломаную по точкам, смысл тот же. Завершение - правая кнопка. Цитата Romtek @ 2-я демка - технология Drag'n'Drop: на экране прямоугольник, ты его тянешь в заданную область, и там он становится другим цветом при отпускании кнопки мышки. Меня, признаться, ломает писАть.. В конце концов, это уже не совсем демка мышки.. Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." Прикреплённый файлpoly.zip (9.9 Кбайт, скачиваний: 341) |
Сообщ.
#9
,
|
|
|
Вот твоя же программа, но вариант по-проще (без узлов):
USES Graph, GrMouse; VAR cursor :tMouseCursor; x, y :SmallInt; FirstClick: boolean; BEGIN SetSVGAMode(640,480,16,0); SetFillColor(RGBCOlor(0,0,255)); Bar(0,0,GetMaxX,GetMaxY); LoadMouseCursor(cursor,'pen.gmc'); InitMouse(@cursor); ShowMouse; SetColor(RGBColor(255,255,0)); FirstClick := true; Repeat GetMouseXY(x,y); If TestMouseButtons(mouseLeft,FALSE) Then Begin if FirstClick then begin MoveTo(x,y); FirstClick := false; end else LineTo(x,y); HideMouse; Circle (x,y,5); ShowMouse; Repeat MoveMouse Until not TestMouseButtons(mouseLeft,FALSE) End Until TestMouseButtons(mouseRight,FALSE); SetColor(RGBColor(255,0,0)); Repeat MoveMouse Until TestMouseButtons(mouseRight,FALSE); CloseGraph; END. Кстати, в твоём варианте ты забыл освободить память по окончанию работы. 2-я демка ничуть не сложнее первой. Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." |
Сообщ.
#10
,
|
|
|
Цитата Romtek @ Вот твоя же программа, но вариант по-проще (без узлов) Да, зато в моей результат выводится по окончанию, так интереснее А память, насколько помню, освобождается при GetNode. Цитата Romtek @ 2-я демка ничуть не сложнее первой. Однако, правда. Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." |
Сообщ.
#11
,
|
|
|
#6 моё
Вот вторая демка: Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." Прикреплённый файлdrag.zip (10.29 Кбайт, скачиваний: 340) |
Сообщ.
#12
,
|
|
|
Вот это как раз то, что надо!
А что именно обновлять надо? Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." |
Сообщ.
#13
,
|
|
|
Я хотел просто добавить..
А как ты предлагаешь обновить? Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." |
Сообщ.
#14
,
|
|
|
Цитата KiRiK @ А как ты предлагаешь обновить? Вот есть тема в ФАКе: Программируем мышу. Туда её надо. А вверху можно прикрепить ссылку на тему Работа с картинками с твоим модулем. Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." |
Сообщ.
#15
,
|
|
|
Цитата Romtek @ Вот есть тема в ФАКе: Программируем мышу. Туда её надо. А я туда ее и хотел. Цитата Romtek @ А вверху можно прикрепить ссылку на тему Работа с картинками с твоим модулем. Замечательно. А чем был вызван запрет произвольного редактирования ФАКа? Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." |