Конференция "WinAPI" » загрузить gif из ресурса [D7]
 
  • зарегистрировать (22.05.10 00:21) [0]
    помогите пожалуйста загрузить GIF картинку из файла ресурсов и нарисовать ее на форме средствами WinAPI.
    или может есть способы отобразить картинку на WinAPI форме без использования файла ресурсов?
  • Германн © (22.05.10 01:09) [1]
    А нельзя ли по-русски сформулировать вопрос без использования "умных" терминов?
  • Игорь Шевченко © (22.05.10 01:18) [2]
    загрузить gif, преобразовать в bmp, дальше рисовать bmp стандартным способом, в обработчике сообщения WM_PAINT, через BitBlt или StretchBlt.

    способ загрузить ресурс прост - LoadResource.
    способ преобразовать GIF в BMP - в гугле их масса.
  • Германн © (22.05.10 01:32) [3]

    > Игорь Шевченко ©   (22.05.10 01:18) [2]

    Уж когда умные ребята создали RxLib. И уже тогда в ней появился класс TGIFImage. Может в более поздних версиях Дельфи он тоже появился? Не знаю. Но то что TGIFImage не преобразует gif в bmp - это точно. Иначе не было бы в вышеупомянутой библиотеке класса TRxGIFAnimator.
  • зарегистрировать (22.05.10 01:37) [4]
    Германн, есть gif картинка и я хочу отобразить ее на форме. Но форма не VCL, а Win API...
  • зарегистрировать (22.05.10 02:08) [5]
    Игорь Шевченко, а нет никакого примера? Что-то я в гугле нашел только варианты конвертации через timage :(
  • Германн © (22.05.10 02:08) [6]

    > зарегистрировать   (22.05.10 01:37) [4]
    >
    > Германн, есть gif картинка и я хочу отобразить ее на форме.
    >  Но форма не VCL, а Win API...
    >

    Понятие "форма" есть в VCL Delphi. Понятия "форма" нет в Windows и следовательно нет и в WinAPI. Так что же тебе нужно, Саид?
  • зарегистрировать (22.05.10 02:13) [7]
    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); // показываю



    надо показать на этой форме картинку...
  • Германн © (22.05.10 02:18) [8]

    > надо показать на этой форме картинку...

    Это не форма. Это окно.
  • 0x00FF00 (22.05.10 02:19) [9]
    GIF однокадровый или многокадровый?
  • зарегистрировать (22.05.10 02:22) [10]
    0x00FF00, однокадровый
  • 0x00FF00 (22.05.10 02:28) [11]
    unit GIFJPG;

    interface
    uses Windows;

    type
     ISeqStream = interface(IUnknown)
       ['{0C733A30-2A1C-11CE-ADE5-00AA0044773D}']
     end;

     IStream = interface(ISeqStream)
       ['{0000000C-0000-0000-C000-000000000046}']
     end;
     
     IPicture = interface
       ['{7BF80980-BF32-101A-8BBB-00AA00300CAB}']
       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 = '{7BF80980-BF32-101A-8BBB-00AA00300CAB}';

    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:30) [12]

    > зарегистрировать   (22.05.10 02:22) [10]
    >
    > 0x00FF00, однокадровый
    >

    Тогда
    > Игорь Шевченко ©   (22.05.10 01:18) [2]

    Или всё же воспользоваться RxLib. Я не имею в виду устанавливать саму библиотеку. Но использовать её исходники как пример.
  • 0x00FF00 (22.05.10 02:33) [13]
    Вот самописный модуль для работы с однокадровыми GIF и JPG через OLE-средства Windows.
    Написано было давным-давно, не знаю станет ли работать на Vista/W7.

    Формат входных данных:

    Для LoadGIFJPGFile: очевиден.

    Для LoadGIFJPGRes:
    - I: базовый адрес процесса
    - N: имя ресурса
    - T: ресурсная секция

    Формат выходных данных:
    Идентификатор картинки, так наз. HBITMAP; Как его сопстно нарисовать — пусть останется тебе на Д/З =)
  • Германн © (22.05.10 02:33) [14]
    Удалено модератором
    Примечание: Правила читаем
  • 0x00FF00 (22.05.10 02:38) [15]
    > В данном сабже - извращение!

    Ну хочется человеку WinAPI — ну пусть будет API.

    PS. Помню, было ещё какое-то исправление в "файловой" функции, только не помню, какое. По-моему, wfd могла бы корректнее освобождаться... за давностью лет не вспомню уже. Давным-давно уже забросил разработку под Windows.
  • 0x00FF00 (22.05.10 02:53) [16]

    > 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;

  • зарегистрировать (22.05.10 02:53) [17]
    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);



    не рисуется :( что я делаю неправильно?
  • 0x00FF00 (22.05.10 02:58) [18]
    > не рисуется :( что я делаю неправильно?

    Вызов BitBlt должен быть сделан непосредственно в обработчике сообщения WM_PAINT.
    Учти, что DC с каринкой обязан "дожить" до этого момента нетронутым.
    А оконный передаётся в параметрах WM_PAINT.
  • 0x00FF00 (22.05.10 03:00) [19]
    > нетронутым.

    в том смысле, что картинка, будучи скормленной этому DC, не освобождается, равно как и сам DC, до окончания цикла перерисовки.
  • зарегистрировать (22.05.10 03:01) [20]
    Получилось
    Спасибо!!!
  • Германн © (22.05.10 03:27) [21]
    Удалено модератором
    Примечание: Правила читаем
  • TechnoBOY © (23.03.11 23:18) [22]
    Удалено модератором
    Примечание: Свой вопрос - своя ветка
 
Конференция "WinAPI" » загрузить gif из ресурса [D7]
Есть новые Нет новых   [134431   +12][b:0][p:0.003]