Позиционирование на колонке листбокса
Модератор: Дед Пахом
					Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
	При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Позиционирование на колонке листбокса
Добрый день!
Вопрос следующий: Есть листбокс, первая колонка фиксирована, остальные скроллируются по горизонтали. Колонок достаточно много, поэтому есть необходимость позиционирования на определенной.
Под позиционированием понимается, что при открытии формы колонки как бы уже проскроллированы до нужной.
Какие есть мысли по этому поводу?
			
			
									
						Вопрос следующий: Есть листбокс, первая колонка фиксирована, остальные скроллируются по горизонтали. Колонок достаточно много, поэтому есть необходимость позиционирования на определенной.
Под позиционированием понимается, что при открытии формы колонки как бы уже проскроллированы до нужной.
Какие есть мысли по этому поводу?
- Admin
 - Администратор
 - Сообщения: 4022
 - Зарегистрирован: 05 Июль 2005, 15:59
 - Откуда: Хабаровск
 - Благодарил (а): 59 раз
 - Поблагодарили: 42 раза
 - Контактная информация:
 
Re: Позиционирование на колонке листбокса
Только в сторонуJornada писал(а):Добрый день!
Вопрос следующий: Есть листбокс, первая колонка фиксирована, остальные скроллируются по горизонтали. Колонок достаточно много, поэтому есть необходимость позиционирования на определенной.
Под позиционированием понимается, что при открытии формы колонки как бы уже проскроллированы до нужной.
Какие есть мысли по этому поводу?
PROP:HScrollPos EQUATE(7CBBH) ! integer: Horizontal scroll position
отображается колонка или скрыта за краем листа,... такого пропа не помню.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
			
						Re: Позиционирование на колонке листбокса
Еще вопрос. Как отловить событие перемещения горизонтального бегунка? EVENT:ScrollDrag срабатывает только для вертикального
			
			
									
						- Admin
 - Администратор
 - Сообщения: 4022
 - Зарегистрирован: 05 Июль 2005, 15:59
 - Откуда: Хабаровск
 - Благодарил (а): 59 раз
 - Поблагодарили: 42 раза
 - Контактная информация:
 
Re: Позиционирование на колонке листбокса
Только сабкласить листбокс и пробовать ловить события от горизонтального скрола.
			
			
									
						Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
			
						- Дед Пахом
 - Старичок
 - Сообщения: 3346
 - Зарегистрирован: 07 Июль 2005, 16:51
 - Откуда: Москва, Россия
 - Благодарил (а): 20 раз
 - Поблагодарили: 56 раз
 - Контактная информация:
 
Re: Позиционирование на колонке листбокса
Посмотрите пример из Help > PROP:WndProc для начала.
			
			
									
						С уважением, ДП
			
						- Admin
 - Администратор
 - Сообщения: 4022
 - Зарегистрирован: 05 Июль 2005, 15:59
 - Откуда: Хабаровск
 - Благодарил (а): 59 раз
 - Поблагодарили: 42 раза
 - Контактная информация:
 
Re: Позиционирование на колонке листбокса
Кстати я тут подумал. Может не мучиться и сделать таймер и на нем проверять?Admin писал(а):Только сабкласить листбокс и пробовать ловить события от горизонтального скрола.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
			
						Re: Позиционирование на колонке листбокса
пока что свой скролл нарисовал, используя PROP:HScrollPos.
			
			
									
						Re: Позиционирование на колонке листбокса
Поторопился я. Не получается горизонтальный скролл.. Попробовал пример из Help'a, по совету Деда Пахома, порылся в скудных обрывках информации по сабклассам.. Ну месседж получить могу, когда бегунок горизонтальный перемещаю.. а вот повлиять на его местоположение.. GetScrollPos ничего не возвращает, SetScrollPos не устанавливает. Может кто поделится рабочим примером?
			
			
									
						- Admin
 - Администратор
 - Сообщения: 4022
 - Зарегистрирован: 05 Июль 2005, 15:59
 - Откуда: Хабаровск
 - Благодарил (а): 59 раз
 - Поблагодарили: 42 раза
 - Контактная информация:
 
Re: Позиционирование на колонке листбокса
Можно на Windows API довольно таки легко сделать свой скроллбар.Jornada писал(а): Может кто поделится рабочим примером?
Только как он будет с листом работать х.з.
Пример за давностью потерялся.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
			
						- Дед Пахом
 - Старичок
 - Сообщения: 3346
 - Зарегистрирован: 07 Июль 2005, 16:51
 - Откуда: Москва, Россия
 - Благодарил (а): 20 раз
 - Поблагодарили: 56 раз
 - Контактная информация:
 
Re: Позиционирование на колонке листбокса
Похоже, сабклассить надо не листбокс, а его скроллбар. Его хэндл легко найти: HScrollHwnd = FindWindowEx(?List{PROP:Handle}, 0). Правда, я в Spy никак не могу отловить события горизонтального скроллинга, что-то неправильно делаю, наверно.Jornada писал(а):Поторопился я. Не получается горизонтальный скролл.. Попробовал пример из Help'a, по совету Деда Пахома, порылся в скудных обрывках информации по сабклассам.. Ну месседж получить могу, когда бегунок горизонтальный перемещаю.. а вот повлиять на его местоположение.. GetScrollPos ничего не возвращает, SetScrollPos не устанавливает. Может кто поделится рабочим примером?
С уважением, ДП
			
						Re: Позиционирование на колонке листбокса
