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

Animation Control - простой контрол, способный воспроизводить видео в формате AVI, при этом видео должно быть без звука, однопоточно, несжато или на крайняк сжато используя (BI_RLE8) кодирование. Пример использования данного контрола можно встретить в Windows XP (анимация поиска, перемещение файла и т.д.) В Windows 7 я нашел только одну анимашку в SHELL32.DLL. Пример ниже покажет как ее загрузить и отобразить.
И так для использования данного контрола, надо его создать обычным образом как и все остальные контролы с помощью CreateWindow и классом ANIMATE_CLASS (или если по каким-то причинам у вас не прописан этот макрос, то "SysAnimate32").  У данного класса выделяются основные используемые стили:

  • ACS_AUTOPLAY - Проигрывание видеоизображения начинается автоматически сразу после открытия соответствующего AVI-файла
  • ACS_CENTER - Видеоизображение будет центрировано в окне органа управления
  • ACS_TRANSPARENT - Изображение рисуется в прозрачном режиме

Для органа управления Animation определены макрокоманды, посылающие сообщения ACM_OPEN, ACM_PLAY и ACM_STOP. Все они возвращают значение TRUE в случае успешного завершения и FALSE при ошибке.

Открытие видеоролика:

Animate_Open (hwnd, lpszName)

  • hwnd - хендл контрола
  • lpszName - указатель на текстовый буфер, в который записан путь к AVI-файлу или идентификатор ресурса AVI, созданный с помощью макрокоманды MAKEINTRESOURCE

Закрытие видеоролика:

Animate_Close (hwnd)

  • hwnd - хендл контрола

Запуск проигрывания:

Animate_Play (hwnd, wFrom, wTo, cRepeat)

  • hwnd - хендл контрола
  • wFrom - номер начального кадра в видеоролике (отсчет с 0)
  • wTo - номер конечного кадра в видеоролике (не может быть больше 65536)
  • cRepeat - определяет количество повторных проигрываний, которые необходимо выполнить. Если в этом параметре указано значение -1, проигрывание выполняется бесконечное число раз

Остановка проигрывания:

Animate_Stop (hwnd)

  • hwnd - хендл контрола

Позиционирование:

Animate_Seek (hwnd, wFrame)

  • hwnd - хендл контрола
  • wFrame - номер кадра для отображения

Орган управления может посылать в родительское окно извещения в форме сообщения WM_COMMAND . Это извещения ACN_START и ACN_STOP. Первое из них сообщает о том, что процесс проигрывания видеоролика начался, а второй - что этот процесс завершился.

И так пример, работающий под Windows 7 и использующий ресурс Shell32.dll (под Windows XP он работать будет тоже, но номер ресурсов AVI в DLL файле будет другой, да и анимашка тоже будет другая:

#INCLUDE "windows.bi"
#INCLUDE "win/commctrl.bi"
InitCommonControls()
Dim msg As MSG 'структурированная переменная MSG
Dim As WNDCLASSEX wc 'структурированная переменная WNDCLASSEX
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 anim As HWND : Static As HINSTANCE HinstLib
    Select Case msg
        Case WM_CREATE
            HinstLib=LoadLibrary("shell32.dll")
            anim=CreateWindowEx(0,ANIMATE_CLASS,"",_
            WS_VISIBLE Or WS_CHILD Or ACS_TRANSPARENT ,5,5,0,0,hwnd,Cast(HMENU,1),HinstLib,0)
            Animate_Open(anim, MAKEINTRESOURCE(165))
            Animate_Play(anim, 0, -1, -1)
        Case WM_DESTROY
            FreeLibrary(HinstLib)
            Animate_Stop(anim)
            Animate_Close(anim)
            PostQuitMessage(0)
    End Select
    Return DefWindowProc(hwnd,msg,wparam,lparam)
End Function
' Заполнение структуры WNDCLASSEX
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,"Animate",_
WS_VISIBLE Or WS_OVERLAPPEDWINDOW,100,100,300,110,0,0,Hinst,0)
' Цикл сообщений
While GetMessage(@msg,0,0,0)
    TranslateMessage(@msg)
    DispatchMessage(@msg)
Wend


Вот что примерно должно быть:

animation_control_1.png

Для того, чтобы легко извлечь ресурс из shell32.dll , в примере загружается этот модуль и хендл его указывается при создании Animate_Сontrol. Далее при открытии видеоролика, в макрос Animate_Open просто передается номер ресурса, по которому располагается AVI мувик. Я прилагаю ниже архив с файлами. В одном из них пример загрузки AVI из файла на диске:

Скачать

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