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