Попробовал вот так:
?List1{Prop:selected} = 1
?List1{Prop:column} = 25
POST(EVENT:NewSelection, ?List1)
Встало на первую строчку, 25 колонку и список прокрутился до нужного места.
			
			
									
						?List1{Prop:selected} = 1
?List1{Prop:column} = 25
POST(EVENT:NewSelection, ?List1)
Встало на первую строчку, 25 колонку и список прокрутился до нужного места.
Re: Позиционирование на колонке листбокса
Уважаемые Гуру, большая к Вам просьба.. не могли бы вы отвечать более развернуто, а то после ответов "это легко" возникает вопросов больше, чем было до этого)
В частности, я не нашел описания прототипа FindWindowEx для клары, там только FindWindow. Кроме того у FindWindowEx - 4 параметра.
hwndParent
Идентифицирует родительское окно, чьи дочерние окна должны быть найдены. Если hwndParent - ПУСТО (NULL), функция использует окно рабочего стола как родительское окно. Функция ищет среди окон, которые являются дочерними окнами рабочего стола.
hwndChildAfter
Идентифицирует дочернее окно. Поиск начинается со следующего дочернего окна в Z - последовательности. hwndChildAfter должен быть прямое дочернее окно hwndParent, а не простое порожденное окно. Если hwndChildAfter - ПУСТО (NULL), поиск начинается с первого дочернего окна определенного параметром hwndParent. Обратите внимание, что, если и hwndParent и hwndChildAfter - ПУСТО (NULL), функция ищет все окна верхнего уровня.
lpszClass
Указывает на строку с нулевым символом в конце, которая определяет имя класса или - атом, который идентифицирует строку имени класса. Если этот параметр - атом, он должен быть общий атом, созданный предыдущим вызовом к функции GlobalAddAtom. Атом, 16-разрядное значение, в котором должно быть размещено в младшей части слова - lpszClass; старшее слово должно быть нулевое.
lpszWindow
Указывает на строку с нулевым символом в конце, которая определяет имя окна (заголовок окна). Если этот параметр ПУСТО (NULL), имена всех окон соответствующие.
Возвращаемые значения
Если функция завершается успешно, возвращаемое значение - дескриптор окна, которое имеет определенный класс и имена окон.
И если с первыми двумя могу стоить догадки, что туда передается хендл окна и листа, то что в указатели писать..
			
			
									
						В частности, я не нашел описания прототипа FindWindowEx для клары, там только FindWindow. Кроме того у FindWindowEx - 4 параметра.
hwndParent
Идентифицирует родительское окно, чьи дочерние окна должны быть найдены. Если hwndParent - ПУСТО (NULL), функция использует окно рабочего стола как родительское окно. Функция ищет среди окон, которые являются дочерними окнами рабочего стола.
hwndChildAfter
Идентифицирует дочернее окно. Поиск начинается со следующего дочернего окна в Z - последовательности. hwndChildAfter должен быть прямое дочернее окно hwndParent, а не простое порожденное окно. Если hwndChildAfter - ПУСТО (NULL), поиск начинается с первого дочернего окна определенного параметром hwndParent. Обратите внимание, что, если и hwndParent и hwndChildAfter - ПУСТО (NULL), функция ищет все окна верхнего уровня.
lpszClass
Указывает на строку с нулевым символом в конце, которая определяет имя класса или - атом, который идентифицирует строку имени класса. Если этот параметр - атом, он должен быть общий атом, созданный предыдущим вызовом к функции GlobalAddAtom. Атом, 16-разрядное значение, в котором должно быть размещено в младшей части слова - lpszClass; старшее слово должно быть нулевое.
lpszWindow
Указывает на строку с нулевым символом в конце, которая определяет имя окна (заголовок окна). Если этот параметр ПУСТО (NULL), имена всех окон соответствующие.
Возвращаемые значения
Если функция завершается успешно, возвращаемое значение - дескриптор окна, которое имеет определенный класс и имена окон.
И если с первыми двумя могу стоить догадки, что туда передается хендл окна и листа, то что в указатели писать..
Re: Позиционирование на колонке листбокса
Код: Выделить всё
 PROGRAM
