На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Друзья, соблюдайте, пожалуйста, правила форума и данного раздела:
Данный раздел не предназначен для вопросов и обсуждений, он содержит FAQ-заготовки для разных языков программирования. Любой желающий может разместить здесь свою статью. Вопросы же задавайте в тематических разделах!
• Если ваша статья может быть перенесена в FAQ соответствующего раздела, при условии, что она будет оформлена в соответствии с Требованиями к оформлению статей.
• Чтобы остальным было проще понять, указывайте в описании темы (подзаголовке) название языка в [квадратных скобках]!
Модераторы: Модераторы
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Мышиный support. , [Pascal] Поддержка соответствующей темы в FAQ'е.
    Тема в FAQ'е: Программируем мышу.

    Цитата Romtek @
    Сия тема будет продолжать собирать мнения и пожелания.
    Сообщение отредактировано: Jin X -
      Дополнительные материалы можно найти на Исходниках:
      http://pascal.sources.ru/mouse/
        Вот пример модуля, работающего с графической мышой в TMT Pascal'е.
        Прикреплённый файлПрикреплённый файлTMTmouse.zip (9.53 Кбайт, скачиваний: 385)

          Материал прислал Oleg_Z.

          2 Oleg_Z:
          Требуется привести рабочий пример с использованием процедуры MouseGraphCursor.
          Готовый материал будет помещён в Программируем мышу.
          Важно также уделить внимание стилю написания кода, чтобы его понимание не было затруднено.


          Форма указателя в графическом режиме
          ExpandedWrap disabled
            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 байта заполним единицами:
          ExpandedWrap disabled
            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 столбика:
          ExpandedWrap disabled
            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);


          Теперь, если мы попробуем создать такой указатель:
          ExpandedWrap disabled
            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 пикселей. Это получаеться следующим образом:
          первый столбец (из двух) в константе-массиве, это вторая часть указателя мыши!!!
          т.е.
          указатель:
          ExpandedWrap disabled
            ********00000000
            ********00000000
            ********00000000
            ********00000000
            ********00000000
            ********00000000
            ********00000000
            ********00000000
            ********00000000
            ********00000000
            ********00000000
            ********00000000
            ********00000000
            ********00000000
            ********00000000
            ********00000000


          нули здесь показывают вторую часть указателя мыши (описываеться первым столбцом в массиве!!!!).
          И наоборот, первая часть описывается вторым столбцом массива.
          Каждой число типа byte (эл-т массива) - это как раз 8 бит (как раз половина указателя).
          Т.е. для создания указателя придется пользоваться двоичной арифметикой.
          Проще всего запустить стандартный калькулятор в Windows, переключить его в инженерный вид, и в двоичную форму, записать нужное число и конвертировать его в десятичную или шестадцатиричную.
          Ну и в заключении, вот пример массива - маски, позволяющий создать указатель в виде восклицательного знака:

          ExpandedWrap disabled
            {
            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);


          Эта тема была разделена из темы "Неотёсанные топики"

          Это сообщение было перенесено сюда или объединено из темы "Мышиный курсор"
          Сообщение отредактировано: Romtek -
            Вот исходник немного обновленного модуля для работы с мышой. Опирается на последнюю версию модуля Images.

            Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке."
            Прикреплённый файлПрикреплённый файлGrMouse.rar (31.94 Кбайт, скачиваний: 371)
              KiRiK, по-моему, курсор затирает фоновое изображение. Проверь.
              А, вообще, мне понравилось. Молодец!
              Желательно добавить ещё пару демок.
              Допустим, построение многоугольника с помощью мыши. Каждый клик будет означать новую точку, а двойной щелчок - окончание рисования.
              2-я демка - технология Drag'n'Drop: на экране прямоугольник, ты его тянешь в заданную область, и там он становится другим цветом при отпускании кнопки мышки.
              ;)

              Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке."
                Цитата Romtek @
                Желательно добавить ещё пару демок.
                Допустим, построение многоугольника с помощью мыши. Каждый клик будет означать новую точку, а двойной щелчок - окончание рисования.
                2-я демка - технология Drag'n'Drop: на экране прямоугольник, ты его тянешь в заданную область, и там он становится другим цветом при отпускании кнопки мышки.

                Это, конечно, можно сделать (и, скорее всего, сделаю), только особого смысла, по-моему, нет.. просто сейчас чуток другим занимаюсь.

                Тут исправление перерисовки (пару минусиков нужно было на плюсики заменить :) , а я то думал на ЖКмонитор, работающий не в своем режиме):

                Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке."
                Прикреплённый файлПрикреплённый файлGrMouse.zip (3.76 Кбайт, скачиваний: 356)
                  Цитата Romtek @
                  Допустим, построение многоугольника с помощью мыши. Каждый клик будет означать новую точку, а двойной щелчок - окончание рисования.

                  Рисует ломаную по точкам, смысл тот же. Завершение - правая кнопка.

                  Цитата Romtek @
                  2-я демка - технология Drag'n'Drop: на экране прямоугольник, ты его тянешь в заданную область, и там он становится другим цветом при отпускании кнопки мышки.

                  Меня, признаться, ломает писАть.. :whistle: В конце концов, это уже не совсем демка мышки..

                  Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке."
                  Прикреплённый файлПрикреплённый файлpoly.zip (9.9 Кбайт, скачиваний: 341)
                    Вот твоя же программа, но вариант по-проще (без узлов):
                    ExpandedWrap disabled
                      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-я демка ничуть не сложнее первой.

                    Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке."
                      Цитата Romtek @
                      Вот твоя же программа, но вариант по-проще (без узлов)

                      Да, зато в моей результат выводится по окончанию, так интереснее :)
                      А память, насколько помню, освобождается при GetNode.

                      Цитата Romtek @
                      2-я демка ничуть не сложнее первой.

                      Однако, правда.

                      Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке."
                        #6 моё

                        Вот вторая демка:

                        Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке."
                        Прикреплённый файлПрикреплённый файлdrag.zip (10.29 Кбайт, скачиваний: 340)
                          Вот это как раз то, что надо!
                          А что именно обновлять надо?

                          Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке."
                            Я хотел просто добавить..
                            А как ты предлагаешь обновить?

                            Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке."
                              Цитата KiRiK @
                              А как ты предлагаешь обновить?

                              Вот есть тема в ФАКе: Программируем мышу.
                              Туда её надо. А вверху можно прикрепить ссылку на тему Работа с картинками с твоим модулем.

                              Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке."
                                Цитата Romtek @

                                Вот есть тема в ФАКе: Программируем мышу.
                                Туда её надо.

                                А я туда ее и хотел. :D


                                Цитата Romtek @
                                А вверху можно прикрепить ссылку на тему Работа с картинками с твоим модулем.

                                :yes: Замечательно.

                                А чем был вызван запрет произвольного редактирования ФАКа?

                                Это сообщение было перенесено сюда или объединено из темы "Еще чуть-чуть о мышке."
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0446 ]   [ 15 queries used ]   [ Generated: 9.12.24, 13:38 GMT ]