如何从资源中加载JPG文件资源? 我将一个JPG文件如MyImage.JPG通过Import导入到了资源中,不知道如何加载到内存中,我会从磁盘文件加载到内存并显示(用IPicture类中的OleLoadPcture),就不知道如何从资源加载,即不了解资源加载的一些函数,请高手们指点!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 LPTSTR MAKEINTRESOURCE( WORD wInteger; );参数是ID号,返回的是字符串类型。 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;} 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);} 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 sizeHGLOBAL 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 memoryLPSTREAM pstm = NULL;// create IStream* from global memoryHRESULT hr = CreateStreamOnHGlobal(hJPG, TRUE, &pstm);_ASSERTE(SUCCEEDED(hr) && pstm);// Create IPicture from image fileLPPICTURE 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文件名。 如何在画面上绘制多张bmp图呢??(用内存dc) AfxMessageBox,MessageBox,多线程,定时器。 怎样实现一个视频播放器? 一个关于字体的问题 如何在.idl文件中使用stl,比如一个接口的参数使用string COleDateTime类型转换无法通用????? 请问怎样得到我的执行程序所在的路径? mfc文字显示不出 开发过输入法的网友请进,请教一个困扰我很久的问题 急???----help 如何得到一个多文档的窗口图标-----------HELP 写过天气预报类似软件的朋友请指点下 *********网络几大问题,请看详细内容!!!!!
参数是ID号,返回的是字符串类型。
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;
}
{
hTemp = LoadResource(hInstance, hRsrc);
dwSize = SizeofResource(hInstance, hRsrc);
lpRes = LockResource(hTemp); hGlobal = GlobalAlloc(GHND, dwSize);
lpNew = GlobalLock(hGlobal);
}
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 memoryLPSTREAM 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文件名。