С++Builder: Класс ucGetResource v0.1
По ходу разработки я столкнулся с проблемой, мне нужно было использовать несколько картинок, плюс, чтобы они были в ресурсах, дабы не плодить файлы. Как известно, нативные картинки — это BITMAP, но весят они как кирпичи, и прилепляя к exe-шнику очередной BMP — мы получаем прибавку к размеру зачастую больше, чем вдвое! По потребностям я решил использовать JPEG-файлы, доставать их из ресурсов и преобразовывать в BITMAP (такой ход был необходимым аспектом решения моей задачи). После всех пыток и войной с TResourceStream (который, зараза, так и не заработал) я пришёл к решению, но решение это было довольно ёмким по количеству строк, чтобы без напрягов его копипастить. После я решил сделать класс, который буду расширять в будущем (например для работы с PNG, GIF). Используя класс — можно лишь парой строк получить чистый BITMAP из JPEG-а в ресурсах.
Вот код заголовочного .h файла:
А вот код .cpp файла:
Чтобы получить BITMAP из JPEG-а в ресурсах, можно использовать следующие пару строк:
Чтобы подключить класс к проекту, просто добавьте к группе проекта .h файл и в том файле, где он будет использоваться сделайте следующий инклюд:
Cкачать ucGetResource v0.1
Вот код заголовочного .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 комментариев