Относительные координаты с помощью виджета slider, содержащего виджет thumb

#c #user-interface

#c #пользовательский интерфейс

Вопрос:

У моего слайдера был дочерний виджет button. Недавно я изменил свой графический интерфейс, чтобы отправлять координаты мыши относительно виджета, поэтому, если виджет находится на 50,50, а мышь — на 50,50, теперь он будет отображаться как 0,0.

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

Единственное решение, о котором я подумал, это взять заданную координату мыши, добавить обратно абсолютное положение кнопки, затем вычесть абсолютное положение ползунка.

Однако я надеялся на решение, которое не включало бы абсолютное позиционирование.

Раньше я получал абсолютное положение мыши, когда я это делал, я позиционировал его следующим образом:

 int mousePos = getOrientation() == AGUI_HORIZONTAL ? 
    mouseArgs.getPosition().getX() - getAbsolutePosition().getX() :
mouseArgs.getPosition().getY() - getAbsolutePosition().getY();

setValue(positionToValue(mousePos));
  

mouseArgs задает положение мыши относительно кнопки. Не относительно слайдера, что было бы необходимо.

Я могу получить относительные местоположения виджетов, но я не думаю, что это поможет.

Спасибо

Ответ №1:

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

У вас есть виджет slider, который содержит виджет thumb. Пользователь может щелкнуть и перетащить большой палец, чтобы изменить его положение. Ваш графический интерфейс отправляет уведомления мыши на ваши виджеты в локальном относительном пространстве, а не в абсолютном пространстве экрана. Ваш вопрос заключается в том, как виджет thumb может реагировать на события мыши, чтобы перемещаться без использования абсолютных координат?

Вы можете сделать это, изменив, кто отвечает за перемещение виджета thumb. Задачей виджета slider должно быть позиционирование его виджета thumb. Делая это таким образом, все ваши координаты могут находиться в локальном относительном пространстве виджета slider. В основном это было бы что-то вроде (при условии, что у вас есть какое-то уведомление о событии):

  1. При создании виджет slider регистрируется для различных событий мыши в его дочернем виджете thumb.
  2. Когда thumb получает события мыши, он вызывает событие, проходящее по его локальной координате.
  3. Виджет Slider получает эти события и преобразует координату из локального пространства thumb в локальное пространство slider (т.Е. click_x = thumb_x thumb_mouse_x ).
  4. Затем слайдер может использовать эту координату, которая находится в локальном относительном пространстве слайдера, для перемещения большого пальца.

В общем, родители должны нести ответственность за макет своих детей.