С++Builder: Класс ucGetResource v0.1

По ходу разработки я столкнулся с проблемой, мне нужно было использовать несколько картинок, плюс, чтобы они были в ресурсах, дабы не плодить файлы. Как известно, нативные картинки — это BITMAP, но весят они как кирпичи, и прилепляя к exe-шнику очередной BMP — мы получаем прибавку к размеру зачастую больше, чем вдвое! По потребностям я решил использовать JPEG-файлы, доставать их из ресурсов и преобразовывать в BITMAP (такой ход был необходимым аспектом решения моей задачи). После всех пыток и войной с TResourceStream (который, зараза, так и не заработал) я пришёл к решению, но решение это было довольно ёмким по количеству строк, чтобы без напрягов его копипастить. После я решил сделать класс, который буду расширять в будущем (например для работы с PNG, GIF). Используя класс — можно лишь парой строк получить чистый BITMAP из JPEG-а в ресурсах.
Вот код заголовочного .h файла:
//---------------------------------------------------------------------------
#ifndef uc_get_resourceH
#define uc_get_resourceH
//---------------------------------------------------------------------------
#include <jpeg.hpp>
//---------------------------------------------------------------------------

// доставатель данных из ресурсов
class ucGetResource {
public:
 char *TypeReturn; // тут будет хранится какой тип мы доставали последний раз (BITMAP или HBITMAP)
 // можно использовать для того, чтобы определять, откуда брать результат
 BITMAP bmResult;
 HBITMAP hbmResult;

// получаем чистый BITMAP из JPEG
 BITMAP GetBitmapFromJPEG(
 UnicodeString ResourceName,
 LPCTSTR ResourceType = RT_RCDATA,
 HINSTANCE hInstance = GetModuleHandle( NULL )
 );

// получить HBITMAP из JPEG
 HBITMAP GetHBitmapFromJPEG(
 UnicodeString ResourceName,
 LPCTSTR ResourceType = RT_RCDATA,
 HINSTANCE hInstance = GetModuleHandle( NULL )
 );
};

#endif


А вот код .cpp файла:
//---------------------------------------------------------------------------
#pragma hdrstop
#include "uc_get_resource.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)

BITMAP ucGetResource::GetBitmapFromJPEG(
 UnicodeString ResourceName, // символьный идентификатор ресурса
 LPCTSTR ResourceType, // (опционально) - тип ресурса RC_RCDATA по умолчанию
 HINSTANCE hInstance // (опционально) - по умолчанию инстанция текущего приложения
) {
 HBITMAP HBM;
 BITMAP BM; // это будем возвращать

HBM = ucGetResource::GetHBitmapFromJPEG( ResourceName, ResourceType, hInstance );
 GetObject( HBM, sizeof(BM), &BM );

// возвращаем BITMAP
 return BM;
}

HBITMAP ucGetResource::GetHBitmapFromJPEG(
 UnicodeString ResourceName, // символьный идентификатор ресурса
 LPCTSTR ResourceType, // (опционально) - тип ресурса RC_RCDATA по умолчанию
 HINSTANCE hInstance // (опционально) - по умолчанию инстанция текущего приложения
) {
 TJPEGImage *TJP = new TJPEGImage;
 Graphics::TBitmap *TBM = new Graphics::TBitmap;
 TMemoryStream *MS = new TMemoryStream;
 HBITMAP HBM; // это будем возвращать
 bool ResHas;

HRSRC ResH = FindResource( hInstance, ResourceName.t_str(), ResourceType );
 HGLOBAL ResM = LoadResource( hInstance, ResH );
 LPVOID ResPtr = LockResource( ResM );
 int ResSize = SizeofResource( hInstance, ResH );

if ( ResSize > 0 ) {
 MS->SetSize( ResSize );
 MS->Write( ResPtr, ResSize );
 MS->Seek( 0, 0 ); // смещаем указатель на начало

TJP->LoadFromStream( MS );
 TBM->Assign( TJP );

HBM = TBM->ReleaseHandle();

TypeReturn = "HBITMAP";
 hbmResult = HBM;
 ResHas = true;
 } else {
 ResHas = false;
 }

// освобождаем память от ресурсов
 UnlockResource( ResM );
 FreeResource( ResH );

delete TJP, TBM, MS;

// возвращаем BITMAP
 return HBM;
}


Чтобы получить BITMAP из JPEG-а в ресурсах, можно использовать следующие пару строк:
ucGetResource *R = new ucGetResource;
BITMAP BMP = R->GetBitmapFromJPEG("RESidNAME");
delete R; // освобождаем выделенную память


Чтобы подключить класс к проекту, просто добавьте к группе проекта .h файл и в том файле, где он будет использоваться сделайте следующий инклюд:
#include "uc_get_resource.h"


Cкачать ucGetResource v0.1


0 комментариев

Автор топика запретил добавлять комментарии