工控编程吧
标题:
122上位机VC MFC打开显示JPG格式图片
[打印本页]
作者:
qq263946146
时间:
2015-12-26 21:45
标题:
122上位机VC MFC打开显示JPG格式图片
(, 下载次数: 2)
上传
点击文件名下载附件
122上位机VC MFC打开显示JPG格式图片
功能展示
我们在使用VC编辑时,发现它并没有控件可以对JPG图片进行直接打开显示操作,我们得自己动手编程实现,我们当前例程就实现打开JPG图片及显示的功能,效果如图 ;
要点提示
JPG图片的操作可以通过Ipicture 图像对象进行操作;
1.首先定义一个文件类对象CFile file读取JPG文件的数据长度DWORD filelen = file.GetLength();
2.然后现分配数据长度的内存空间HGLOBAL hglobal =GlobalAlloc(GMEM_MOVEABLE,filelen);
把数据读取到内存空间 file.ReadHuge(pvdata,filelen);//将文件数据读区到堆中
3.然后就可以实现JGP图像加载到 Ipicture 对象中进行显示等操作
IStream* stream;
CreateStreamOnHGlobal(hglobal,TRUE,&stream);//在堆中创建流对象
OleLoadPicture(stream,filelen,TRUE,IID_IPicture,(LPVOID*)&m_pPicture);//利用流加载图像
实现功能
1.新建基于对话框的应用程序
2.添加一变量 IPicture*m_pPicture;用于保存打开的JPG图片;OnInitDialog()函数中初始化 m_pPicture = NULL;GetSystemMenu(FALSE)->InsertMenu(IDM_ABOUTBOX,MF_BYCOMMAND|MF_STRING,999,"加载图片");
3.在OnSysCommand()中实现图片加载功能 else if(nID == 999) { LoadPic(); } LoadPic()为自定义加载JGP图片的函数
void CGkbc8Dlg::LoadPic()
{
CFileDialog m_dlg(TRUE,"JPG",NULL,NULL,"JPG(*.jpg)|*.JPG|gif|*.gif",this);
if (m_dlg.DoModal()==IDOK)
{
CString filename =m_dlg.GetPathName();
CFile file(filename,CFile::modeRead );
DWORD filelen = file.GetLength(); //获取文件长度
//><在堆上分配空间
HGLOBAL hglobal = GlobalAlloc(GMEM_MOVEABLE,filelen);
LPVOID pvdata = NULL;
pvdata = GlobalLock(hglobal);//锁定堆空间,获取指向堆空间的指针
file.ReadHuge(pvdata,filelen);//将文件数据读区到堆中
GlobalUnlock(hglobal);
//><
IStream* stream;
CreateStreamOnHGlobal(hglobal,TRUE,&stream);//在堆中创建流对象
OleLoadPicture(stream,filelen,TRUE,IID_IPicture,(LPVOID*)&m_pPicture);//利用流加载图像
复制代码
OLE_XSIZE_HIMETRIC width;
OLE_YSIZE_HIMETRIC height;
m_pPicture->get_Width(&width);
m_pPicture->get_Height(&height);
CDC *pDC =GetDC();
//转换himetric距离为pixels距离,1英寸=25.4毫米
int nWidth = MulDiv(width, GetDeviceCaps(pDC->m_hDC, LOGPIXELSX), 2540);
int nHeight = MulDiv(height, GetDeviceCaps(pDC->m_hDC, LOGPIXELSY), 2540);
m_pPicture->Render(pDC->m_hDC,0,0,nWidth,nHeight,0,height,width,-height,NULL);
//
ReleaseDC(pDC);
GlobalFree(hglobal);
//
CRect rect;
GetClientRect(rect);
SetScrollRange(SB_VERT,0,nWidth-rect.Height());
SetScrollRange(SB_HORZ,0,nHeight-rect.Width());
}
}
复制代码
当然你也可以在OnPaint()函数中实现窗口刷新时,图片的显示
if(NULL!=m_pPicture)
{
OLE_XSIZE_HIMETRIC width;
OLE_YSIZE_HIMETRIC height;
m_pPicture->get_Width(&width);
m_pPicture->get_Height(&height);
CDC *pDC =GetDC();
//转换himetric距离为pixels距离,1英寸=25.4毫米
int nWidth = MulDiv(width, GetDeviceCaps(pDC->m_hDC, LOGPIXELSX), 2540);
int nHeight = MulDiv(height, GetDeviceCaps(pDC->m_hDC, LOGPIXELSY), 2540);
m_pPicture->Render(pDC->m_hDC,0,0,nWidth,nHeight,0,height,width,-height,NULL);
}
复制代码
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/642b44ae6fab653d7f29b138db316105/0/0/w_19rt7vvuw5.swf-albumId=5093940809-tvId=5093940809-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 0)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4