Позиционирование на колонке листбокса
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Позиционирование на колонке листбокса
Добрый день!
Вопрос следующий: Есть листбокс, первая колонка фиксирована, остальные скроллируются по горизонтали. Колонок достаточно много, поэтому есть необходимость позиционирования на определенной.
Под позиционированием понимается, что при открытии формы колонки как бы уже проскроллированы до нужной.
Какие есть мысли по этому поводу?
Вопрос следующий: Есть листбокс, первая колонка фиксирована, остальные скроллируются по горизонтали. Колонок достаточно много, поэтому есть необходимость позиционирования на определенной.
Под позиционированием понимается, что при открытии формы колонки как бы уже проскроллированы до нужной.
Какие есть мысли по этому поводу?
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Re: Позиционирование на колонке листбокса
Только в сторонуJornada писал(а):Добрый день!
Вопрос следующий: Есть листбокс, первая колонка фиксирована, остальные скроллируются по горизонтали. Колонок достаточно много, поэтому есть необходимость позиционирования на определенной.
Под позиционированием понимается, что при открытии формы колонки как бы уже проскроллированы до нужной.
Какие есть мысли по этому поводу?
PROP:HScrollPos EQUATE(7CBBH) ! integer: Horizontal scroll position
отображается колонка или скрыта за краем листа,... такого пропа не помню.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Re: Позиционирование на колонке листбокса
Еще вопрос. Как отловить событие перемещения горизонтального бегунка? EVENT:ScrollDrag срабатывает только для вертикального
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Re: Позиционирование на колонке листбокса
Только сабкласить листбокс и пробовать ловить события от горизонтального скрола.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Дед Пахом
- Старичок
- Сообщения: 3285
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 48 раз
- Контактная информация:
Re: Позиционирование на колонке листбокса
Посмотрите пример из Help > PROP:WndProc для начала.
С уважением, ДП
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Re: Позиционирование на колонке листбокса
Кстати я тут подумал. Может не мучиться и сделать таймер и на нем проверять?Admin писал(а):Только сабкласить листбокс и пробовать ловить события от горизонтального скрола.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Re: Позиционирование на колонке листбокса
пока что свой скролл нарисовал, используя PROP:HScrollPos.
Re: Позиционирование на колонке листбокса
Поторопился я. Не получается горизонтальный скролл.. Попробовал пример из Help'a, по совету Деда Пахома, порылся в скудных обрывках информации по сабклассам.. Ну месседж получить могу, когда бегунок горизонтальный перемещаю.. а вот повлиять на его местоположение.. GetScrollPos ничего не возвращает, SetScrollPos не устанавливает. Может кто поделится рабочим примером?
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Re: Позиционирование на колонке листбокса
Можно на Windows API довольно таки легко сделать свой скроллбар.Jornada писал(а): Может кто поделится рабочим примером?
Только как он будет с листом работать х.з.
Пример за давностью потерялся.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Дед Пахом
- Старичок
- Сообщения: 3285
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 48 раз
- Контактная информация:
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)