在网上找了好多例子 都是说用GDI+ 可是都是从外部文件读进来的 我想像BMP一样直接加载到资源里面 通过ID来操作 麻烦高手指教~~
解决方案 »
- 怎样在一个HTTP接收缓冲区(1024),准确的解析头信息
- 向高手求救:可以使用libmySQL.dll来建立一个MYSQL数据库吗?
- combobox键盘输入时,自动弹出下拉框并模糊定位到输入条目
- 排序问题
- 刚得到HL2的代码,一个编译问题!!
- (200分求教,一定兑现)有谁开发过用gsm模块发送短信的系统,帮我分析一下是什么原因
- VC打开Access数据库问题
- 一个简单的ATL程序,出错???
- 获取网页验证码的问题
- 如何用winsock正确的下载文件
- 如何用C++语言去写定时器,不依靠任何类向导和软件的设置,因为我现在只有代码,而且只允许VS2008命令行编译
- ShellExecute 用法求助
自我感觉写得还不错
Bitmap* BitmapFromResource(HMODULE hModule, UINT nResourceID, LPCTSTR szResourceType)
{
Bitmap* pImage = NULL;
HRSRC hRes = FindResource(hModule, MAKEINTRESOURCE(nResourceID), szResourceType);
if(hRes != NULL)
{
DWORD dwResSize = SizeofResource(hModule, hRes);
if(dwResSize > 0)
{
HGLOBAL hResData = LoadResource(hModule, hRes);
if(hResData != NULL)
{
LPVOID lpResourceData = LockResource(hResData);
if(lpResourceData != NULL)
{
HGLOBAL hResourceBuffer = GlobalAlloc(GMEM_MOVEABLE, dwResSize);
if(hResourceBuffer != NULL)
{
LPVOID lpResourceBuffer = GlobalLock(hResourceBuffer);
if(lpResourceBuffer != NULL)
{
CopyMemory(lpResourceBuffer, lpResourceData, dwResSize);
IStream* piStream = NULL;
if(CreateStreamOnHGlobal(hResourceBuffer, FALSE, &piStream) == S_OK)
{
pImage = Bitmap::FromStream(piStream);
piStream->Release();
}
GlobalUnlock(hResourceBuffer);
}
GlobalFree(hResourceBuffer);
}
}
FreeResource(hResData);
}
}
}
if(pImage != NULL)
{
if(Ok != pImage->GetLastStatus())
{
delete pImage;
pImage = NULL;
}
}
return pImage;
}
然后找到.rc文件,用记事本打开,然后找到刚刚的添加的新类型PNG,然后在里面添加项就可以了,比如添加一项
IDR_PNG_OK PNG "res\\Ok.png"
这样再重新打开工程,就会发现资源中的PNG这部分多了刚刚添加的文件,不过是多出双引号的,这是因为还没有给它分配ID。这时再把这个文件中的双引号去掉,IDE就会自动为它分配资源ID了。然后就可以通过IDR_PNG_OK这个宏来对它引用了
然后找到.rc文件,用记事本打开,然后找到刚刚的添加的新类型PNG,然后在里面添加项就可以了,比如添加一项
IDR_PNG_OK PNG "res\\Ok.png"
这样再重新打开工程,就会发现资源中的PNG这部分多了刚刚添加的文件,不过是多出双引号的,这是因为还没有给它分配ID。这时再把这个文件中的双引号去掉,IDE就会自动为它分配资源ID了。然后就可以通过IDR_PNG_OK这个宏来对它引用了
inline BOOL ImageFromIDResource(UINT resourceID, LPCTSTR resourceType, Image*& image)
{
HINSTANCE hInst = AfxGetResourceHandle();
HRSRC hRsrc = ::FindResource(hInst,MAKEINTRESOURCE(resourceID),resourceType);
if (hRsrc == NULL)
return FALSE; // load resource into memory
DWORD len = SizeofResource(hInst, hRsrc);
BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
if (lpRsrc == NULL)
return FALSE; // Allocate global memory on which to create stream
HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
memcpy(pmem,lpRsrc,len);
IStream* pstm;
CreateStreamOnHGlobal(m_hMem,FALSE,&pstm); // load from stream
image = Gdiplus::Image::FromStream(pstm); // free/release stuff
GlobalUnlock(m_hMem);
GlobalFree(m_hMem);
pstm->Release();
FreeResource(lpRsrc); return TRUE;
}