2009-07-15 21 views
0

我一直在使用C++和Visual C++ 2008 Express Edition使用SFML 1.4(簡單和快速的多媒體庫)測試幾件事。爲了避免與我的圖形程序外部圖片,我被檢驗出sf::Image::LoadFromMemory(const char * Data, std::size_t SizeInBytes)功能與位圖資源使用一個簡單的資源腳本加載:當將Bitmap加載爲Windows資源時,有沒有辦法保留BITMAPFILEHEADER?

IDB_SPRITE BITMAP "sprite1.bmp" 

在我的代碼加載圖像使用此位圖資源創建一個,我用下面的方法,包括Win32 API函數(我已經排除了檢查,以確保Win32函數不返回NULL來縮短這個有點代碼):

HRSRC hResInfo = FindResource(NULL, MAKEINTRESOURCE(IDB_SPRITE), RT_BITMAP); 
HGLOBAL hResData = LoadResource(NULL, hResInfo); 
char * resourceData = reinterpret_cast<char *>(LockResource(hResData)); 

在那之後,我用sf :: Image :: LoadFromMemory功能:

MyImage.LoadFromMemory(resourceData, SizeofResource(NULL, hResInfo)); 

但是,這不起作用(我得到一個未知的文件類型錯誤)。經過一些測試後,我發現傳遞給LoadFromMemory函數的位圖數據不包含BITMAPFILEHEADER(前14個字節),我相信這是導致未知文件類型錯誤的原因。

我可以手動恢復BITMAPFILEHEADER並使LoadFromMemory函數正常工作。 但是,我想知道是否有某種方法來保存資源數據中的BITMAPFILEHEADER以避免這樣做?

回答

1

使用自定義資源類型將保留整個文件。改變資源腳本能利用RCDATA類型,而不是位圖類型:

IDB_SPRITE RCDATA "sprite1.bmp" 

在FindResource函數調用,使用RT_RCDATA代替RT_BITMAP:

HRSRC hResInfo = FindResource(NULL, MAKEINTRESOURCE(IDB_SPRITE), RT_RCDATA); 

欲瞭解更多信息:

RCDATA Resource

Resource Types

0

您可以將文件添加到資源作爲自定義資源而不是RT_BITMAP - 這將按原樣添加文件。除非你還需要:: LoadImage()它。

+0

改爲使用標準RT_RCDATA資源類型。存儲原始數據是它的意思。 – 2009-07-16 00:18:01

相關問題