如何从资源中加载JPG文件资源?
我将一个JPG文件如MyImage.JPG通过Import导入到了资源中,不知道如何加载到内存中,我会从磁盘文件加载到内存并显示(用IPicture类中的OleLoadPcture),就不知道如何从资源加载,即不了解资源加载的一些函数,请高手们指点!! 问题点数:50、回复次数:5Top
1 楼happyparrot(快乐鹦鹉)回复于 2005-11-23 12:17:55 得分 10
LPTSTR MAKEINTRESOURCE( WORD wInteger; );
参数是ID号,返回的是字符串类型。Top
2 楼dingpiao(.......)回复于 2005-11-23 12:26:50 得分 0
CRect rect;
CDC* pDC;
IPicture *pPic;
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
if (file.Open(imgName,CFile::modeRead)&&file.GetStatus(imgName,fstatus)&&
((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
file.ReadHuge(pvData, cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
// double fX,fY;
// fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
// fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
// if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
double fX,fY;
fX = 640;
fY = 480;
pDC = GetDlgItem(IDC_STATIC_PIC_BIG)->GetDC();
// GetDlgItem(IDC_STATIC_PIC_BIG)->EnableWindow(true);
// GetDlgItem(IDC_STATIC_PIC)->EnableWindow(false);
GetDlgItem(IDC_STATIC_PIC_BIG)->GetWindowRect(rect);
if(FAILED(pPic->Render(*pDC,0,0,(DWORD)(rect.right - rect.left),(DWORD)(rect.bottom - rect.top),0,hmHeight,hmWidth,-hmHeight,NULL)))
{
// AfxMessageBox("Failed To Render The picture!");
pPic->Release();
file.Close();
ReleaseDC(pDC);
return false;
}
else
{
pPic->Release();
file.Close();
ReleaseDC(pDC);
return true;
}
}
else
{
// AfxMessageBox("Error Loading Picture From Stream!");
file.Close();
return false;
}
}
}
}
else
{// AfxMessageBox("Can't Open Image File!");
return false;
}Top
3 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-11-23 12:31:27 得分 15
if (hRsrc = FindResource(hInstance, ID_JPG, "JPG"))
{
hTemp = LoadResource(hInstance, hRsrc);
dwSize = SizeofResource(hInstance, hRsrc);
lpRes = LockResource(hTemp);
hGlobal = GlobalAlloc(GHND, dwSize);
lpNew = GlobalLock(hGlobal);
}Top
4 楼koko1998(高价购买火车票)回复于 2005-11-23 12:42:13 得分 25
ZT FAQ
这是显示在PICTURE的
my example:
HBITMAP CPicture::LoadImageFromID(UINT nIDRes)
{
try
{
HMODULE hInst=GetModuleHandle(NULL);
LPCTSTR lpRes = MAKEINTRESOURCE(nIDRes);
HRSRC hRsrc = ::FindResource(hInst, lpRes, "JPG");
if (NULL == hRsrc)
return FALSE;
HGLOBAL hGlobal = LoadResource(hInst, hRsrc);
if (NULL == hGlobal)
return FALSE;
DWORD dwSize = SizeofResource(hInst, hRsrc);
LPVOID lpData = LockResource(hGlobal);
if (NULL == lpData)
return FALSE;
// alloc memory based on file size
HGLOBAL hJPG = ::GlobalAlloc(GMEM_MOVEABLE, dwSize);
LPVOID lpJGP = ::GlobalLock(hJPG);
memcpy(lpJGP, lpData, dwSize);
::GlobalUnlock(hJPG);
//LPVOID pvData = GlobalLock(hGlobal);
//_ASSERTE(NULL != pvData);
// read file and store in global memory
LPSTREAM pstm = NULL;
// create IStream* from global memory
HRESULT hr = CreateStreamOnHGlobal(hJPG, TRUE, &pstm);
_ASSERTE(SUCCEEDED(hr) && pstm);
// Create IPicture from image file
LPPICTURE gpPicture;
hr = ::OleLoadPicture(pstm, dwSize, FALSE, IID_IPicture, (LPVOID *)&gpPicture);
_ASSERTE(SUCCEEDED(hr) && gpPicture);
pstm->Release();
OLE_HANDLE m_picHandle;
gpPicture->get_Handle(&m_picHandle);
return (HBITMAP)m_picHandle;
}
catch (...)
{
}
return NULL;
}
//call
CPicture pic;
HBITMAP hbmp=pic.LoadImageFromID(IDR_TODAY);//IDR_TODAY is jpg id
(HBITMAP)::SendMessage(::GetDlgItem(this->m_hWnd,IDC_TODAY), STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hbmp);
我有现成的代码,http://www.cdcz.mpc.cn/data/static.rar,下载后将代码放到工程就可以了,使用的时候用映射一个控制变量,使用CStaticPicEx代替CStatic类,然后使用成员函数SetShowFileName(CString strFileName),其中strFileName为JPEG文件名。
Top
5 楼wxshzf(oldriver)回复于 2005-11-23 14:00:46 得分 0
首先感谢几位大侠的指点,这就献分!Top




