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

Это довольно простой для реализации контрол, сама цель которого визуально отображать статистику вывода какой-либо операции. Представляет из себя нечисловую приблизительную линейную шкалу. Живой пример - операция копирования в проводнике windows. Сам контрол ничем не управляет и может принимать 16 сообщений:

  • PBM_DELTAPOS - Перемещает текущую позицию прогресс бара на указанное приращение и перерисовывает панель, чтобы отразить новую позицию.
  • PBM_GETBARCOLOR - Получает цвет шкалы прогресс-бара
  • PBM_GETBKCOLOR - Получает цвет фона прогресс-бара
  • PBM_GETPOS - Возвращает текущую позицию прогресс-бара
  • PBM_GETRANGE - Получает информацию о диапазоне прогресс-бара (начальный и конечный)
  • PBM_GETSTATE - Получает состояние прогресс-бара (PBST_NORMAL,PBST_ERROR,PBST_PAUSED)
  • PBM_GETSTEP - Получает шаг приращения прогресс-бара. Шаг приращения суммы увеличивает индикатор текущей позиции всякий раз, когда он получает сообщение PBM_STEPIT. По умолчанию, шаг приращения равен 10
  • PBM_SETBARCOLOR - Устанавливает цвет шкалы прогресс-бара
  • PBM_SETBKCOLOR - Устанавливает цвет фона прогресс-бара
  • PBM_SETMARQUEE - Установка в анимацию ожидающего режима
  • PBM_SETPOS - Устанавливает текущее положение индикатора и перерисовывает панель, чтобы отразить новую позицию
  • PBM_SETRANGE - Устанавливает минимальное и максимальное значения диапазона для индикатора и перерисовывает панель, чтобы отразить новый диапазон
  • PBM_SETRANGE32 - Устанавливает минимальное и максимальное значения для индикатора для 32-битных значений, и перерисовывает панель, чтобы отразить новый диапазон
  • PBM_SETSTATE - Устанавливает состояние прогресс-бара (PBST_NORMAL,PBST_ERROR,PBST_PAUSED)
  • PBM_SETSTEP - Задает шаг приращения для прогресс-бара. Шаг приращения суммы увеличивает индикатор текущей позиции всякий раз, когда он получает сообщение PBM_STEPIT. По умолчанию, шаг приращения равен 10
  • PBM_STEPIT - Перемещает текущую позицию для индикатора на приращение шага и перерисовывает панель, чтобы отразить новую позицию

Создается контрол функцией CreateWindowEx и классом msctls_progress32. Для контрола можно использовать 4 визуальных стиля:

  • PBS_MARQUEE - подключает анимацию ожидания (отображается как непрерывное движение). Для приложения должен быть подключен Manifests в ресурсах
  • PBS_SMOOTH - сглаженная шкала без разделения
  • PBS_SMOOTHREVERSE - сглаженная шкала без разделения, двигается в обратном положении от большого к маленькому (у меня почему не работает этот стиль)
  • PBS_VERTICAL - вертикальное отображение

И собственно пример:

Progress.bas

#INCLUDE "windows.bi"
#INCLUDE "win/commctrl.bi"

#DEFINE PBS_MARQUEE 8
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 Progress,Progress2

    Select Case msg
        Case WM_CREATE
            Progress = CreateWindowEx(0,"msctls_progress32","",WS_VISIBLE Or WS_CHILD Or PBS_SMOOTH,10,10,200,20,hwnd,Cast(HMENU,1),0,0)
            Progress2 = CreateWindowEx(0,"msctls_progress32","",WS_VISIBLE Or WS_CHILD Or PBS_MARQUEE,10,40,130,20,hwnd,Cast(HMENU,2),0,0)
            SetTimer(hwnd,1,100,0)
        Case WM_TIMER
            Static As Integer state = 0
            SendMessage(Progress,PBM_SETPOS,state,0)
            SendMessage(Progress2,PBM_SETPOS,state,0)
            state+=1
            If state>=100 Then state = 0
        Case WM_DESTROY
            PostQuitMessage(0)
    End Select
    Return DefWindowProc(hwnd,msg,wparam,lparam)
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,"Окно с Progress Bar",_
WS_VISIBLE Or WS_OVERLAPPEDWINDOW,10,10,300,200,0,0,Hinst,0)

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

Progress.rc

#DEFINE MANIFEST 24
#DEFINE IDR_XPMANIFEST1 1

IDR_XPMANIFEST1 MANIFEST "xpmanifest.xml"

xpmanifest.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="*"
    name="Company.Product.Name"
    type="win32"
/>
<description></description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="*"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

progressbar.png

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