Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
xu
0 / 0 / 0
Регистрация: 08.08.2020
Сообщений: 2

GraphWPF: колёсико мыши

16.02.2022, 16:32. Показов 955. Ответов 4

Студворк — интернет-сервис помощи студентам
Господа, подскажите пожалуйста, надеюсь есть разбирающиеся. Возможно ли подключить колёсико мыши по аналогии с дефолтными событиями OnMouseDown и проч. именно в grapfWPF? (Forms не использую принципиально).

Совершаю тщетные попытки уже больше полгода точно. Если мне не изменяет память, в коде модуля WPF я видел закомментированный кусок про mouse wheel, и при попытке запустить эти обрывки самостоятельно давало непонятную ошибку. Проблема в самом Handler'е как я понимаю. Как подключить и чем различаются эти несколько разных классов eventsargs? Как в принципе работают эти события с sender'ами типа мыши и клавы? (Свои простенькие события я создавал и понимаю их) На эти и другие вопросы мой самоучский мозг никак не может дать ответа.

В связи с изложенным у меня и возникло ощущение: может какой конфликт внутри модуля, коли сами разработчики не реализовали это колесико? Возможно ли без forms сделать эти злополучные СкроллБары вручную?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.02.2022, 16:32
Ответы с готовыми решениями:

колёсико мыши
Как в окне Free Pascal использовать колёсико мыши для прокрутки?

Колёсико мыши
Где и какой код вставить для прокрутки колёсиком, пытался разными способами но выдаёт "expected '=' but '('" unit Unit2; ...

Колёсико мыши
Пишу код: if (e.KeyCode == Keys./*Колёсико мыши вверх*/) Как называется колёсико мыши в классе Keys?

4
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
16.02.2022, 17:51
Лучший ответ Сообщение было отмечено xu как решение

Решение

WinForms используется только в GraphABC, а в GraphWPF испольузется WPF.
И WPF вам в любом случае придётся использовать чтобы добраться до события, к которому у вас нет доступа через GraphWPF.
Pascal
1
2
3
4
5
6
## uses GraphWPFBase, GraphWPF;
 
GraphWPFBase.MainWindow.MouseWheel += (o,e)->
begin
  // Тело обработчика
end;
Тут как минимум типы значений MainWindow и e это части библиотеки WPF:
https://docs.microsoft.com/en-... mework-4.8

Поэтому если цель не использования библиотек, на которых основан GraphWPF это принципиальность - вы уже провалились.
А если цель реализовать все элементы ручками, вместо того чтобы использовать готовое - я и сам постоянно таким страдаю, так что могу понять.
Но для этого надо использовать более низкоуровневые средства, потому что иначе будут фичи которые не доступны из высокоуровневой обёртки как (MouseWheel в GraphWPF), ради которых придётся лепить костыли. Да и тонкости контроля часто будет не хватать для оптимизации.

Цитата Сообщение от xu Посмотреть сообщение
при попытке запустить эти обрывки самостоятельно давало непонятную ошибку
У любой ошибки есть текст ошибки, который что-то да значит. И чтобы разобраться в чём была проблема - этот текст однозначно необходим.

Цитата Сообщение от xu Посмотреть сообщение
Как подключить и чем различаются эти несколько разных классов eventsargs? Как в принципе работают эти события с sender'ами типа мыши и клавы? (Свои простенькие события я создавал и понимаю их) На эти и другие вопросы мой самоучский мозг никак не может дать ответа.
Для начала объясните нормально что вы понимаете и умеете делать. И какие у вас идеи насчёт того что не понимаете.
1
xu
0 / 0 / 0
Регистрация: 08.08.2020
Сообщений: 2
17.02.2022, 02:04  [ТС]
Вот этот код.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
uses System.Windows.Input; 
 
procedure SystemOnMouseWheel(sender: Object; e: );
begin
         var (p,mb) := GetMouseArgs(e);
         if OnMouseWheel <> nil then  
         OnMouseWheel(p.x, p.y, mb);
end;
 
 
procedure OnMouseWheel;
begin
          if e.delta > 0 then print('9')
          else print('h');
end;
 
begin
         Mouse.AddMouseWheelHandler(el: Mouse, OnMouseWheel);
end.
Здесь не запускается из-за второго аргумента SystemOnMouseWheel, мне не ясно какой тип у параметра e должен быть. В OnMouseDown используется MouseButtonEventArgs, который не имеет методов работы с колесиком, а я пытался по аналогии делать и застопорился.

У меня есть представление о том как создаются и работают события, но исключительно с точки зрения логики кода. Когда дело доходит до событий(да и не только событий), использующих системные методы или классы вроде MouseButtonEventArgs, где логика далеко не на поверхности, мое понимание заканчивается. Поскольку не знаю где почитать или посмотреть о принципе работы, назначении полей и методов классов, прочем важном.
Как подключить и чем различаются эти несколько разных классов eventsargs? Как в принципе работают эти события с sender'ами типа мыши и клавы?
Здесь я имел в виду, что находил несколько классов для обработчиков мыши (EventsArgs, RoutedEventsArgs, MouseButtonEventArgs) и не понимал принципа работы ни одного из них. Ну и, как можно понять по коду выше, не мог разобраться с подключением их аргументов - (sender, Args) собственно.



Я действительно не хочу использовать готовое из соображений дизайна. Если бы по аналогии с html-разметкой существовал инструмент придания "стилей" объектам Forms, а их дефолтный вид использовался лишь как структура приложения - я бы прыгал от радости. А так, конечно, у меня нет цели отказаться от WPF библиотек.

