怎样在VC中显示JPG图片?
先声明我是新手。。。
网上找到一段关于显示JPG格式图片的代码,现在想让图片在固定的矩形块里显示并用滚动条拉动来显示整张图片。。请教高手该如何改写下面的代码》》
void CPICView::OnDraw(CDC* pDC)
{
CPICDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
IPicture *pPic;
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
if (file.Open("D:/test.jpg",CFile::modeRead)&&file.GetStatus("D:/test.jpg",fstatus)&&
((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != 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,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
AfxMessageBox("Failed To Render The picture!");
pPic->Release();
}
else
AfxMessageBox("Error Loading Picture From Stream!");
}
}
}
else
AfxMessageBox("Can't Open Image File!");
}
问题点数:20、回复次数:17Top
1 楼qqwwing(草莓猪)回复于 2006-11-10 20:36:45 得分 0
汗,这个代码好乱
用到COM的东西,不太懂,想问一下楼主用的是哪一个COM库,俺也遇到JPEG解码问题,想学习学习。
不过如果楼主是想在客户区显示图片而当图片大于客户区时可以使用滚动条来拖动来浏览整个图片的话,那么和图像怎么显示无关。你可以在View类改成从CScrollView类派生,然后在OnInitialUpdate()中用SetScrollSizes()来设定滚动的范围就可以了。显示的时候会自动加上滚动条.Top
2 楼ckg_VcBeginner()回复于 2006-11-10 21:31:51 得分 0
我更不懂啊。。只是现在要做这个,被逼抄了一段。。
我知道你说的意思,我是打算在客户区一半显示文本,另一半用来显示这个图片,所以问的很怪了。。。
敢问有解决的办法吗?能否用切分窗口将这个客户区分成两部分,在另一部分中加上滚动条用来拉动显示整张图片? 如果可以 请问具体该怎么实施??
答完了给分啊 谢谢啦Top
3 楼qqwwing(草莓猪)回复于 2006-11-11 09:44:41 得分 0
用切分窗口可以啊,只要你现在和程序是可以正常显示。用CSlitterWnd把窗口拆成一行两列分别装入一个View类。一个就用从CScrollView派生出来的View来实现滚动显示,第二个就随便了。Top
4 楼mynamelj(风之羽翼)回复于 2006-11-11 09:46:16 得分 0
看偶的blogTop
5 楼ckg_VcBeginner()回复于 2006-11-11 16:40:22 得分 0
我按照你(qqwwing)的意思切分了窗口并新建了CPicView类,用ClassView给这个类中添加自己的菜单<显示图片(showpic)>的消息映射,在CPicView中添加了OnShowPic()函数,并使用上面显示图片的代码,运行后发现菜单<显示图片>是灰色的根本不能使用,更别提显示图片了。。
请问这是怎么回事?
我在CMainFrame中将m_bAutoMenuEnable改为FALSE,结果运行后菜单不再是灰色的了,但仍然不能使用。。。Top
6 楼begtostudy(我的CSDN博客:http://blog.csdn.net/begtostudy/)回复于 2006-11-11 18:25:35 得分 0
虽然我做图像,但是jpeg的解码我是不做,
因为网上的额太多了,很多书的例程都有,
我想人家做那么久了,应该比我做的好Top
7 楼widesoft()回复于 2006-11-11 19:02:59 得分 0
学习中。。
Top
8 楼ckg_VcBeginner()回复于 2006-11-11 19:24:03 得分 0
高手还在沉默什么呢??
我在线等着答案啊。。。Top
9 楼kencharles(肯.查尔斯)回复于 2006-11-11 20:25:24 得分 0
我来学习一下,顺便接点分!Top
10 楼dadi0189(冰雨)回复于 2006-11-11 20:54:51 得分 0
用一个Ipicture组件显示吧,是个COM组件,Top
11 楼ckg_VcBeginner()回复于 2006-11-11 20:57:21 得分 0
就是用的这个吧 我基本不懂 但是好像就用的这个
现在问题是怎么在切分后的窗体中显示出来?
//////////////////////////////////////////////////////////////
我按照你(qqwwing)的意思切分了窗口并新建了CPicView类,用ClassView给这个类中添加自己的菜单<显示图片(showpic)>的消息映射,在CPicView中添加了OnShowPic()函数,并使用上面显示图片的代码,运行后发现菜单<显示图片>是灰色的根本不能使用,更别提显示图片了。。
请问这是怎么回事?
我在CMainFrame中将m_bAutoMenuEnable改为FALSE,结果运行后菜单不再是灰色的了,但仍然不能使用。。。
//////////////////////////////////////////////////////////////Top
12 楼liuqiyc(cyiquil)回复于 2006-11-11 20:58:14 得分 0
将这个菜单<显示图片(showpic)>添加到CMainFrame中Top
13 楼ckg_VcBeginner()回复于 2006-11-11 21:09:22 得分 0
liuqiyc(cyiquil):
这个我知道,刚才也试了一下,添加到CMainFrame中 运行后在整个窗口中显示图片了
而我想要在切分后的新窗体中显示,通过拉动滚动条来全部显示。。。Top
14 楼dfkoko(xiaoyin)回复于 2006-11-11 21:10:27 得分 0
图形处理不懂?
你在网上搜搜!
我给你的Excel例子有问题联系我!我有好多,也有自己写的。Top
15 楼ckg_VcBeginner()回复于 2006-11-11 21:14:46 得分 0
dfkoko(xiaoyin) :
我刚开始学啊大哥!要用到这个 所以想问问你们高手啊。。
网上搜了一天了,没有切分窗口后 怎么在新窗口中显示的。。。
帮我看看好吗?Top
16 楼dfkoko(xiaoyin)回复于 2006-11-11 21:24:37 得分 20
To ckg_VcBeginner()
给你发了两个例子看看!Top
17 楼ckg_VcBeginner()回复于 2006-11-11 21:31:27 得分 0
我分不多了 先给你20分 过两天弄点分再给你
以后还请多多帮忙啊。。
最近要交作业所以就很是断章取义了 等过了这关要扎实的学 从基础搞起 麻烦你多帮帮我。。。
可以加我QQ 375110508Top




