PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Программирование на PureBasic » #WM_MOUSEMOVE работает не правильно, или DesktopMouseX()?


#WM_MOUSEMOVE работает не правильно, или DesktopMouseX()?

Сообщений 1 страница 16 из 16

1

Код:
If OpenWindow(0, 200, 200, 600, 220, "")
  
  Repeat
      Select WaitWindowEvent()     ; check for window events
        Case #WM_MOUSEMOVE
         Debug DesktopMouseX() 

       Case #PB_Event_CloseWindow
          Quit = 1
      EndSelect
    Until Quit = 1
  EndIf

почему выдаваемое значение, выдается через 2 а то и 3? примеру я двигаю мышкой получаю значение 100,102,105,107 ,а по идее должно было 100,101,102,103,104,105.

0

2

вот это при (modstep1) работает не правильно, я думаю это из за моего первого вопроса, хотел узнать так ли это в действительности?

Код:
If OpenWindow(0, 200, 200, 600, 220, "")
    ModStep =50
    ModStep1 =88
          
  Repeat
      Select WaitWindowEvent()     ; check for window events
        Case #WM_MOUSEMOVE
          x=  DesktopMouseX()
         If Mod(x,ModStep)=0 
          Debug x  
       ResizeWindow(0,x-111,#PB_Ignore ,#PB_Ignore,#PB_Ignore)
       EndIf 
     
        If Mod(x,ModStep1)=0 
          Debug x  
       ;ResizeWindow(0,x-111,#PB_Ignore ,#PB_Ignore,#PB_Ignore)
       EndIf 
     

       Case #PB_Event_CloseWindow
          Quit = 1
      EndSelect
    Until Quit = 1
  EndIf

И еще при  (modstep) иногда на право не перемещается на лево работает всегда, потом перезапустишь компилятор начинает работать и на право. Посмотрите у вас наблюдается такое.

Отредактировано mestnyi (18.11.2013 11:34:12)

0

3

mestnyi написал(а):

почему выдаваемое значение, выдается через 2 а то и 3?

Потому что быстро двигаешь мышкой, или мышка имеет недостаточную точность позиционирования. У меня работает нормально если конечно не очень быстро перемешаю мышку.

mestnyi написал(а):

работает не правильно

Код работает правильно. Возможно в нем есть логическая ошибка и из-за этого он работает не так, как задумано.

0

4

Возможно в нем есть логическая ошибка

ну не знаю когда вставлю шаг 5,10,15,20,25...50 работает не сшитая что иногда нужно перезапустить компилятор, а 7,8,9...88 начинает пригат через три, то есть допустим вставлю шаг 8 так вот должно пригат через 8,16,24,32,40,48,56,64,72 а пригает по разному, через 2 а то и 3 шага 8,24,32,40,72. Вот я думаю или MOD грешит или MOUSE_MOVE.

0

5

Поставил шаг 7 и все работает как должно. Перемещается с шагом в 7 пикселей.

0

6

ВОТ РЕЗУЛЬТАТ ОТЛАДКИ ШАГ 8 http://s6.uploads.ru/t/JsURp.jpg

Отредактировано mestnyi (18.11.2013 17:24:56)

0

7

Мышка исправна? Видно что шаг кратен 8, но такое впечатление что есть рывки при перемещении мышки.

0

8

но такое впечатление что есть рывки

вот об этом я и говорю
можешь мне отправить ехе файл с компилированого в твоем компютере чтоб я у себя проверил, если у тебя работает правильно?

В IDE DELPHI такое реализовано там ровными шагами, я имею виду открываешь проект на дельфи ставишь кнопку на форму и начинаешь перемешать (с моей мышкой) ровно через 8 происходит шаг, вот поэтому думаю что мышка в порядке

замена мышки ничего не дало все также
если бы из за мышки было бы, шаг 10 тоже не должен же работать? А работает.

Отредактировано mestnyi (18.11.2013 18:30:07)

0

9

mestnyi написал(а):

В IDE DELPHI такое реализовано там ровными шагами

Выложи код, а лучше весь проект.

Событие #WM_MOUSEMOVE появляется не при каждом перемещении мышки на пиксель, а с определенным интервалом при движении мышки и из-за этого при быстром перемещении мышки, могут быть небольшие скачки в значениях текущих координат курсора.

0

10

Выложи код, а лучше весь проект.

этого

В IDE DELPHI такое реализовано

или того что я делаю?

0

11

Курсор попиксельно перемещается только если его медленно двигать (+ зависит от DPI мыши и Sensitivity).
Это наглядно видно в старом Paint'е (Windows XP и ниже), когда рисуешь кистью и очень быстро двигаешь мышью, линии получаются ломаными.
Что бы сделать сглаживание, надо каким-нибудь алгоритмом получать промежуточные координаты между двумя точками.

0

12

Paranoia Ты об этом Ссылка

0

13

mestnyi написал(а):

этого

Да.

0

14

Пётр
я говорю что в среде дельфы так реализовано, шаг через 8 ровными шагами, а когда проект делаю на дельфы то также как на пурике через 2,3 прыгает.  Это на маем компе а у друга работает ровно.
Вот мне интересно как там реализовали я думал что там тоже mod использован. как же мне сделать шаг 8 и чтоб везде работало?

0

15

Причем тут реализация mod?
Выше писал что событие #WM_MOUSEMOVE происходит не при каждом перемещение мышки на пиксель. Почему? Это вопрос не ко мне, а к разработчикам винды, дров, мышек и так далее.

mestnyi написал(а):

как же мне сделать шаг 8 и чтоб везде работало?

Учитывай в проге что мышка может двигаться рывками. В этом случае нужно использовать не mod, а примерно такой метод.

Код:
If OpenWindow(0, 200, 200, 600, 220, "")
  ModStep =8
  ModStep1 =88
  
  OldPos=0
  
  Repeat
    Select WaitWindowEvent()     ; check for window events
      Case #WM_MOUSEMOVE
        x=  DesktopMouseX()
        If x-OldPos>=ModStep Or x-OldPos<=-ModStep
          x - (x % ModStep) ; Устраниене ошибки в позиционировании мышки.
          OldPos=x
          Debug x  
          ResizeWindow(0,x-111,#PB_Ignore ,#PB_Ignore,#PB_Ignore)
        EndIf 
        
;         If Mod(x,ModStep1)=0 
;           Debug x  
;           ;ResizeWindow(0,x-111,#PB_Ignore ,#PB_Ignore,#PB_Ignore)
;         EndIf 
        
        
      Case #PB_Event_CloseWindow
        Quit = 1
    EndSelect
  Until Quit = 1
EndIf

0

16

Пётр
честно сказать вообще не понял твою конструкцию но удивительно на право работает плавно, а налево через 1 прыгает.
на твоем примере сделал вот так работает отлично

Код:
If OpenWindow(0, 200, 200, 600, 220, "")
  ModStep =88
  
  
  Repeat
    Select WaitWindowEvent()     ; check for window events
      Case #WM_MOUSEMOVE
        x=  DesktopMouseX()
        ;If  x
          x - Mod(x,ModStep) ; Устранение ошибки в позиционировании мышки.
          Debug x  
          ResizeWindow(0,x-111,#PB_Ignore ,#PB_Ignore,#PB_Ignore)
       ; EndIf 
        
        
        
      Case #PB_Event_CloseWindow
        Quit = 1
    EndSelect
  Until Quit = 1
EndIf

но не пойму почему, был бы рад если бы ты смог мне объяснить.
здесь походу условие даже не нужно все работает прекрасно но почему???

Отредактировано mestnyi (19.11.2013 21:55:00)

0


Вы здесь » PureBasic - форум » Программирование на PureBasic » #WM_MOUSEMOVE работает не правильно, или DesktopMouseX()?