用过VC6.0++的朋友可能了解,在mfc下的控件中只能加载bmp格式的位图,并不能加载其他格式图片,这样用起来不太方便,貌似没有更好的方法解决,但是可以在堆空间上利用流对象来实现这一功能。具体函数如下,函数参数分别是控件ID和需要加载的图片路径。
void CMyDlg::ShowJpgGif(int ID, CString m_filename)
{
CDC* pDC=GetDlgItem(ID)->GetDC();
HDC hdc=pDC->GetSafeHdc();
IPicture *m_picture;
OLE_XSIZE_HIMETRIC m_width;
OLE_YSIZE_HIMETRIC m_height;
//CString m_filename("D:\\test.jpg");//文件名
CFile m_file(m_filename,CFile::modeRead );
//获取文件长度
DWORD m_filelen = m_file.GetLength();
//在堆上分配空间
HGLOBAL m_hglobal = GlobalAlloc(GMEM_MOVEABLE,m_filelen);
LPVOID pvdata = NULL;
//锁定堆空间,获取指向堆空间的指针
pvdata = GlobalLock(m_hglobal);
//将文件数据读区到堆中
m_file.ReadHuge(pvdata,m_filelen);
IStream* m_stream;
GlobalUnlock(m_hglobal);
//在堆中创建流对象
CreateStreamOnHGlobal(m_hglobal,true,&m_stream);
//利用流加载图像
OleLoadPicture(m_stream,m_filelen,true,IID_IPicture,(LPVOID*)&m_picture);
m_picture->get_Width(&m_width);
m_picture->get_Height(&m_height);
bool m_IsShow = true;
CRect rect;
GetClientRect(rect);
SetScrollRange(SB_VERT,0,(int)(m_height/26.45)-rect.Height());
SetScrollRange(SB_HORZ,0,(int)(m_width/26.45)-rect.Width());
m_picture->Render(hdc,rect.left,rect.top,(int)(m_width/26.45),(int)(m_height/26.45),0,m_height,m_width,-m_height,NULL);
}
一个完整的简单例子下载:https://download.csdn.net/download/qq_30933859/10561824