可以给我一个显示jpg/gif的源文件吗?要简单地显示jpg./gif图片就行,谢了~
解决方案 »
- 读写复合文档,共享模式下,可以多个进程同时读写一个Storage和Stream?
- Chtmlview中类OnNewWindow2打开新窗口如何置顶端显示
- 关于工具栏的问题
- vc连接SQL数据库
- 请问如何取得特殊网页窗口下密码编辑框的内容
- 鼠标画图问题
- 在vc6里面一用stl,就满屏的警告,太恐怖了
- jrtplib-3.1.0 vs.net,如何编译
- 为什么按钮用 GetWindowRect 得到的 RECT 和刚 MoveWindow 时用到的 RECT 不一样?
- 关于const与指针相搭配使用的讨论...............
- 新手,DLL调用不能成功!
- SetWindowsHookEx 安装线程钩子问题!!
{
CJPGGifDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//0 声明一个picture和一个stream对象指针
IPicture *pPic;
IStream *pStm; CFileStatus fstatus;
CFile file;
LONG cb;
//1 打开文件并获得文件的真实大小
if (file.Open("f:\\我的相册\\02.jpg",CFile::modeRead)
&& file.GetStatus("f:\\我的相册\\02.jpg", fstatus)
&& ((cb = fstatus.m_size) != -1))
{
//2 从堆中分配指定数量字节的一整块,这时系统无法提供零零碎碎的局部或全局的堆
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
//3 锁定全局内存对象并返回它的首地址
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
//4 把文件内容读进全局内存对象的地址空间中
file.ReadHuge(pvData, cb);
//5 GlobalUnlock函数把以GMEM_MOVEABLE方式分配的内存对象的锁定计数器减1
GlobalUnlock(hGlobal);
//6 从全局内存中创建stream对象,第二个参数指定当stream释放时是否自动释放全局内存
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
//7 创建一个新的picture对象并用stream对象中的内容初始化
if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
//8 得到picture对象中图片的宽和高
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight); double fX,fY;
//9 GetDeviceCaps(HORZRES)得到屏幕的宽度(单位:像素)
//GetDeviceCaps(HORZSIZE)得到屏幕的宽度(单位:毫米)
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);
//10 释放不要的stream对象并清空stream指针
pStm->Release();
pStm=NULL;
//11 把图像显示在dc中
if(FAILED(pPic->Render(*pDC,100,50,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
AfxMessageBox("Failed To Render The picture!");
pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(100,50,"这是一个JPG图像");
//12 释放不要的picture对象,并把指针清空
pPic->Release();
pPic=NULL;
//13 释放不要的全局内存对象,这个千万别忘了(32位程序不需要这行,系统会自动释放;16位程序一定要)
FreeResource(hGlobal);
}
else
{
AfxMessageBox("Error Loading Picture From Stream!");
}
}
}
}
else
{
AfxMessageBox("Can't Open Image File!");
}}