
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.174] |
![]() |
|
Сообщ.
#1
,
|
|
|
![]() |
Сообщ.
#2
,
|
|
Дополнительные материалы можно найти на Исходниках:
http://pascal.sources.ru/mouse/ |
Сообщ.
#3
,
|
|
|
Вот пример модуля, работающего с графической мышой в TMT Pascal'е.
Прикреплённый файл ![]() |
![]() |
Сообщ.
#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.
Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." Прикреплённый файл ![]() |
![]() |
Сообщ.
#6
,
|
|
KiRiK, по-моему, курсор затирает фоновое изображение. Проверь.
А, вообще, мне понравилось. Молодец! Желательно добавить ещё пару демок. Допустим, построение многоугольника с помощью мыши. Каждый клик будет означать новую точку, а двойной щелчок - окончание рисования. 2-я демка - технология Drag'n'Drop: на экране прямоугольник, ты его тянешь в заданную область, и там он становится другим цветом при отпускании кнопки мышки. ![]() Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." |
Сообщ.
#7
,
|
|
|
Цитата Romtek @ Желательно добавить ещё пару демок. Допустим, построение многоугольника с помощью мыши. Каждый клик будет означать новую точку, а двойной щелчок - окончание рисования. 2-я демка - технология Drag'n'Drop: на экране прямоугольник, ты его тянешь в заданную область, и там он становится другим цветом при отпускании кнопки мышки. Это, конечно, можно сделать (и, скорее всего, сделаю), только особого смысла, по-моему, нет.. просто сейчас чуток другим занимаюсь. Тут исправление перерисовки (пару минусиков нужно было на плюсики заменить ![]() Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." Прикреплённый файл ![]() |
Сообщ.
#8
,
|
|
|
Цитата Romtek @ Допустим, построение многоугольника с помощью мыши. Каждый клик будет означать новую точку, а двойной щелчок - окончание рисования. Рисует ломаную по точкам, смысл тот же. Завершение - правая кнопка. Цитата Romtek @ 2-я демка - технология Drag'n'Drop: на экране прямоугольник, ты его тянешь в заданную область, и там он становится другим цветом при отпускании кнопки мышки. Меня, признаться, ломает писАть.. ![]() Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." Прикреплённый файл ![]() |
![]() |
Сообщ.
#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 моё
Вот вторая демка: Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." Прикреплённый файл ![]() |
![]() |
Сообщ.
#12
,
|
|
Вот это как раз то, что надо!
А что именно обновлять надо? Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." |
Сообщ.
#13
,
|
|
|
Я хотел просто добавить..
А как ты предлагаешь обновить? Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." |
![]() |
Сообщ.
#14
,
|
|
Цитата KiRiK @ А как ты предлагаешь обновить? Вот есть тема в ФАКе: Программируем мышу. Туда её надо. А вверху можно прикрепить ссылку на тему Работа с картинками с твоим модулем. Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." |
Сообщ.
#15
,
|
|
|
Цитата Romtek @ Вот есть тема в ФАКе: Программируем мышу. Туда её надо. А я туда ее и хотел. ![]() Цитата Romtek @ А вверху можно прикрепить ссылку на тему Работа с картинками с твоим модулем. ![]() А чем был вызван запрет произвольного редактирования ФАКа? Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." |
![]() |
Сообщ.
#16
,
|
|
KiRiK, эти 2 демки опиши, хоть вкратце, что и как. А в теме Программируем мышу на мой взгляд, нет необходимости выкладывать список функций мыши, только сами процедуры: что выполняет каждая из них.
Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." |
Сообщ.
#17
,
|
|
|
Цитата Romtek @ Вот есть тема в ФАКе: Программируем мышу. А то я не знаю ![]() Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." |
![]() |
Сообщ.
#18
,
|
|
Цитата Romtek @ Тем, что туда часто писали гости-чайники, вместо того, чтобы задавать свои вопросы в форуме.А чем был вызван запрет произвольного редактирования ФАКа? Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." |
Сообщ.
#19
,
|
|
|
Описывать - комментировать код или написать по поводу каждой несколько предложений?
Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." |
![]() |
Сообщ.
#20
,
|
|
KiRiK, ты не мог бы довести тему про мышу до окончательного варианта?
Цитата KiRiK Комментарии в коде всегда обязательны, тем более в ЧАВО. Но ещё нужно описание технологии (алгоритма) программ. А то ты знаешь что и как, а другим будет непонятно.Описывать - комментировать код или написать по поводу каждой несколько предложений? И ещё я тебе не так давно говорил о том, что инфа по прерываниям не так важна, как технология её управления (т.е. обработка нажатий кнопок мыши и т.д.). Отредактируй своё 1-е сообщение в Программируем мышу., чтобы можно было двинуть тему в ФАК. а то она здесь застоялась. Описание прерываний пусть качают в виде дополнительной информации по мышке (прикрепи архив). Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." |
Сообщ.
#21
,
|
|
|
Сделаем
![]() Сроки? Добавлено Просто сейчас имеет место некоторый напряг с учебой - сдачи заданий. Но это временно.. я так думаю.. ![]() Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." |
![]() |
Сообщ.
#22
,
|
|
В течение 2-х недель справишься, надеюсь?
Вместо того, чтобы спать ночью, лучше бы форуму помог! ![]() Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." |
Сообщ.
#23
,
|
|
|
Цитата Romtek @ Вместо того, чтобы спать ночью, лучше бы форуму помог! И так не более 5ти сплю. Куда уж меньше? (Злобный шепет: "ну, например, четыре"). Цитата Romtek @ В течение 2-х недель справишься, надеюсь? К тем выходным, которые через 2 недели. Т.е. 1-2 апреля. Если вопросы будут - постучусь в асю. Ладно? Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." |
![]() |
Сообщ.
#24
,
|
|
Окей, только сильно долго не тяни.
P.S. В асю стучи, правда я в ней в последнее время редко бываю. Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке." |
Сообщ.
#25
,
|
|
|
Отредактировал.
|
![]() |
Сообщ.
#26
,
|
|
Цитата KiRiK @ Ты не вкрадываешься, а описываешь вкратце. вкрадце ![]() Цитата KiRiK @ Неправда! Я тебе подсказал, как лучше всего показать на примере эту техлологию. Не вкладывай в мои слова другой смысл. Что, собственно говоря, такое Drag&Drop. Согласно Romtek'у это когда "на экране прямоугольник, ты его тянешь в заданную область, и там он становится другим цветом при отпускании кнопки мышки". ![]() Технология так и называется: "хватай и бросай": навели курсор на какой-то объект, нажимаем кнопку мыши, и, удерживая её в этом положении, переносим туда, где хотим "бросить". Там мышку и отпускаем. |
Сообщ.
#27
,
|
|
|
Цитата Romtek @ Ты не вкрадываешься, а описываешь вкратце. Ступил, каюсь. ![]() Цитата Romtek @ Неправда! Я тебе подсказал, как лучше всего показать на примере эту техлологию. Не вкладывай в мои слова другой смысл. Нет проблем, сейчас поправим. |
![]() |
Сообщ.
#28
,
|
|
Цитата KiRiK @ Нет проблем, сейчас поправим. и грамматические ошибки тоже. ![]() Добавлено Цитата KiRiK @ Теперь к модераторам. Сейчас прикреплен один архив, который содержит 4 файла. Можно ли всех их прикрепить по отдельности? ![]() |
Сообщ.
#29
,
|
|
|
Цитата Romtek @ и грамматические ошибки тоже. Исправил.. ![]() Йошкорныбабай, сколько же их там было.. Люди! Запомните! Не рекомендую дописывать статьи посреди ночи. ![]() |
![]() |
Сообщ.
#30
,
|
|
Оформленная статья читается гораздо лучше. Молодец!
|
Сообщ.
#31
,
|
|
|
Это все, конечно, хорошо.
![]() Но что с ней дальше то делать? |
![]() |
Сообщ.
#32
,
|
|
Теперь создай здесь же другую тему про мышу, в которой помести сообщение #1 отсюда (просто скопируй). А я в нём позже помещу ссылку на готовый топик, удалив дубль. Сия тема будет продолжать собирать мнения и пожелания.
|
Сообщ.
#33
,
|
|
|
Т.е. вот так: Программируем мышу. ?
|
![]() |
Сообщ.
#34
,
|
|
Окей, всё правильно сделал. Новую тему теперь я перемещу в ФАК, а эту переименую (или ты, ссылкой "редактировать" в 1-м сообщении). Вопрос: как лучше назвать эту тему?
|
Сообщ.
#35
,
|
|
|
Так: Мышинный support. ?
![]() |
![]() |
Сообщ.
#36
,
|
|
Так тоже пойдёт.
![]() |