怎么用IPicture 在View里显示自己规定的图片大小啊?

zhangnansong000 2012-05-14 09:20:04
BOOL CMciControl::ShowJpgGif(CDC* pDC,CString strPath, int x, int y)//读取文件信息方式打开JPG等图片文件
{
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
//打开文件并检测文件的有效性
if (file.Open(strPath,CFile::modeRead)&&
file.GetStatus(strPath,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); //VC2005.NET中用这个函数
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
}
}
}
else
{
return false;
} //打开文件结束
//显示JPEG和GIF格式的图片,GIF只能显示一帧,还不能显示动画,
//要显示动画GIF请使用ACTIVE控件。
IPicture *pPic;
//load image from file stream
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;
//get image height and width
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);
//use render function display image
if(FAILED(pPic->Render(*pDC,x,y,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
{
pPic->Release();
return false;
}
pPic->Release();
}
else
{
return false;
}
return true;
}


写了这个函数以后 想改变显示图像的大小 真弄不明白了
...全文
135 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2013-03-05
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
zhangnansong000 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用 5 楼 的回复:

引用 3 楼 的回复:
可能是因为你图片是直接显示的,但是图片解压显示过程中需要时间,就会造成有时间差,所以看上去就是一张一张的,可以考虑新建一个背景画布,图片全部画到背景画布上以后,再bitblt到真正的显示画布上

可是 我这个图片得是能不断变化的啊 ~~ 这个图片的 老变化。。。。不知道具体怎么弄啊。。困恼


我的意思是如果你如果需要这三张图看起来……
[/Quote]


哦 对呀 哈哈 谢谢啦 ~
向立天 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
还有就是 我在VIEW里 用这个函数 显示了 几张图片 为什么 编译运行的时候 图片是一张张出来的 不是一起啊 有点小卡呢 怎么解决啊
[/Quote]效率这么慢?
你是现从文件读上来的么
vivian_sxg 2012-05-15
  • 打赏
  • 举报
回复
可能是因为你图片是直接显示的,但是图片解压显示过程中需要时间,就会造成有时间差,所以看上去就是一张一张的,可以考虑新建一个背景画布,图片全部画到背景画布上以后,再bitblt到真正的显示画布上
zhangnansong000 2012-05-15
  • 打赏
  • 举报
回复
还有就是 我在VIEW里 用这个函数 显示了 几张图片 为什么 编译运行的时候 图片是一张张出来的 不是一起啊 有点小卡呢 怎么解决啊
vivian_sxg 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 3 楼 的回复:
可能是因为你图片是直接显示的,但是图片解压显示过程中需要时间,就会造成有时间差,所以看上去就是一张一张的,可以考虑新建一个背景画布,图片全部画到背景画布上以后,再bitblt到真正的显示画布上

可是 我这个图片得是能不断变化的啊 ~~ 这个图片的 老变化。。。。不知道具体怎么弄啊。。困恼
[/Quote]

我的意思是如果你如果需要这三张图看起来是一块显示的话,就利用双缓冲,全部加载完毕后再显示
只要图片有更新,就重复上述步骤就好了啊


zhangnansong000 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
可能是因为你图片是直接显示的,但是图片解压显示过程中需要时间,就会造成有时间差,所以看上去就是一张一张的,可以考虑新建一个背景画布,图片全部画到背景画布上以后,再bitblt到真正的显示画布上
[/Quote]
可是 我这个图片得是能不断变化的啊 ~~ 这个图片的 老变化。。。。不知道具体怎么弄啊。。困恼
傻X 2012-05-14
  • 打赏
  • 举报
回复
这里不是有获取图片长宽的代码嘛:
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);

HRESULT Render( HDC hdc, //渲染图像用的设备环境句柄
long x, //在hdc上的水平坐标
long y, //在hdc上的垂直坐标
long cx, //图像宽度
long cy, //图像高度
OLE_XPOS_HIMETRIC xSrc, //在源图像上的水平偏移
OLE_YPOS_HIMETRIC ySrc, //在源图像上的垂直偏移
OLE_XSIZE_HIMETRIC cxSrc,//在源图像上水平拷贝的数量
OLE_YSIZE_HIMETRIC cySrc,//在源图像上垂直拷贝的数量
LPCRECT prcWBounds //指向目标图元设备环境句柄的指针);

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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