С++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 комментариев