sDllName = "AutoPlay\\Docs\\IsSlideshow.dll"; -- путь + имя DLL tImages = nil; -- таблица с путями к картинкам (по умолчанию) nCurrentSlide = 0; -- индекс текущего слайда (по умолчанию) nCurrentEffect = 1; -- тип текущего эффекта (по умолчанию) nTimerPlayID = 100; -- идентификатор таймера воспроизведения SlideShow nTimerNavID = 101; -- идентификатор таймера навигации (таймер навигации нужен для задержки запуска таймера воспроизведения) nIntervalPlay = 2000; -- интервал таймера воспроизведения SlideShowв мсек nIntervalNav = 1000; -- интервал таймера навигации nLoop = true; -- флаг бесконечного проигрывания ------------------------------------------------------------------------------------------------ -- Типы растягивания изображения SS_ORIGINAL = 0; -- истинный размер изображения SS_PROPORTIONAL = 1; -- пропорциональное растягивание изображения до размеров окна SS_STRETCH = 2; -- растягивание изображения до заполнения окна -- Типы эффектов SE_RANDOM = 1; SE_ALPHA_BLEND = 2; SE_BLOCKS = 3; SE_CIRCLE = 4; SE_DIAGONAL = 5; SE_FUSE = 6; SE_INTERLACED = 7; SE_PAGE = 8; SE_RADIAL = 9; SE_ROLL = 10; SE_WATERFALL = 11; SE_WIPE = 12; --============================================================================================== -- Обертки API-функций и функций IsSlideshow.dll --============================================================================================== function LoadLibrary(ImagePath, Effect) return tonumber(DLL.CallFunction("kernel32", "LoadLibraryA", "\""..sDllName.."\"", DLL_RETURN_TYPE_LONG, DLL_CALL_STDCALL)) end function FreeLibrary(hDll) DLL.CallFunction("kernel32", "FreeLibrary", hDll, DLL_RETURN_TYPE_LONG, DLL_CALL_STDCALL) end function InitializeSlideShow(hWnd, Left, Top, Width, Height, Animate, Stretch) if (Animate) then Animate = 1 else Animate = 0 end DLL.CallFunction(sDllName, "InitializeSlideShow", hWnd..","..Left..","..Top..","..Width..","..Height..","..Animate..","..Stretch, DLL_RETURN_TYPE_LONG, DLL_CALL_STDCALL); end function ShowImage(ImagePath, Effect) DLL.CallFunction(sDllName, "ShowImage", "\""..ImagePath.."\","..Effect, DLL_RETURN_TYPE_LONG, DLL_CALL_STDCALL); end function DeinitializeSlideShow() DLL.CallFunction(sDllName, "DeinitializeSlideShow", "", DLL_RETURN_TYPE_LONG, DLL_CALL_STDCALL); end --============================================================================================== -- Возвращает true, если активно диалоговое окно в противном случае возвращает false --============================================================================================== function IsDialog() if (DialogEx.GetWndHandle() ~= - 1) then return true else return false end end --============================================================================================== -- Возвращает true, если активна страница проекта в противном случае возвращает false --============================================================================================== function IsPage() if (DialogEx.GetWndHandle() == - 1) and (Application.GetWndHandle() ~= -1) then return true else return false end end --============================================================================================== -- Запуск таймера воспроизведения --============================================================================================== function StartTimerPlay() if (IsDialog) then DialogEx.StartTimer(nIntervalPlay, nTimerPlayID); end -- если активно диалоговое окно, запускаем таймер диалогового окна if (IsPage) then Page.StartTimer(nIntervalPlay, nTimerPlayID); end -- если активно окно проекта, запускаем страничный таймер end --============================================================================================== -- Запуск таймера навигации --============================================================================================== function StartTimerNav() if (IsDialog) then DialogEx.StartTimer(nIntervalNav, nTimerNavID); end -- если активно диалоговое окно, запускаем таймер диалогового окна if (IsPage) then Page.StartTimer(nIntervalNav, nTimerNavID); end -- если активно окно проекта, запускаем страничный таймер end --============================================================================================== -- Остановка таймера воспроизведения --============================================================================================== function StopTimerPlay() if (IsDialog) then DialogEx.StopTimer(nTimerPlayID); end -- если активно диалоговое окно, останавливаем таймер диалогового окна if (IsPage) then Page.StopTimer(nTimerPlayID); end -- если активно окно проекта, останавливаем страничный таймер end --============================================================================================== -- Остановка таймера навигации --============================================================================================== function StopTimerNav() if (IsDialog) then DialogEx.StopTimer(nTimerNavID); end -- если активно диалоговое окно, останавливаем таймер диалогового окна if (IsPage) then Page.StopTimer(nTimerNavID); end -- если активно окно проекта, останавливаем страничный таймер end --============================================================================================== -- Возвращает таблицу, содержащую пути к файлам картинок из указанной папки. -- Если в папке нет картинок или произошла ошибка, то будет возвращено nil. -- -- sPath - путь к папке в которой нужно производить поиск картинок -- bRecurse - флаг рекурсии. true/false - разрешить/запретить поиск картинок в подпапках --============================================================================================== function FillFromFolder(sPath, bRecurse) local t = File.Find(sPath, '*.*', bRecurse, false, nil, nil); -- получаем таблицу путей всех файлов в указанной папке if t then -- если в указанной папке есть файлы for n = Table.Count(t), 1, -1 do -- в цикле удаляем из таблицы пути к фалам не соответствующие маскам local sExt = String.SplitPath(t[n]).Extension; -- получаем расширение файла if (String.Lower(sExt) ~= '.bmp') and (String.Lower(sExt) ~= '.png') and (String.Lower(sExt) ~= '.jpg') then -- если расширение файла не соответствует маскам Table.Remove(t, n); -- удаляем запись из таблицы end end if (Table.Count(t) == 0) then t = nil end -- если таблица пустая, то уничтожаем ее nCurrentSlide = 0; -- сбрасываем индекс текущего слайда end return t -- возвращаем таблицу (или nil) end --============================================================================================== -- Создает объект SlideShow -- -- nLeft - левая координата -- nTop - верхняя координата -- nWidth - ширина -- nHeight - высота -- bAnimate - флаг анимации -- nStretch - тип расиягивания --============================================================================================== function CreateSlideShow(nLeft, nTop, nWidth, nHeight, bAnimate, nStretch) local hWnd = -1; -- дескриптор родительского окна для SlideShow (по умолчанию) if (IsDialog) then hWnd = DialogEx.GetWndHandle(); end -- получаем дескриптор родительского окна (Диалоговое окно) if (IsPage) then hWnd = Application.GetWndHandle(); end -- получаем дескриптор родительского окна (Окно проекта) -- Если не удалось получить дескриптор родительского окна для SlideShow, -- прерываем выполнение программы и выводим сообщение об ошибке. assert(hWnd ~= -1, "Не удалось получить дескриптор родительского окна!"); hDllS = LoadLibrary(sDllName); -- загружаем в память IsSlideshow.dll if (hDllS ~= 0) then InitializeSlideShow(hWnd, nLeft, nTop, nWidth, nHeight, bAnimate, nStretch); end -- инициализация объекта SlideShow end --============================================================================================== -- Отображение картинки в SlideShow --============================================================================================== function DisplayImage() nCurrentSlide = nCurrentSlide + 1; -- наращиваем индекс текущего слайда if (nCurrentSlide > Table.Count(tImages)) then -- если индекс слайда больше последнего nCurrentSlide = 1; -- устанавливаем индекс текущиего слайда end if (nCurrentSlide <= Table.Count(tImages)) then -- если индекс текущего слайда не болше последнего sImagePath = tImages[nCurrentSlide]; -- путь к картинке из таблицы по указаному индексу ShowImage(sImagePath, nCurrentEffect); -- отображаем картинку в SlideShow с указанным эффектом if (nCurrentSlide == Table.Count(tImages)) and (not bLoop) then -- если это последний слайд и сброшен флаг бесконечного проигрывания StopTimerPlay(); -- останавливаем таймер воспроизведения bPlay = false; -- сбрасываем флаг воспроизведения Label.SetText("Status", "STOP"); -- отображаем статус SlideShow nCurrentSlide = 0; -- сбрасываем индекс текущего слайда end end end --============================================================================================== -- Воспроизведение SlideShow с указанными интервалом в мсек --============================================================================================== function PlaySlideShow() bPause = false; -- сбрасываем флаг паузы if (not bPlay) then -- если флаг воспроизведения не установлен if (type(tImages) == "table") and (Table.Count(tImages) > 0) then -- если есть таблица, заполненная путями к картинкам bPlay = true; -- устанавливаем флаг воспроизведения Label.SetText("Status", "PLAY"); -- отображаем статус SlideShow DisplayImage(); -- отображаем слайд StartTimerPlay(); -- запуск таймера воспроизведения end end end --============================================================================================== -- Пауза SlideShow --============================================================================================== function PauseSlideShow() if (bPlay) then -- если флаг воспроизведения установлен if (bPause) then -- если флаг паузы установлен bPause = false; -- сбрасываем флаг паузы Label.SetText("Status", "PLAY"); -- отображаем статус SlideShow else -- если флаг паузы не установлен bPause = true ; -- устанавливаем флаг паузы Label.SetText("Status", "PAUSE"); -- отображаем статус SlideShow end end end --============================================================================================== -- Перейти на первый слайд --============================================================================================== function JumpFirstSlide() if (bPlay) and (not bPause) then -- если флаг воспроизведения установлен и сброшен флаг паузы nCurrentSlide = 1; -- устанавливаем индекс текущего слайда, как первый StopTimerPlay(); -- останавливаем таймер воспроизведения -- отображаем картинку с новым индексом sImagePath = tImages[nCurrentSlide]; -- путь к картинке из таблицы по указаному индексу ShowImage(sImagePath, SE_ALPHA_BLEND); -- отображаем картинку в SlideShow с указанным эффектом StartTimerNav(); -- запуск таймера навигации, который через интервал включит таймер воспроизведения StartTimerNav(); end end --============================================================================================== -- Перейти на предыдущий слайд --============================================================================================== function JumpPrevSlide() if (bPlay) and (not bPause) then -- если флаг воспроизведения установлен и сброшен флаг паузы nCurrentSlide = nCurrentSlide - 1; -- индекс текущего слайда уменьшенный на 1 if (nCurrentSlide < 1) then nCurrentSlide = 1 end -- если индекс текущего слайда меньше 1, то устанавливаем индекс 1-го слайда StopTimerPlay(); -- останавливаем таймер воспроизведения, чтобы не сбивал счетчик индекса слайда -- отображаем картинку с новым индексом sImagePath = tImages[nCurrentSlide]; -- путь к картинке из таблицы по указаному индексу ShowImage(sImagePath, SE_ALPHA_BLEND); -- отображаем картинку в SlideShow с указанным эффектом StartTimerNav(); -- запуск таймера навигации, который через интервал включит таймер воспроизведения end end --============================================================================================== -- Перейти на слудующий слайд --============================================================================================== function JumpNextSlide() if (bPlay) and (not bPause) then -- если флаг воспроизведения установлен и сброшен флаг паузы nCurrentSlide = nCurrentSlide + 1; -- индекс текущего слайда увеличенный на 1 if (nCurrentSlide > Table.Count(tImages)) then nCurrentSlide = Table.Count(tImages) end -- если индекс текущего слайда больше последнего, то устанавливаем индекс последнего слайда StopTimerPlay(); -- останавливаем таймер воспроизведения, чтобы не сбивал счетчик индекса слайда -- отображаем картинку с новым индексом sImagePath = tImages[nCurrentSlide]; -- путь к картинке из таблицы по указаному индексу ShowImage(sImagePath, SE_ALPHA_BLEND); -- отображаем картинку в SlideShow с указанным эффектом StartTimerNav(); -- запуск таймера навигации, который через интервал включит таймер воспроизведения end end --============================================================================================== -- Перейти на последний слайд --============================================================================================== function JumpLastSlide() if (bPlay) and (not bPause) then -- если флаг воспроизведения установлен и сброшен флаг паузы nCurrentSlide = Table.Count(tImages); -- устанавливаем индекс текущего слайда, как последний StopTimerPlay(); -- останавливаем таймер воспроизведения -- отображаем картинку с новым индексом sImagePath = tImages[nCurrentSlide]; -- путь к картинке из таблицы по указаному индексу ShowImage(sImagePath, SE_ALPHA_BLEND); -- отображаем картинку в SlideShow с указанным эффектом if (bLoop) then -- если установлен флаг бесконечного воспроизведения StartTimerNav(); -- запуск таймера навигации, который через интервал включит таймер воспроизведения StartTimerNav(); else -- если сброшен флаг бесконечного воспроизведения bPlay = false; -- сбрасываем флаг воспроизведения Label.SetText("Status", "STOP"); -- отображаем статус SlideShow end end end --============================================================================================== -- Удаляет объект SlideShow --============================================================================================== function DeleteShow() StopTimerPlay(); -- останавливаем таймер воспроизведения DeinitializeSlideShow(); -- деинициализация объекта SlideShow FreeLibrary(hDllS); -- выгружаем из памяти IsSlideshow.dll end ------------------------------------------------------------------------------------------------