MFC显示多种格式图片问题
为了显示不同格式的图片,我找到了下面的程序:
构建一个基于对话框的MFC应用程序,主窗口上只加了一个picture control控件,控件的ID为IDC_PICTURE,控件type
为Rectangle。
然后程序里加了如下代码:
改写OnPaint()函数
void CShowPictureDlg::OnPaint()
{
CPaintDC dc(GetDlgItem(IDC_PICTURE));
CRect rcclient;//
GetDlgItem(IDC_PICTURE)->GetClientRect(&rcclient);//获得PICTURE控件所在矩形区
CDC memdc;
memdc.CreateCompatibleDC(&dc); //创建一个和DC关联的内存设备上下文
//在c盘根目录下面放了一张图片
ShowPIC(&memdc,_T("c:\\a.bmp"),rcclient,1);
}
为CShowPictureDlg自定义一个函数ShowPIC:
BOOL CsdafasdfDlg::ShowPIC(CDC * pDC,CString strPath,CRect rect,int ShowType)
{
CPen newpen(PS_DOT,1,RGB(255,255,255));
CPen *pOldPen=pDC-> SelectObject(&newpen);
pDC-> Rectangle(rect);
pDC-> SelectObject(pOldPen);
//显示BMP JPG GIF等格式的图片
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
HGLOBAL hGlobal;
//打开文件并检测文件的有效性
if (file.Open(strPath,CFile::modeRead)&&
file.GetStatus(strPath,fstatus)&&
((cb = fstatus.m_size)!=-1))
{
//从堆上分配若干字节的内存,并返回一个句柄
hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
//GlobaLock将句柄转换成指针
pvData = GlobalLock(hGlobal);
if (pvData != NULL)
{
//file.ReadHuge(pvData,cb);
//将file里面的内容读到PVDATA里面来
file.Read(pvData,cb);
//将global的 count值递减一个,相当临界区的使用方法
GlobalUnlock(hGlobal);
//创建一个存储在global memory中的流对象,返回的对象存储在IStream中(pStm)
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
}
}
}
else
return false;
//打开文件结束
//显示JPEG和GIF格式的图片,GIF只能显示一帧,还不能显示动画,
//要显示动画GIF请使用ACTIVE控//件。
IPicture *pPic;
//load image from file stream
//创建一个新的picture对象,并用Istream中的数据流初始化
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;
//得到图片的高度与宽度 ,GetDeviceCaps(HORZRES)获取以像素为单位的物理高度和宽度
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);
long nwidth,nheight,nleft,ntop;
int Rx,Ry;
Rx=rect.Width();
Ry=rect.Height();
nheight=Ry;
nwidth=Rx;
nleft=rect.left;
ntop=rect.top;
//检测显示模式
//是否拉伸充满区域显示
if(ShowType==1)
{
nheight=Ry;
nwidth=Rx;
nleft=rect.left;
ntop=rect.top;
}
//用 Render函数显示图片
//图像将被显示在pdc这个环境中
if(FAILED(pPic-> Render(*pDC,nleft,ntop,nwidth,nheight,0,
hmHeight,hmWidth,-hmHeight,NULL)))
{
pPic-> Release();
return false;
}
pPic-> Release();
}
else
return false;
//释放内存
GlobalUnlock(hGlobal);
GlobalFree(hGlobal);
return true;
}
代码就是上面的那样,运行没问题,可是就是出不了图,也不知道怎么回事,那个render函数是怎么回事,查MSDN怎么找不到
和这个程序里面的对应的呀?问题是不是就出在这里?还有不知道我给ShowPic函数传递的那个PDC参数有没有问题?那个cpaint dc
应该是要显示的区域吧,我那样设置对吗?还有,为什么这里选用了Cpen对象,CPen newpen(PS_DOT,1,RGB(255,255,255)); ?
ShowPic函数是别人写的,然后我自己按照前天做的一个只能显示BMP格式的程序来改的,还请高人前辈指点呀!
我再附上一个讲IPicture使用方法的网址吧
http://www.anqn.com/dev/vc/2009-06-11/a09111465.shtml