! Common equates
HANDLE                       EQUATE(UNSIGNED)
HWND                         EQUATE(HANDLE)
HBITMAP                      EQUATE(HANDLE)
HDC                          EQUATE(HANDLE)
HGDIOBJ                      EQUATE(HANDLE)
HBRUSH                       EQUATE(HANDLE)
WPARAM                       EQUATE(UNSIGNED)
LPARAM                       EQUATE(LONG)
GWL_WNDPROC                  EQUATE(-4)
SB_HORZ                      EQUATE(0)
SB_VERT                      EQUATE(1)
SB                           EQUATE(3)
WM_HSCROLL                   EQUATE(0114h)
WM_CTLCOLORSCROLLBAR            EQUATE(0137h)
 MAP
   PaintArea_WndProc         (HWND hWnd, UNSIGNED wMsg, WPARAM wParam, LPARAM lParam),LONG,PASCAL
   MODULE('Windows API')
     CallWindowProc          (LONG lpPrevWndFunc, HWND hWnd, UNSIGNED wMsg, WPARAM wParam, LPARAM lParam),LONG,PASCAL,NAME('CallWindowProcA')
     GetScrollPos            (HWND hWnd, SIGNED nBar),SIGNED,PASCAL
     SetScrollPos            (HWND hWnd, SIGNED nBar, SIGNED Pos, BOOL),SIGNED,PASCAL
     SetWindowLong           (HWND hWnd, SIGNED nIndex, LONG dwNewLong),LONG,PROC,PASCAL,NAME('SetWindowLongA')
     SetScrollRange          (HWND, SIGNED, SIGNED, SIGNED, BOOL),PASCAL
   END
 END
PaintArea_WndProc_Addr       LONG                               ! Адрес оригинальной процедуры окна
PaintArea_hWnd               HWND                               ! Handle окна области просмотра
PaintArea_hDC                HDC                                ! Контекст области просмотра
PaintArea_hMemDC             HDC                                ! Контекст в памяти с картинкой
PaintArea_hBitMap            HBITMAP                            ! Битовая карта изображения
PaintArea_hOldBitMap         HBITMAP                            ! Предыдущая битовая карта контекста
PaintArea_HScrollPos         SIGNED                             ! Текущая позиция (0-255) горизонтального скролбара
PaintArea_VScrollPos         SIGNED                             ! Текущая позиция (0-255) вертикального скролбара
DataQueue          QUEUE,PRE()
Level1                LONG
Level2                LONG
Level3                LONG
Level4                LONG
                   END
PaintArea:Win                WINDOW('Paint Area'),AT(,,300,200),FONT('MS Sans Serif',8),CENTER,GRAY,DOUBLE,SYSTEM
                               !LIST,AT(0,0,100,100),USE(?List),FULL,HVSCROLL,IMM
                               LIST,AT(0,0,200,100),USE(?List),FORMAT('80L(2)|M~Level1~@s20@80L(2)|M~Level2~@s20@80L(2)|M~Level3~@s20@80L(2)|M~Level4~@s20@'),FROM(DataQueue) ,HVSCROLL,IMM
                               !IMAGE('Blank_500x500.gif'),AT(5,5,125,105),USE(?PaintArea:Image),HVSCROLL
                               PROMPT('Horz:'),AT(5,116)
                               STRING(@s6),AT(28,116),USE(PaintArea_HScrollPos)
                               PROMPT('Vert:'),AT(74,116)
                               STRING(@s6),AT(94,116),USE(PaintArea_VScrollPos)
                             END
!*************************************************************************************************
 CODE
 OPEN(PaintArea:Win)
 Level1 = 1
 Level2 = 2
 Level3 = 3
 Level4 = 4
 add (DataQueue)
 ?List{PROP:From} = DataQueue
! PaintArea_hWnd = ?PaintArea:Image{PROP:Handle}
 PaintArea_hWnd = ?List{PROP:Handle}
 ! Сабклассинг области просмотра
 PaintArea_WndProc_Addr = SetWindowLong(PaintArea_hWnd, GWL_WNDPROC, ADDRESS(PaintArea_WndProc))
          ! Цикл работы с окном
          ACCEPT
          END
 CLOSE(PaintArea:Win)
!*************************************************************************************************
PaintArea_WndProc            PROCEDURE(HWND hWnd, UNSIGNED wMsg, WPARAM wParam, LPARAM lParam)
hDC                          HDC
hWndDC                       HDC
!PStruct                      LIKE(PAINTSTRUCT)
!DrawRect                     LIKE(RECT)                         ! Координаты области для просмотра
PosX                         LONG                               ! Координаты левого верхнего угла
PosY                         LONG                               ! отображаемой части картинки
res                          BYTE
 CODE
 CASE wMsg
   OF WM_CTLCOLORSCROLLBAR!WM_HSCROLL
       ! Просто для информации позиция скролбара
       !SetScrollRange (hWnd, SB_HORZ, 0, 255, TRUE)
       PaintArea_HScrollPos = GetScrollPos(hWnd, SB_HORZ)
       PaintArea_HScrollPos = SetScrollPos(hWnd, SB_HORZ,20,true)
       PaintArea_VScrollPos = GetScrollPos(hWnd, SB_VERT)
       PaintArea_HScrollPos = SetScrollPos(hWnd, SB_VERT,40,true)
      ! PaintArea_VScrollPos = GetScrollPos(hWnd, SB)
      ! PaintArea_HScrollPos = SetScrollPos(hWnd, SB,40,true)
       DISPLAY(?PaintArea_HScrollPos)
       DISPLAY(?PaintArea_VScrollPos)
       RETURN FALSE
 END
 RETURN CallWindowProc(PaintArea_WndProc_Addr, hWnd, wMsg, wParam, lParam)
