MFC显示多种格式图片问题

zjk2752 2010-10-10 06:55:24
为了显示不同格式的图片,我找到了下面的程序:
构建一个基于对话框的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


...全文
527 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gusto 2010-10-10
  • 打赏
  • 举报
回复
回复一楼:

先解决你不显示的问题:

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);
}

你创造了个内存DC, memdc,传到子程序 ShowPIC ? 你在内存中显示当然看不到了。

ShowPIC(&memdc,_T("c:\\a.bmp"),rcclient,1);
改成
ShowPIC(&dc,_T("c:\\a.bmp"),rcclient,1);

就好了。

后面你抄网上代码,那是用的 IPicture 控件,Render 是IPicture中一个方法,不是API函数,当然你查不到。。就这么用吧。理解他的参数含义就可以了。

答对给分。
zgl7903 2010-10-10
  • 打赏
  • 举报
回复
建议使用CImage 封装了GDI+,但是操作简单多了
支持 BMP, GIF, JPEG, PNG, and TIFF

CImage mImage;
if(mImage.Load(_T("XXXX.XX")) == S_OK)
{
mImage.Draw(pDC, dstRect);
}

CImage Class
Eleven 2010-10-10
  • 打赏
  • 举报
回复
第三方的CxImage类也不错
向立天 2010-10-10
  • 打赏
  • 举报
回复
显示不同格式的图片用CImage很方便啊
izardMan 2010-10-10
  • 打赏
  • 举报
回复

void CCookBookBaseInfoPP::OnBnClickedBtnselectimage() //////////////////////选择图片
{

// TODO: 在此添加控件通知处理程序代码
CString FilePathName,strFilter;
strFilter = "Bitmap image|*.bmp|JPEG image|*.jpg|GIF image|*.gif|PNG image|*.png||";
// strFilter = "文件夹|*.||";
HRESULT hResult;

CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT| OFN_EXPLORER ,strFilter);
hResult=(int)dlg.DoModal();
if (FAILED(hResult))
{
return;
}

FilePathName=dlg.GetPathName();
BITMAPOPENPATH=FilePathName;
isPaint=TRUE;


openimage(FilePathName);



}
void CCookBookBaseInfoPP::openimage(CString imagepath)
{
if (imagepath==_T(""))
{
return ;
}
CStatic *pStaic;
pStaic=(CStatic*)GetDlgItem(IDC_STATIC3);
CRect lRect;
pStaic->GetClientRect(&lRect);
int x=lRect.left;
int y=lRect.top;
CDC *pDC=pStaic->GetDC();
int h=lRect.bottom-lRect.top;
int w=lRect.right-lRect.left;
showJPG(pDC,imagepath,x,y,h,w);

}
BOOL CCookBookBaseInfoPP::showJPG(CDC *pDC,CString path,int x,int y,int h,int w)
{
LPSTREAM Pstm=NULL;
// LPSTREAM* pstream;
CFileStatus fstatus;
CFile file;
LONG cb;
if (file.Open(path,CFile::modeRead)&&file.GetStatus(fstatus)&&((cb=fstatus.m_size)!=-1))
{
HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,cb);
LPVOID pvData=NULL;
if (hGlobal!=NULL)
{
pvData=GlobalLock(hGlobal);
if (pvData!=NULL)
{
file.Read(pvData,cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal,TRUE,&Pstm);//(LPSTREAM*)
}
}
}
else
{
return FALSE;
}
IPicture *pPic;
// LPVOID pPic;


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);

if (FAILED(pPic->Render(pDC->m_hAttribDC,x,y,w,h,0,hmHeight,hmWidth,-hmHeight,NULL)))//(DWORD)fX,(DWORD)fY


{
pPic->Release();
Pstm->Release();
return false;

}
pPic->Release();
Pstm->Release();
// CoUnInitialize(NULL);

}
else
{
return FALSE;

}
return TRUE;

}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