在做的时候在网上找了很多这方面的资料,但实现方法都很烦,最近发现了一个很简单的实现方法,,与大家分享一下……思路主要还是利用MS的IPicture类完成。
1. 在窗口类中添加IPicture指针……
- private :
- LPPICTURE m_pPct;
- public :
- int LoadPct(CString pcFile); // 将pcFile路径所指向的文件装载到m_pPct上
- int DrawPct();
2. LoadPct(CString pcFile)图片的实现方法:(其中加了断言)
- HANDLE hFile = CreateFile(pcFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
- cmn_assert(INVALID_HANDLE_VALUE != hFile);
- // 获得文件大小
- DWORD dwFileSize = GetFileSize(hFile, NULL);
- cmn_assert(-1 != dwFileSize);
- LPVOID pvData = NULL;
- // 分配全局内存,获得内存句柄
- HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
- cmn_assert(NULL != hGlobal);
- // 锁定内存,获得内存指针
- pvData = GlobalLock(hGlobal);
- cmn_assert(NULL != pvData);
- DWORD dwBytesRead = 0;
- // 读取文件
- BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
- cmn_assert(FALSE != bRead);
- GlobalUnlock(hGlobal);
- CloseHandle(hFile);
- LPSTREAM pstm = NULL;
- //从内存数据创建IStream*
- HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
- cmn_assert(SUCCEEDED(hr) && pstm);
- // 创建IPicture
- if (m_pPct)
- m_pPct->Release();
- // 从IStream接口中载入图片到IPicture中
- hr = ::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&m_pPct);
- cmn_assert(SUCCEEDED(hr) && m_pPct);
- // 释放IStream接口
- pstm->Release();
- HANDLE hFile = CreateFile(pcFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
- cmn_assert(INVALID_HANDLE_VALUE != hFile);
- // 获得文件大小
- DWORD dwFileSize = GetFileSize(hFile, NULL);
- cmn_assert(-1 != dwFileSize);
- LPVOID pvData = NULL;
- // 分配全局内存,获得内存句柄
- HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
- cmn_assert(NULL != hGlobal);
- // 锁定内存,获得内存指针
- pvData = GlobalLock(hGlobal);
- cmn_assert(NULL != pvData);
- DWORD dwBytesRead = 0;
- // 读取文件
- BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
- cmn_assert(FALSE != bRead);
- GlobalUnlock(hGlobal);
- CloseHandle(hFile);
- LPSTREAM pstm = NULL;
- //从内存数据创建IStream*
- HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
- cmn_assert(SUCCEEDED(hr) && pstm);
- // 创建IPicture
- if (m_pPct)
- m_pPct->Release();
- // 从IStream接口中载入图片到IPicture中
- hr = ::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&m_pPct);
- cmn_assert(SUCCEEDED(hr) && m_pPct);
- // 释放IStream接口
- pstm->Release();
3. DrawPct()函数的实现
- if(m_pPct)
- {
- CWnd *pWnd;
- CDC *pDvc;
- CRect rc;
- long hmWidth;
- long hmHeight;
- pWnd = GetDlgItem(IDC_STATIC_IMG); /* 获取句柄 ,IDC_STATIC_IMG是建立的STATIC类型窗体的ID号*/
- pDvc = pWnd->GetDC(); /* 获取设备上下文 */
- m_pPct->get_Width(&hmWidth); /* 图片宽 高度 */
- m_pPct->get_Height(&hmHeight);
- pWnd -> GetClientRect(&rc); /* 获取相关的Rect类 */
- // 拉伸显示
- m_pPct->Render(pDvc->GetSafeHdc(), 0, 0,
- rc.Width(), rc.Height(), 0, hmHeight, hmWidth, -hmHeight, &rc);
- UpdateData(FALSE);
- return EXCU_SUCCESS;
- }
- return EXCU_FAILURE;
- if(m_pPct)
- {
- CWnd *pWnd;
- CDC *pDvc;
- CRect rc;
- long hmWidth;
- long hmHeight;
- pWnd = GetDlgItem(IDC_STATIC_IMG); /* 获取句柄 ,IDC_STATIC_IMG是建立的STATIC类型窗体的ID号*/
- pDvc = pWnd->GetDC(); /* 获取设备上下文 */
- m_pPct->get_Width(&hmWidth); /* 图片宽 高度 */
- m_pPct->get_Height(&hmHeight);
- pWnd -> GetClientRect(&rc); /* 获取相关的Rect类 */
- // 拉伸显示
- m_pPct->Render(pDvc->GetSafeHdc(), 0, 0,
- rc.Width(), rc.Height(), 0, hmHeight, hmWidth, -hmHeight, &rc);
- UpdateData(FALSE);
- return EXCU_SUCCESS;
- }
- return EXCU_FAILURE;
- [总结]:只要能读到数据,然后通过的ID获取窗体句柄,就能在其中进行显示……当然在调用Render时,只要修改其中相应的参数,就能进行缩放。
- OK,打完收工。
- PS: 最近刚刚开始整MFC什么的,水平有限,多多包涵