VC中打开一幅jpg图片并且显示在对话框上的方法和代码

今天调通了个程序。

是最简单的用vc打开一张jpg格式的图片,并且能显示在对话框上。

本来以为很简单,结果调了一整天。问题在哪?主要集中在思路上,还有创建CDC这个环节上浪费了大量的时间。其实还是自己还没搞清,另外自己排错的能力还要加强。不要着急,一步一步有条理地编写代码,把写代码的过程当成一种乐趣,要做到越来越投入,不能越来越浮躁。遇到bug应该更加冷静,应该会更投入,否则就是自己的心态不对,想走捷径。不多说了,上代码,也许这是最基础的显示图片的代码了,自己好好收着以后还要反复看,更要反复练,最后把代码封装成类,为以后的工作做好积累,突破更大的难题。加油!!

代码:

void CRGBDlg::OnButton1() 
{
CDC* pDC=GetDC();
IPicture* pPic;
IStream* pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
CString picpath;


CString filter_str = "image files (*.jpg)|*.jpg|image files (*.bmp)|*.bmp|image files (*.gif)|*.gif||";
CFileDialog dlg(true,NULL,NULL,NULL,filter_str,NULL);
if(IDOK == dlg.DoModal()) 
{
picpath=dlg.GetPathName();
}


if(file.Open(picpath,CFile::modeRead)&&file.GetStatus(picpath,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.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->m_hDC,0,0,(DWORD)fx,(DWORD)fy,0,hmHeight,hmWidth,-hmHeight,NULL)))
{
pPic->Release();
}
pPic->Release();
}

}

这是在VC6.0上写的。接着我试着在VC2005上鞋一个同样的代码,结果出现了很奇怪的问题。这段代码在VC6.0上是没问题的,那么就是版本的问题。上网上一查,发现时CString类的使用的问题。在vc2005里,CString 类默认的Unicode的格式,所以在定义一个CString类时,应该这样写:CString str=L"#",然后再给str赋字符串的值。

最后在vc2005上夜调通了。

你可能感兴趣的:(VC中打开一幅jpg图片并且显示在对话框上的方法和代码)