Picture Control控件显示JPG图像API
最近开始着手写一个麻将自动听牌分析器的程序(这里就不介绍了,等我写完了的话,会有详细介绍的。。)
然后遇到一个问题,就是要在MFC的基于对话框的Picture Control空间上显示指定路径的一张JPG图片。
但是呢,Picture控件主要支持的是Bitmap格式的,然后经过上网一阵查找,后来发现是要利用COM里面的一个IPicture的东西。
步骤就是先读取文件,然后。。。诶。。自己看下面的代码,我弄了详细的注释。。不懂Google。。
void CXxxxxDlg::DrawJPG( int nID,char* pic_path ) { if (!pic_path) return; CoInitialize(NULL); // COM 初始化 CFile file; // 读入文件内容 file.Open(pic_path,CFile::modeRead | CFile::shareDenyNone); //获取长度 DWORD dwSize = DWORD(file.GetLength()); //给图片分配全局内存 HGLOBAL hMem = GlobalAlloc( GMEM_MOVEABLE, dwSize ); //锁定内存 LPVOID lpBuf = GlobalLock( hMem ); //读取图片到全局内存当中 file.Read( lpBuf, dwSize ); //关闭文件 file.Close(); //解锁内存 GlobalUnlock( hMem ); //IStream接口指针,用来保存图片流 IStream* pStream = NULL; //图片对象 IPicture* pPicture = NULL; //由HGLOBAL得到IStream,参数TRUE表示释放IStream的同时,释放内存 HRESULT hr; //用全局内存初使化IStream接口指针 hr = CreateStreamOnHGlobal( hMem, TRUE, &pStream );//ASSERT ( SUCCEEDED(hr) ); //得到IPicture COM接口对象 hr = OleLoadPicture(pStream,dwSize,TRUE,IID_IPicture,(LPVOID*)&pPicture); //ASSERT(hr==S_OK); long nWidth,nHeight; //MM_HIMETRIC 模式 单位是0.01毫米 pPicture->get_Width( &nWidth ); pPicture->get_Height( &nHeight ); CSize sz( nWidth, nHeight ); //转换MM_HIMETRIC到MM_TEXT像素单位 CDC* pDC = GetDC(); pDC->HIMETRICtoDP( &sz ); CRect rect; GetDlgItem(nID)->GetWindowRect(&rect); GetDlgItem(nID)->GetParent()->ScreenToClient(rect); //控件大小变成图片大小 //GetDlgItem(IDC_PIC1)->MoveWindow(rect.left,rect.top,sz.cx,sz.cy); //左上角那个点对齐 //pPicture->Render(pDC->m_hDC,rect.left,rect.top,sz.cx,sz.cy, // 0,nHeight,nWidth,-nHeight,NULL); //图片缩放至空间大小 pPicture->Render(pDC->m_hDC,rect.left,rect.top,rect.Width(),rect.Height(), 0,nHeight,nWidth,-nHeight,NULL); if (pPicture) pPicture->Release(); if (pStream) pStream->Release(); CoUninitialize(); }
【完】
本文内容遵从CC版权协议,转载请注明出自http://www.kylen314.com