-
помогите пожалуйста загрузить GIF картинку из файла ресурсов и нарисовать ее на форме средствами WinAPI. или может есть способы отобразить картинку на WinAPI форме без использования файла ресурсов?
-
А нельзя ли по-русски сформулировать вопрос без использования "умных" терминов?
-
загрузить gif, преобразовать в bmp, дальше рисовать bmp стандартным способом, в обработчике сообщения WM_PAINT, через BitBlt или StretchBlt.
способ загрузить ресурс прост - LoadResource. способ преобразовать GIF в BMP - в гугле их масса.
-
> Игорь Шевченко © (22.05.10 01:18) [2]
Уж когда умные ребята создали RxLib. И уже тогда в ней появился класс TGIFImage. Может в более поздних версиях Дельфи он тоже появился? Не знаю. Но то что TGIFImage не преобразует gif в bmp - это точно. Иначе не было бы в вышеупомянутой библиотеке класса TRxGIFAnimator.
-
Германн, есть gif картинка и я хочу отобразить ее на форме. Но форма не VCL, а Win API...
-
Игорь Шевченко, а нет никакого примера? Что-то я в гугле нашел только варианты конвертации через timage :(
-
> зарегистрировать (22.05.10 01:37) [4] > > Германн, есть gif картинка и я хочу отобразить ее на форме. > Но форма не VCL, а Win API... >
Понятие "форма" есть в VCL Delphi. Понятия "форма" нет в Windows и следовательно нет и в WinAPI. Так что же тебе нужно, Саид?
-
Mwindow := CreateWindowEx(0,'win','window', WS_OVERLAPPEDWINDOW,100,100,300,300,0,0,Hinstance,nil); Com2 := CreateWindow('Button', 'Click me', WS_CHILD or BS_TEXT or WS_VISIBLE, 126, 3, 120, 20, Mwindow, btnClickme, Hinstance, nil); SHOWWINDOW (Mwindow,SW_SHOW); надо показать на этой форме картинку...
-
> надо показать на этой форме картинку...
Это не форма. Это окно.
-
GIF однокадровый или многокадровый?
-
0x00FF00, однокадровый
-
unit GIFJPG;
interface
uses Windows;
type
ISeqStream = interface(IUnknown)
['']
end;
IStream = interface(ISeqStream)
['']
end;
IPicture = interface
['']
function get_Handle(out handle: LongWord): HRESULT; stdcall;
end;
function getBitmapSize(B: HBITMAP):SIZE;
function LoadGIFJPGFile(FileName: string): HBITMAP;
function LoadGIFJPGRes(I: HINST; N, T: PChar): HBITMAP;
implementation
const IID_IPICTURE : TGUID = '';
function BuildStream(H: HGLOBAL; DelOnRls: BOOL; out S: IStream): HRESULT; stdcall; external 'ole32.dll' name 'CreateStreamOnHGlobal';
function LoadJPG(S: IStream; Sz: LongInt; fMode: BOOL; const iid: TGUID; out vObj): HRESULT; stdcall; external 'olepro32.dll' name 'OleLoadPicture';
function getBitmapSize(B: HBITMAP):SIZE;
var buf : BITMAP;
begin
FillChar(buf, SizeOf(BITMAP), 0);
GetObject(B, SizeOf(BITMAP), @buf);
result.cx:=buf.bmWidth;
result.cy:=buf.bmHeight;
end;
function LoadGIFJPGMem(G: HGLOBAL; Sz: DWORD): HBITMAP;
var
S : IStream;
P : IPicture;
H : Cardinal;
bs : SIZE;
S_DC, D_DC : HDC;
begin
BuildStream(G, true, S);
LoadJPG(S, Sz, false, IID_IPICTURE, P);
P.get_Handle(H);
P._AddRef;
bs:=GetBitmapSize(H);
S_DC:=CreateCompatibleDC(0);
SelectObject(S_DC, H);
Result:=CreateCompatibleBitmap(S_DC, bs.cx, bs.cy);
D_DC:=CreateCompatibleDC(0);
SelectObject(D_DC, Result);
BitBlt(D_DC, 0, 0, bs.cx, bs.cy, S_DC, 0, 0, SRCCOPY);
ReleaseDC(Result, D_DC);
DeleteDC(D_DC);
ReleaseDC(H, S_DC);
DeleteDC(S_DC);
P._Release;
end;
function LoadGIFJPGFile(FileName: string): HBITMAP;
var
F : HFILE;
P : Pointer;
S : LongInt;
T : Cardinal;
wfd : WIN32_FIND_DATA;
begin
Result:=0;
F:=CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if F=INVALID_HANDLE_VALUE then exit;
FindFirstFile(PChar(FileName), wfd);
S:=wfd.nFileSizeLow;
LongInt(P):=LocalAlloc(GMEM_FIXED, S);
ReadFile(F, P^, S, T, nil);
Result:=LoadJPGMem(LongInt(P), S);
LocalFree(LongInt(P));
CloseHandle(F);
end;
function LoadGIFJPGRes(I: HINST; N, T: PChar): HBITMAP;
var
G, P : Pointer;
R : HGLOBAL;
S : LongInt;
begin
Result:=0;
R:=FindResource(I, N, T);
if R=0 then exit;
S:=SizeofResource(I, R);
LongInt(G):=LoadResource(I, R);
LongInt(P):=LocalAlloc(GMEM_FIXED, S);
move(G^, P^, S);
Result:=LoadJPGMem(LongInt(P), S);
LocalFree(LongInt(P));
end;
end.
-
> зарегистрировать (22.05.10 02:22) [10] > > 0x00FF00, однокадровый >
Тогда > Игорь Шевченко © (22.05.10 01:18) [2]
Или всё же воспользоваться RxLib. Я не имею в виду устанавливать саму библиотеку. Но использовать её исходники как пример.
-
Вот самописный модуль для работы с однокадровыми GIF и JPG через OLE-средства Windows. Написано было давным-давно, не знаю станет ли работать на Vista/W7.
Формат входных данных:
Для LoadGIFJPGFile: очевиден.
Для LoadGIFJPGRes: - I: базовый адрес процесса - N: имя ресурса - T: ресурсная секция
Формат выходных данных: Идентификатор картинки, так наз. HBITMAP; Как его сопстно нарисовать — пусть останется тебе на Д/З =)
-
Удалено модератором Примечание: Правила читаем
-
> В данном сабже - извращение!
Ну хочется человеку WinAPI — ну пусть будет API.
PS. Помню, было ещё какое-то исправление в "файловой" функции, только не помню, какое. По-моему, wfd могла бы корректнее освобождаться... за давностью лет не вспомню уже. Давным-давно уже забросил разработку под Windows.
-
> wfd могла бы корректнее освобождаться
Всё-таки вспомнил. Нужен был вызов FindClose. Исправлено "на ходу": function LoadGIFJPGFile(FileName: string): HBITMAP;
var
F : HFILE;
P : Pointer;
S : LongInt;
T : Cardinal;
wfd : WIN32_FIND_DATA;
begin
Result:=0;
F:=FindFirstFile(PChar(FileName), wfd);
if F=INVALID_HANDLE_VALUE then exit;
FindClose(F);
F:=CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
S:=wfd.nFileSizeLow;
LongInt(P):=LocalAlloc(GMEM_FIXED, S);
ReadFile(F, P^, S, T, nil);
Result:=LoadJPGMem(LongInt(P), S);
LocalFree(LongInt(P));
CloseHandle(F);
end;
-
0x00FF00, Спасибо!!! если можно, еще 1 вопрос рисовать пытаюсь вот так: hbmp:= LoadGIFJPGRes(hInstance, 'picture', 'GIF');
hdc1:=GetDC(Mwindow);
hdc2:=CreateCompatibleDC(hdc1);
SelectObject(hdc2,hbmp);
BitBlt(hdc1,100,100,545,493,hdc2,0,0,SRCCOPY); не рисуется :( что я делаю неправильно?
-
> не рисуется :( что я делаю неправильно?
Вызов BitBlt должен быть сделан непосредственно в обработчике сообщения WM_PAINT. Учти, что DC с каринкой обязан "дожить" до этого момента нетронутым. А оконный передаётся в параметрах WM_PAINT.
-
> нетронутым.
в том смысле, что картинка, будучи скормленной этому DC, не освобождается, равно как и сам DC, до окончания цикла перерисовки.
-
Получилось Спасибо!!!
-
Удалено модератором Примечание: Правила читаем
-
Удалено модератором Примечание: Свой вопрос - своя ветка
|