API и FreeBasic. (дочерние окна-TrackBar)

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

Для создания контрола требуется создать дочернее окно с помощью CreateWindowEx на базе класса msctls_trackbar32 .

По умолчанию диапазон значений позиций ползунка равен от 0 до 100. Вы можете по отдельности установить минимальный и максимальный диапазоны с помощью функции SendMessage c сообщением: TBM_SETRANGEMIN или TBM_SETRANGEMAX. При этом в параметре WPARAM должно быть одно из значений флага перерисовки (TRUE или FALSE) , а в параметре LPARAM нужное значение диапазона. Так же для установки сразу обоих диапазонов, можно использовать сообщение TBM_SETRANGE. При этом так же в параметре WPARAM должно быть одно из значений флага перерисовки (TRUE или FALSE) , а в параметре LPARAM комбинированное значение обоих диапазонов, записываемое с помощью макроса MAKELPARAM(min, max) .

При установке фокуса на контроле пользователь может изменять значения ползунка как с помощью мыши, так и с помощью клавиатуры. При этом в зависимости от клавиш или действий мыши ползунок может сдвигаться на разные интервалы. Так при нажатии на стрелки или нажатии мыши непосредственно на ползунок, он сдвигается на одну "строчку" . По умолчанию "строчка" равна единице, но это значение можно менять с помощью сообщения TBM_SETLINESIZE. При этом в параметре LPARAM передается значение шага "строчки", а параметр WPARAM должен содержать ноль. При нажатии мыши на шкалу или нажатии клавиш PageUp, PageDown, ползунок сдвигается на одну "страничку", которая по умолчанию равна одной пятой части диапазона. Это значение меняется с помощью сообщения TBM_SETPAGESIZE. При этом в параметре LPARAM передается значение шага для "страницы", а параметр WPARAM должен содержать ноль.

Для получения позиции ползунка посылают сообщение TBM_GETPOS, при этом в параметрах WPARAM и LPARAM передается ноль.

Для установки ползунка посылают сообщение TBM_SETPOS , при этом в параметре LPARAM передается новое значение ползунка, а в параметре WPARAM передается флаг:

  • TRUE - ползунок сдвигается
  • FALSE - ползунок не сдвигается, но в любом случае идет гарантия того, что текущее положение находится в пределах текущей минимальной и максимальной позиции

Некоторые стили для контрола (все стили ЗДЕСЬ):

  • TBS_AUTOTICKS - отображение рисок для всего диапазона (без этого стиля риски только для первого и последнего значения)
  • TBS_VERT - вертикальное отображение
  • TBS_HORZ - горизонтальное отображение
  • TBS_TOP - отображение рисок (если есть) выше ползунка, сам ползунок разворачивается к верху
  • TBS_BOTTOM - отображение рисок (если есть) ниже ползунка, сам ползунок разворачивается к низу
  • TBS_LEFT - отображение рисок (если есть) слева от ползунка, сам ползунок разворачивается влево
  • TBS_RIGHT - отображение рисок (если есть) справа от ползунка, сам ползунок разворачивается вправо
  • TBS_BOTH - отображение рисок по обе стороны от ползунка
  • TBS_NOTICKS - не отображать риски
  • TBS_ENABLESELRANGE - возможность выделения диапазона
  • TBS_FIXEDLENGTH - позволяет изменить размер ползунка. Для изменения следует послать сообщение TBM_SETTHUMBLENGTH
  • TBS_NOTHUMB - не отображать ползунок
  • TBS_TOOLTIPS - отображение подсказки для текущего значения

Сообщения для TrackBar (расширенную информацию можно получить ЗДЕСЬ):

  • TBM_CLEARSEL - Очищает текущий диапазон выбора
  • TBM_CLEARTICS - Удаляет текущее деление ползунка. Это сообщение не удаляется первое и последнее деления
  • TBM_GETCHANNELRECT - Получает размер и положение прямоугольника, ограничивающего область движения ползунка
  • TBM_GETLINESIZE - Возвращает размер шага "строчки"
  • TBM_GETNUMTICS Возвращает кол-во рисок
  • TBM_GETPAGESIZE - Возвращает размер шага "странички"
  • TBM_GETPOS - Возвращает текущую позицию ползунка
  • TBM_GETPTICS - Возвращает указатель на массив позиций рисок
  • TBM_GETRANGEMAX - Возвращает максимальную позицию ползунка
  • TBM_GETRANGEMIN - Возвращает минимальную позицию ползунка
  • TBM_GETSELEND - Возвращает конечную позицию текущего выбора диапазона
  • TBM_GETSELSTART - Возвращает начальную позицию текущего выбора диапазона
  • TBM_GETTHUMBLENGTH - Возвращает длину ползунка в пикселях
  • TBM_GETTHUMBRECT - Получает размер и положение прямоугольника, ограничивающего область ползунка
  • TBM_GETTIC - Возвращает положение риски с заданным номером
  • TBM_GETTICPOS - Возвращает физическое расположение указанной риски в системе координат внутренней области окна
  • TBM_GETTOOLTIPS - Возвращает дескриптор Tooltip , если подсказака установлена
  • TBM_GETUNICODEFORMAT - Возвращает флаг формата Unicode символов для контрола
  • TBM_SETLINESIZE - Устанавливает размер шага "строчки"
  • TBM_SETPAGESIZE - Устанавливает размер шага "странички"
  • TBM_SETPOS - Устанавливает текущую позицию ползунка
  • TBM_SETPOSNOTIFY - Устанавливает текущее логическое положение ползунка
  • TBM_SETRANGE - Установка обоих диапазонов
  • TBM_SETRANGEMAX - Установка конечного диапазона
  • TBM_SETRANGEMIN - Установка начального диапазона
  • TBM_SETSEL - Устанавливает начальную и конечную позиции доступного диапазона выделенной области
  • TBM_SETSELEND - Устанавливает конечную логическую позицию выделенной области диапазона. Это сообщение игнорируется, если TrackBar не имеет стиль TBS_ENABLESELRANGE
  • TBM_SETSELSTART - Устанавливает начальную логическую позицию выделенной области диапазона. Это сообщение игнорируется, если TrackBar не имеет стиль TBS_ENABLESELRANGE
  • TBM_SETTHUMBLENGTH - Устанавливает длину ползунка в пикселях
  • TBM_SETTIC - Устанавливает положение риски с заданным номером
  • TBM_SETTICFREQ - Установка интервала для рисок
  • TBM_SETTIPSIDE - Установка позиции подсказки
  • TBM_SETTOOLTIPS - Назначает подсказку для trackbar
  • TBM_SETUNICODEFORMAT - Устанавливает флаг формата Unicode для символов

