122上位机VC MFC打开显示JPG格式图片
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);
- }
复制代码我们来演示下功能实现的整个过程
|