На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Rouse_, jack128, Krid
  
    > Загрузка изображений средствами GDI Plus , Попытка создать LoadImage средствами GDI+
      Может быть кому-нибудь пригодиться данный код или он послужит отправной точкой. Аналогия WinApi функции LoadImage без каких-либо примочек, простенько, но свою задачу выполняет. Для одного проекта требовалось поместить на STATIC PNG изображение, пришлось написать такой вот код.

      ExpandedWrap disabled
        unit F_GdipImg;
         
        {
        GdipLoadImage(hInstance, MAKEINTRESOURCEW(RC_IMAGE), TYPE_RCDATA, GetSysColor(COLOR_BTNFACE));
        GdipLoadImage(hInstance, MAKEINTRESOURCEW(RC_IMAGE), TYPE_PNG, GetSysColor(COLOR_BTNFACE));
        GdipLoadImage(hInstance, MAKEINTRESOURCEW(RC_IMAGE), TYPE_GIF, GetSysColor(COLOR_BTNFACE));
        GdipLoadImage(hInstance, MAKEINTRESOURCEW(RC_IMAGE), TYPE_JPEG, GetSysColor(COLOR_BTNFACE));
        GdipLoadImage(0, 'C:\Image.png', TYPE_SHARED, GetSysColor(COLOR_BTNFACE));
        }
         
        interface
         
        uses
          Windows, F_GdiPlus, F_IStream;
         
        const
          TYPE_RCDATA = 1;
          TYPE_PNG    = 2;
          TYPE_GIF    = 3;
          TYPE_JPEG   = 4;
          TYPE_SHARED = 5;
         
        function GdipLoadImage(hinst: HMODULE; lpszName: PWideChar; uType: UINT; RgbClr: TColorRef): HBITMAP;
         
        implementation
         
        //
         
        function GdipLoadImage(hinst: HMODULE; lpszName: PWideChar; uType: UINT; RgbClr: TColorRef): HBITMAP;
        var
          hRes     : HRSRC;
          dwResSize: DWORD;
          hResLoad : HGLOBAL;
          lpResLock: Pointer;
          hMem     : HGLOBAL;
          pData    : Pointer;
          hr       : HRESULT;
          pStream  : IStream;
          Bitmap   : TGpImage;
          hGlob    : HGLOBAL;
          lpszType : PWideChar;
        begin
         
          Result := 0;
         
          case uType of
         
            TYPE_SHARED:
              begin
         
                GdipLoadImageFromFile(lpszName, Bitmap);
                if (Bitmap <> nil) then
                try
                  GdipCreateHBITMAPFromBitmap(Bitmap, Result, ColorRefToARGB(RgbClr));
                finally
                // GdipLoadImageFromFile.
                  GdipDisposeImage(Bitmap);
                end;
         
              end;
         
            else
         
              begin
         
                case uType of
                  TYPE_RCDATA: lpszType := MAKEINTRESOURCEW(RT_RCDATA);
                  TYPE_PNG   : lpszType := 'PNG';
                  TYPE_GIF   : lpszType := 'GIF';
                  TYPE_JPEG  : lpszType := 'JPEG';
                end;
         
                hRes := FindResourceW(hinst, lpszName, lpszType);
                if (hRes <> 0) then
                try
                  dwResSize := SizeofResource(hinst, hRes);
                  if (dwResSize <> 0) then
                  try
                    hResLoad := LoadResource(hinst, hRes);
                    if (hResLoad <> 0) then
                    try
                      lpResLock := LockResource(hResLoad);
                      if (lpResLock <> nil) then
                      try
                        hMem := GlobalAlloc(GMEM_MOVEABLE, dwResSize);
                        if (hMem <> 0) then
                        try
                          pData := GlobalLock(hMem);
                          if (pData <> nil) then
                          try
                            // если передать TRUE в CreateStreamOnHGlobal, то поток сам
                            // освободит выделенную память и не потребуется использовать
                            // GetHGlobalFromStream.
                            CopyMemory(pData, lpResLock, dwResSize);
                            pStream := nil;
                            hr := CreateStreamOnHGlobal(hMem, FALSE, pStream);
                            if (hr = S_OK) then
                            try
                              GdipLoadImageFromStream(pStream, Bitmap);
                              if (Bitmap <> nil) then
                              try
                                GdipCreateHBITMAPFromBitmap(Bitmap, Result, ColorRefToARGB(RgbClr));
                              finally
                              // GdipLoadImageFromStream.
                                GdipDisposeImage(Bitmap);
                              end;
                            finally
                            // CreateStreamOnHGlobal.
                              hr := GetHGlobalFromStream(pStream, hGlob);
                              if (hr = S_OK) then
                                GlobalFree(hGlob);
                              pStream := nil;
                            end;
                          finally
                          // GlobalLock.
                          end;
                        finally
                        // GlobalAlloc.
                          GlobalUnlock(hMem);
                          GlobalFree(hMem);
                        end;
                      finally
                      // LockResource.
                        UnlockResource(HGLOBAL(lpResLock));
                      end;
                    finally
                    // LoadResource.
                      FreeResource(hResLoad);
                    end;
                  finally
                  // SizeofResource.
                  end;
                finally
                // FindResource.
                end;
         
              end;
         
          end;
         
        end;
         
        end.
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0221 ]   [ 17 queries used ]   [ Generated: 28.03.24, 15:51 GMT ]