Скроллинг в Browse
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Re: Скроллинг в Browse
есть свойства PROP:VScrollPos и PROP:HScrollPos для LIST контролаPIT писал(а):Как получить {prop:XPos} для ScrollBara в колонке Browse?
с помощью этих свойств можно вычислить всё что требуется
Re: Скроллинг в Browse
честно говоря не понял вопросаPIT писал(а):Как получить {prop:XPos} для ScrollBara в колонке Browse?
я понял так - определить Xpos области вертикальной прокрутки
если да, то очень просто, это кстати в примере по расчёту координат ячейки в LIST контроле присутсвует
с помощью Win API функции GetClientRect получаем размер клиентской области LIST контрола без учёта областей прокрутки
GetClientRect(Window $ ?List{PROP:Handle},tmp)
Искомая Xpos области прокрутки = Window $ ?List{PROP:Xpos} + tmp.Right
Искомая ширина области прокрутки = Window $ ?List{PROP:Width} - tmp.Right
Скроллинг в Browse
Прошу прощения, думал об одном, а писал прро другое.
Действительно, разговор идет о ScrollBar'e на поле (колонке) Browse.
Нужно получить PROP:HScrollPos для оного. Для List'a это просто, а для поля в List'e - проблема!!!
Действительно, разговор идет о ScrollBar'e на поле (колонке) Browse.
Нужно получить PROP:HScrollPos для оного. Для List'a это просто, а для поля в List'e - проблема!!!
Re: Скроллинг в Browse
совсем ничего не понял, пример расчёта координат ячейки я выложил,Pit писал(а):Прошу прощения, думал об одном, а писал прро другое.
Действительно, разговор идет о ScrollBar'e на поле (колонке) Browse.
Нужно получить PROP:HScrollPos для оного. Для List'a это просто, а для поля в List'e - проблема!!!
если это не то, Тогда что надо то? что за поле в LIST'е?
-
- Ветеран движения
- Сообщения: 78
- Зарегистрирован: 04 Август 2005, 9:35
- Контактная информация:
Узнать смещение некого скрулл-бара не проблема - ловим WM_HSCROLL и в нем используя GetScrollInfo получаем это самое смещение. Но вот как узнать хендл окна ScrollBar-а, связанного с неким произвольным полем (а таких скуллируемых полей может быть в списке произвольное число) - тут очевидного и гарантирующего ответа я не знаю. Навскиду можно попробовать определять позицию мыши в процессе скруллинга - известно наличие общего скрулла - т.е. можно определить смещение относительно низа списка, где начинается скрулл поля - и зная положение полей можно определить ПОД каким полем жмется мыша в процессе скруллинга.
Скроллинг в Browse
Вообще задачка такая:
Мне нужно скроллировать это поле в колонке с помощью клавы (вправо-влево) и одновременно выполнять то же самое в параллельном List'e.
Проще - имеется 3 лист-бокса
- основной - справа внизу
- горизонтальный (вспомогательный) - справа вверху
- вертикальный - слева
При вертикальной прокрутке в основном листе прокручивается левый лист-бокс
При горизонтальной прокрутке в основном листе (вправо-влево) прокручивается верхний лист-бокс
Во всех трех одно поле в виде текстовой строки длиной до 1000 при ограниченной ширине окна.
Мышкой в основном листе прокрутка за скролл-бар выполняется, а вот с помощью клавы да еще и протащить в верхнем окне не выходит без PROP:HScrollPos
Мне нужно скроллировать это поле в колонке с помощью клавы (вправо-влево) и одновременно выполнять то же самое в параллельном List'e.
Проще - имеется 3 лист-бокса
- основной - справа внизу
- горизонтальный (вспомогательный) - справа вверху
- вертикальный - слева
При вертикальной прокрутке в основном листе прокручивается левый лист-бокс
При горизонтальной прокрутке в основном листе (вправо-влево) прокручивается верхний лист-бокс
Во всех трех одно поле в виде текстовой строки длиной до 1000 при ограниченной ширине окна.
Мышкой в основном листе прокрутка за скролл-бар выполняется, а вот с помощью клавы да еще и протащить в верхнем окне не выходит без PROP:HScrollPos
-
- Ветеран движения
- Сообщения: 78
- Зарегистрирован: 04 Август 2005, 9:35
- Контактная информация:
Все это хорошо, спасибо за совет!softcreator писал(а):Госсыди... я-то думал там серьезная задача (решение которой мне самому нужно, в принципе)
Возьми мои шаблоны - там в control-шаблоне "Просмотр текстового (ASCII) файла" реализован скруллинг одного большого поля кнопками клавы.
Но!!! Получается странный скроллинг - шаг 10, всего 100.
За 10 нажатий скролл-бар смещается до конца, а текст только на 10 знаков.
Если я жму мышкой на правую стрелку скролл-бара, текст смешается на столько, на сколько мне надо (то же колесиком мышки).
В чем собака порылась??? Где искать?
-
- Ветеран движения
- Сообщения: 78
- Зарегистрирован: 04 Август 2005, 9:35
- Контактная информация:
Ну это "особенности реализации" - точнее обмана RTL
А универсальный способ для списка с одним полем довольно прост
1. Калбечим оконную процедуру, обрабатываем все же не WM_HSCROLL, а WM_CTLCOLORSCROLLBAR
2. В нем получаем, используя GetScrollInfo, позицию ползунка и используем ее по своему усмотрению.
3. Если нужно перемещение ползунка клавиатурой - используем функцию SetScrollInfo (алерты на LeftKey и RightKey - и отрабатываем перемещение руками).
Единственный момент - необходимо знать хендл окна-скрулла. Но тут помогает специфика сообщения WM_CTLCOLORSCROLLBAR - оно вызывается при прорисовке скрулла - в том числе и при открытии окна. Т.е. поскольку мы сабклассим свои известные списки - то при открытии окна и получении в оконных процедурах события WM_CTLCOLORSCROLLBAR всеми процедурами, где есть списки с скруллами, мы "фиксируем" у себя в переменных хендлы всех scroll-bar-окон и пользуемся ими для позиционирования ползунков в произвольное время.
Так что все довольно тривиально...
А универсальный способ для списка с одним полем довольно прост
1. Калбечим оконную процедуру, обрабатываем все же не WM_HSCROLL, а WM_CTLCOLORSCROLLBAR
2. В нем получаем, используя GetScrollInfo, позицию ползунка и используем ее по своему усмотрению.
3. Если нужно перемещение ползунка клавиатурой - используем функцию SetScrollInfo (алерты на LeftKey и RightKey - и отрабатываем перемещение руками).
Единственный момент - необходимо знать хендл окна-скрулла. Но тут помогает специфика сообщения WM_CTLCOLORSCROLLBAR - оно вызывается при прорисовке скрулла - в том числе и при открытии окна. Т.е. поскольку мы сабклассим свои известные списки - то при открытии окна и получении в оконных процедурах события WM_CTLCOLORSCROLLBAR всеми процедурами, где есть списки с скруллами, мы "фиксируем" у себя в переменных хендлы всех scroll-bar-окон и пользуемся ими для позиционирования ползунков в произвольное время.
Так что все довольно тривиально...
-
- Ветеран движения
- Сообщения: 78
- Зарегистрирован: 04 Август 2005, 9:35
- Контактная информация:
-
- Посетитель
- Сообщения: 49
- Зарегистрирован: 18 Август 2005, 10:16
- Откуда: Пермь
- Контактная информация:
Скроллинг в Browse
Работает только в 6.1. Синхронно в 2х лист'ах. В 5.5 никак.softcreator писал(а):Погорячился я в предыдущем посте - легко делается перемещение ползунков - а вот заставить скруллиться сам список синхронно перемещению ползунка у меня не получилось
С уважением, П.Ялунин (PIT)