在MFC中显示Jpg格式图片的简单实现方法

在做的时候在网上找了很多这方面的资料,但实现方法都很烦,最近发现了一个很简单的实现方法,,与大家分享一下……思路主要还是利用MS的IPicture类完成。

1. 在窗口类中添加IPicture指针……

[c-sharp] view plain copy print ?
  1. private :      
  2.    LPPICTURE m_pPct;      
  3. public :      
  4.    int LoadPct(CString pcFile); // 将pcFile路径所指向的文件装载到m_pPct上      
  5.    int DrawPct();     
private : LPPICTURE m_pPct; public : int LoadPct(CString pcFile); // 将pcFile路径所指向的文件装载到m_pPct上 int DrawPct();
2. LoadPct(CString pcFile)图片的实现方法:(其中加了断言)

[c-sharp] view plain copy print ?
  1. HANDLE hFile = CreateFile(pcFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);      
  2. cmn_assert(INVALID_HANDLE_VALUE != hFile);      
  3.     
  4. // 获得文件大小       
  5. DWORD dwFileSize = GetFileSize(hFile, NULL);      
  6. cmn_assert(-1 != dwFileSize);      
  7. LPVOID pvData = NULL;      
  8.     
  9. // 分配全局内存,获得内存句柄       
  10. HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);      
  11. cmn_assert(NULL != hGlobal);      
  12.     
  13. // 锁定内存,获得内存指针       
  14. pvData = GlobalLock(hGlobal);      
  15. cmn_assert(NULL != pvData);      
  16. DWORD dwBytesRead = 0;      
  17.     
  18. // 读取文件       
  19. BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);      
  20. cmn_assert(FALSE != bRead);      
  21. GlobalUnlock(hGlobal);      
  22. CloseHandle(hFile);      
  23. LPSTREAM pstm = NULL;      
  24.     
  25. //从内存数据创建IStream*       
  26. HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);      
  27. cmn_assert(SUCCEEDED(hr) && pstm);      
  28.     
  29. // 创建IPicture       
  30. if (m_pPct)      
  31.   m_pPct->Release();      
  32.     
  33. // 从IStream接口中载入图片到IPicture中       
  34. hr = ::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&m_pPct);      
  35. cmn_assert(SUCCEEDED(hr) && m_pPct);      
  36. // 释放IStream接口       
  37. pstm->Release();     
  38. HANDLE hFile = CreateFile(pcFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);   
  39. cmn_assert(INVALID_HANDLE_VALUE != hFile);   
  40.   
  41. // 获得文件大小    
  42. DWORD dwFileSize = GetFileSize(hFile, NULL);   
  43. cmn_assert(-1 != dwFileSize);   
  44. LPVOID pvData = NULL;   
  45.   
  46. // 分配全局内存,获得内存句柄    
  47. HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);   
  48. cmn_assert(NULL != hGlobal);   
  49.   
  50. // 锁定内存,获得内存指针    
  51. pvData = GlobalLock(hGlobal);   
  52. cmn_assert(NULL != pvData);   
  53. DWORD dwBytesRead = 0;   
  54.   
  55. // 读取文件    
  56. BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);   
  57. cmn_assert(FALSE != bRead);   
  58. GlobalUnlock(hGlobal);   
  59. CloseHandle(hFile);   
  60. LPSTREAM pstm = NULL;   
  61.   
  62. //从内存数据创建IStream*    
  63. HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);   
  64. cmn_assert(SUCCEEDED(hr) && pstm);   
  65.   
  66. // 创建IPicture    
  67. if (m_pPct)   
  68.   m_pPct->Release();   
  69.   
  70. // 从IStream接口中载入图片到IPicture中    
  71. hr = ::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&m_pPct);   
  72. cmn_assert(SUCCEEDED(hr) && m_pPct);   
  73. // 释放IStream接口    
  74. 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(); 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()函数的实现
[c-sharp] view plain copy print ?
  1. if(m_pPct)      
  2. {      
  3.   CWnd   *pWnd;      
  4.   CDC   *pDvc;      
  5.   CRect rc;      
  6.   long hmWidth;      
  7.   long hmHeight;      
  8.     
  9.   pWnd = GetDlgItem(IDC_STATIC_IMG); /* 获取句柄 ,IDC_STATIC_IMG是建立的STATIC类型窗体的ID号*/      
  10.   pDvc = pWnd->GetDC(); /* 获取设备上下文 */      
  11.   m_pPct->get_Width(&hmWidth); /* 图片宽 高度 */      
  12.   m_pPct->get_Height(&hmHeight);      
  13.   pWnd -> GetClientRect(&rc);  /* 获取相关的Rect类 */      
  14.         
  15.   // 拉伸显示       
  16.   m_pPct->Render(pDvc->GetSafeHdc(), 0, 0,      
  17.    rc.Width(), rc.Height(), 0, hmHeight, hmWidth, -hmHeight, &rc);      
  18.   UpdateData(FALSE);      
  19.   return EXCU_SUCCESS;      
  20. }      
  21. return EXCU_FAILURE;     
  22. if(m_pPct)   
  23. {   
  24.   CWnd   *pWnd;   
  25.   CDC   *pDvc;   
  26.   CRect rc;   
  27.   long hmWidth;   
  28.   long hmHeight;   
  29.   
  30.   pWnd = GetDlgItem(IDC_STATIC_IMG); /* 获取句柄 ,IDC_STATIC_IMG是建立的STATIC类型窗体的ID号*/   
  31.   pDvc = pWnd->GetDC(); /* 获取设备上下文 */   
  32.   m_pPct->get_Width(&hmWidth); /* 图片宽 高度 */   
  33.   m_pPct->get_Height(&hmHeight);   
  34.   pWnd -> GetClientRect(&rc);  /* 获取相关的Rect类 */   
  35.      
  36.   // 拉伸显示    
  37.   m_pPct->Render(pDvc->GetSafeHdc(), 0, 0,   
  38.    rc.Width(), rc.Height(), 0, hmHeight, hmWidth, -hmHeight, &rc);   
  39.   UpdateData(FALSE);   
  40.   return EXCU_SUCCESS;   
  41. }   
  42. return EXCU_FAILURE;    
  43.   
  44.   
  45. [总结]:只要能读到数据,然后通过的ID获取窗体句柄,就能在其中进行显示……当然在调用Render时,只要修改其中相应的参数,就能进行缩放。   
  46.   
  47. OK,打完收工。   
  48.   
  49. PS: 最近刚刚开始整MFC什么的,水平有限,多多包涵  

你可能感兴趣的:(VC)