Сообщения от TrackBar можно отлавливать в событиях WM_HSCROLL, WM_VSCROLL , WM_NOTIFY.  Если не использовать ручную отрисовку контрола, то можно обойтись только первыми двумя. 

Извещения поступаемые при отлове событий WM_HSCROLL или WM_VSCROLL (извещения изымаются из LOWORD(WPARAM) ) :

  • TB_PAGEUP - Пользователь сделал щелчок мышью по полосе Trackbar слева или сверху от ползунка, либо нажал клавишу PageUp
  • TB_PAGEDOWN - Пользователь сделал щелчок справа или снизу от ползунка, либо нажал клавишу с кодом PageDown
  • TB_LINEUP - Пользователь нажал на клавишу со стрелкой влево или вверх
  • TB_LINEDOWN - Пользователь нажал на клавишу со стрелкой влево или вверх
  • TB_TOP - Пользователь нажал на клавишу HOME
  • TB_BOTTOM - Пользователь нажал на клавишу END
  • TB_THUMBPOSITION - Пользователь переместил мышью ползунок в новое положение
  • TB_THUMBTRACK - Пользователь в данный момент перемещает ползунок спомощью мыши
  • TB_ENDTRACK - Пользователь переместил ползунок и отпустил клавишу или кнопку мыши

Пример:

#INCLUDE "windows.bi"
#INCLUDE "win/commctrl.bi"
InitCommonControls()
Dim msg As MSG
Dim As WNDCLASSEX wc
Dim As String NameClass="MyClass"
Dim As HINSTANCE Hinst=GetModuleHandle(0)

Function wndproc(hwnd As HWND, msg As Uinteger,_
    wparam As WPARAM, lparam As LPARAM) As Integer
    Static As HWND Tbar1,Tbar2,Tbar3,hwndBuddy
    Select Case msg
        Case WM_CREATE
            Tbar1=CreateWindowEx(0,"msctls_trackbar32", _
            "",TBS_AUTOTICKS Or WS_VISIBLE Or WS_CHILD,10,10,100,40,hwnd,Cast(HMENU,1),0,0)
            SendMessage(Tbar1,TBM_SETRANGE,TRUE,MAKELPARAM(1,10))
            Tbar2=CreateWindowEx(0,"msctls_trackbar32", _
            "",TBS_NOTICKS Or WS_VISIBLE Or WS_CHILD,10,60,100,40,hwnd,Cast(HMENU,2),0,0)
            Tbar3=CreateWindowEx(0,"msctls_trackbar32", _
            "",TBS_ENABLESELRANGE Or WS_VISIBLE Or WS_CHILD,10,110,100,40,hwnd,Cast(HMENU,3),0,0) 
            ' Создаем контрол STATIC и приклепляем к контролу Tbar3          
            hwndBuddy = CreateWindowEx(0, "STATIC", "0", SS_LEFT+WS_CHILD+WS_VISIBLE,_ 
                                    0, 0, 40, 20, hwnd, 0, 0, 0)
            SendMessage(Tbar3, TBM_SETBUDDY, FALSE, Cast(LPARAM,hwndBuddy)) 
            ' Выделяем диапазон от 30 до 70
            SendMessage(Tbar3,TBM_SETSEL,TRUE,MAKELONG(30,70))          
        Case WM_HSCROLL
            Select Case Loword(WPARAM)
                Case TB_THUMBTRACK,TB_LINEUP,TB_LINEDOWN
                    SetWindowText(hwndBuddy,Str(SendMessage(Tbar3,TBM_GETPOS,0,0)))
            End Select              
        Case WM_DESTROY
            PostQuitMessage(0)
        Case Else
            Return DefWindowProc(hwnd,msg,wparam,lparam)
    End Select
End Function

With wc
    .cbSize=SizeOf(WNDCLASSEX)
    .style=CS_HREDRAW Or CS_VREDRAW
    .lpfnWndProc=@wndproc
    .hInstance=Hinst
    .hIcon=LoadIcon(0,IDI_QUESTION)
    .hCursor=LoadCursor(0,IDC_ARROW)
    .hbrBackground=Cast(HBRUSH,COLOR_WINDOW)
    .lpszClassName=StrPtr(NameClass)
    .hIconSm=.hIcon
End With

If RegisterClassEx(@wc)=0 Then
    Print "Register error, press any key"
    Sleep
    End
Endif

CreateWindowEx(0,NameClass,"TrackBar",_
WS_VISIBLE Or WS_OVERLAPPEDWINDOW, _
100,100,300,220,0,0,Hinst,0)

While GetMessage(@msg,0,0,0)
    TranslateMessage(@msg)
    DispatchMessage(@msg)
Wend

trackBar.png

содержание | назад | вперед