Пётр написал(а):Что касается GIF, то с помощью этой процедуры можно его загрузить:
Она взята из этой программы Прога, проверяющая пригодность телефонной линии для ADSL интернета
Петь, объясни пожалуйста “внутренности” работы процедуры по загрузке gif?
Технически как с ней работать вроде понятно, (подобие CatchImage()). Но многие моменты просто за пределами моего понимания.
Функция CreateStreamOnHGlobalfunction(),создает поток-объект, который использует HGLOBAL дескриптор памяти для хранения содержимого потока.
1.Здесь переменной Bild присваивается тип какой-то вероятно структуры (@pstm.IStream). Поясни, что это вообще за структура, которая не объявлялась в самой программе? И зачем вообще нужно создание потока!!?
2. OleLoadPicture()-Создает новый объект изображения и инициализирует его из содержимого потока. Здесь переменной Bild присваивается тип вероятно структуры (@Bild.IPicture) ,описанной в самой программе, но по виду она не похожа на привычную Структуры. Поясни, что это такое и структура ли это вообще???
IID_IPicture:
Data.l $7BF80980
Data.w $BF32,$101A
Data.b $8B,$BB,$00,$AA,$00,$30,$0C,$AB
Ну и дальше по коду что происходит? Понятно, что создается изображение, в которое рисуется и загружается наш гиф, но моменты типа:
Bild\Render(hDC,0,PicHeight,PicWidth,-PicHeight,0,0,Width,Height,0)
Bild\Release()
pstm\Release()
откуда берутся вообще не понятно???
Ясно, что процедура возвращает Хэндл изображения, которое мы потом и загружаем в ImageGadget, но вот по поводу структур полная не ясность. И прозрачный фон в загруженном изображении выглядит как черный фон, хотя в твоей программе логотип отображается правильно...??
Код:;- Window Constants
;
Enumeration
#Window_0
EndEnumeration
;- Gadget Constants
;
Enumeration
#Image_0
EndEnumeration
;- Fonts
Global FontID1
FontID1 = LoadFont(1, "Arial", 36)
Procedure Open_Window_0()
If OpenWindow(#Window_0, 216, 0, 620, 620, "New window ( 0 )", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
If CreateGadgetList(WindowID(#Window_0))
ImageGadget(#Image_0, 10, 10, 600, 600, Image0)
EndIf
EndIf
EndProcedure
Procedure LoadGIF_Mem(*GIF, GIF_Size, Image)
Protected ImageID=0
HGLOBAL = GlobalAlloc_(#GMEM_MOVEABLE, GIF_Size)
If HGLOBAL
pvData = GlobalLock_(HGLOBAL)
CopyMemory(*GIF, pvData, GIF_Size)
GlobalUnlock_(HGLOBAL)
If CreateStreamOnHGlobal_(HGLOBAL, #True, @pstm.IStream) = #S_OK
If OleLoadPicture_(pstm, GIF_Size, #False,?IID_IPicture, @Bild.IPicture) = #S_OK
Bild\get_Height(@Height)
Bild\get_Width(@Width)
hDC = GetDC_(GetDesktopWindow_())
ScreenPixels_X = GetDeviceCaps_(hDC,#LOGPIXELSX)
ScreenPixels_Y = GetDeviceCaps_(hDC,#LOGPIXELSY)
ReleaseDC_(GetDesktopWindow_(),hDC)
PicHeight = (Height * ScreenPixels_X) / 2540
PicWidth = (Width * ScreenPixels_Y) / 2540
result = CreateImage(Image,PicWidth,PicHeight)
If result
hDC = StartDrawing(ImageOutput(Image))
Bild\Render(hDC,0,PicHeight,PicWidth,-PicHeight,0,0,Width,Height,0)
StopDrawing()
EndIf
ImageID=result
Bild\Release()
pstm\Release()
EndIf
EndIf
EndIf
ProcedureReturn ImageID
EndProcedure
Open_Window_0()
LoadGIF_Mem(?Im, ?endIm-?Im, 1)
SetGadgetState(#Image_0,ImageID(1))
Repeat
Until WaitWindowEvent(3) = #PB_Event_CloseWindow
DataSection
Im:
IncludeBinary "циф.gif"
endIm:
IID_IPicture:
Data.l $7BF80980
Data.w $BF32,$101A
Data.b $8B,$BB,$00,$AA,$00,$30,$0C,$AB
EndDataSection
Здесь, картинка и код... http://willvs822.ifolder.ru/20854255
Отредактировано Lucagin (17.12.2010 05:16:29)