Но для этого надо использовать более низкоуровневые средства, потому что иначе будут фичи которые не доступны из высокоуровневой обёртки
Спасибо за подробное объяснение. Из-за самообучения у меня хорошо с практической частью, а вот теория хромает. Теперь понял, graphWPF - это же оболочка из разряда "подключил и работает", не о точной настройке речь.


Вы не представляете, насколько я Вам благодарен.
0
 Аватар для XzzzX
405 / 280 / 120
Регистрация: 09.07.2021
Сообщений: 1,016
Записей в блоге: 1
17.02.2022, 06:52
Что касается дизайна, то Вы не совсем правы. WinForms имеет широкие возможности для кастомизации контролов. Конечно какие-то свистелки и блестяшки больше превелегия WPF, но и формы могут выглядеть достаточно современно. В любом случае, Вы можете писать на чистом WPF или WinForms, что не так уж и трудно, если понять основы. Ну а назначение множества модулей Вы поняли по большей части верно. Они больше нужны для обучения, чем для серьёзных проектов. Конечно это относится не ко всем
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
17.02.2022, 12:02
Цитата Сообщение от xu Посмотреть сообщение
мне не ясно какой тип у параметра e должен быть
https://youtu.be/Oa0oJm8DVjI
Я использовал ПКМ чтобы было видно на видео, но вообще переход к определению/реализации это Ctrl+тык на имя.

А вообще самый правильный ответ - никакой. Используйте лямбду для обработчика, как же как в моём примере выше.
Подробнее про лямбды найдёте презентацию на официальном сайте:
http://pascalabc.net/2-uncateg... zentations

Добавлено через 2 минуты
Цитата Сообщение от xu Посмотреть сообщение
Mouse.AddMouseWheelHandler
Зачем вам этот метод? Он используется только в особых случаях если закапываться в WPF.
А так, чтобы его вызвать вам в любом случае нужен объект к которому применять обработчик (как WPF окно) - а у этого объекта будет ивент MouseWheel, как я уже показал для GraphWPFBase.MainWindow.

Добавлено через 52 секунды
И постарайтесь писать более рабочий код, а не недописанные куски чего попало. Отвлекает от основного вашего вопроса - какой тип ставить после e:.

Добавлено через 9 минут
Цитата Сообщение от xu Посмотреть сообщение
использующих системные методы или классы вроде MouseButtonEventArgs, где логика далеко не на поверхности
Логика в том чтобы у всех ивентов был общий вид, различающийся только типом EventArgs-ов. Зачем - честно хз.
Могу только дать ссыль на документ о принципиальности от малакасофта: https://docs.microsoft.com/en-... nt-pattern

Добавлено через 35 минут
Цитата Сообщение от xu Посмотреть сообщение
Если бы по аналогии с html-разметкой существовал инструмент придания "стилей" объектам Forms
В WinForms нет, но в WPF есть XAML. Правда в паскале нет поддержки XAML времени компиляции, но его всегда можно загрузить во время выполнения:
https://stackoverflow.com/ques... at-runtime
Ну, лично я его никогда не использовал, так что дальше не подскажу.

Но основное неудобство WinForms это не отсутствие возможности отдельного описания стилей, а отсутствие стандартизации работы с контролами.
К примеру в HTML есть это: https://www.w3schools.com/css/css_boxmodel.asp
Этот основной принцип предельно просто описывается, но в то же время позволяет гулять фантазии.

В WPF с этим лучше. Не все контролы являются коробками из html, к примеру не у всех есть Padding.
Но когда его не хватает - достаточно добавить контрол типа Border, не указав собственно Border, но указав Padding.
И на самом деле это не костыль из за лени разработчиков WPF, а результат более строгой типизации типов WPF. Если вы объявляете StackPanel - вы будете использовать его как панельку в которой контролы стакаются друг под другом, а не как ещё одну общеобразную коробку, которая превратится в div если чуток поменять стили, как это работает в html.

Этот принцип не редко доставляет неудобства в простых случаях, но в то же время позволяет ещё более тонкий контроль чем html - потому что вы можете написать свой тип контрола, переопределив MeasureOverride и ArrangeOverride и забив в них совершенно любую логику рендеринга.

Добавлено через 18 минут
А вообще я не собирался пиарить WPF. Я сам сейчас больше копаюсь в ещё более низкоуровневом, вроде OpenGL.

Думаю не надо объяснять почему в OpenGL тонкой настройки будет больше чем в любой оконной библиотеке, и взамен на что))) Но если будет интересно - смотрите в папку C:\PABCWork.NET\Samples\OpenGL и OpenCL. Возникнут ещё трудности - могу помочь.

Но, к примеру, когда я пишу какую-то утилиту для себя, вроде такой - не знаю что подойдёт больше чем WPF.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.02.2022, 12:02
Помогаю со студенческими работами здесь

Колёсико мыши C++
Доброго времени суток! Как из консоли узнать что мы крутим колёсико мыши вверх или вниз? В MOUSE_EVENT можно отследить лишь факт...

Колёсико мыши
Скажите пожалуйста возможно ли взаимодействие явы скрипта и вертикального колёсика мыши , а также как его осуществить.

Element 3D колесико мыши
Приветствую, :friends: В Scene Setup Element 3D (Video Copilot) колесико мыши (нажатие) используется как движение камеры, можно ли...

SB_THUMBTRACK и колесико мыши
В листинге 2.2 обработать сообщение о перемещении движка полосы скроллин- га SB_THUMBTRACK и колесика мыши. //листинг 2.2 #include...

Не работает колесико мыши
Доброго всем времени суток! Не работает колесико мыши при прокрутке документа Excel... На всем остальном работает (Ворд, Опера и т.п) :( ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru