CImageStatic.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include "pch.h"
  2. #include "CImageStatic.h"
  3. IMPLEMENT_DYNAMIC(CImageStatic, CStatic)
  4. CImageStatic::CImageStatic()
  5. {
  6. }
  7. CImageStatic::~CImageStatic()
  8. {
  9. }
  10. BEGIN_MESSAGE_MAP(CImageStatic, CStatic)
  11. END_MESSAGE_MAP()
  12. BOOL CImageStatic::SetImage(LPCTSTR szImage)
  13. {
  14. CString szPath = Utils::GetExecDir();
  15. szPath.Append(_T("\\"));
  16. szPath.Append(szImage);
  17. BOOL bRet = FALSE;
  18. m_Image.Destroy();
  19. bRet = (m_Image.Load(szPath) == S_OK);
  20. if (m_hWnd)
  21. {
  22. Invalidate(FALSE);
  23. }
  24. return bRet;
  25. }
  26. LRESULT CImageStatic::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  27. {
  28. switch (message)
  29. {
  30. case(WM_ERASEBKGND):
  31. return 1;
  32. case(WM_PAINT):
  33. {
  34. PAINTSTRUCT ps;
  35. CDC *pDstDC = BeginPaint(&ps);
  36. //客户区位置
  37. CRect rcClient;
  38. GetClientRect(&rcClient);
  39. //双缓冲绘图
  40. {
  41. CMemDC memDC(*pDstDC, rcClient);
  42. CDC *pDC = &memDC.GetDC();
  43. //填充背景色
  44. pDC->FillSolidRect(&rcClient, RGB(100, 100, 100));
  45. pDC->SetStretchBltMode(HALFTONE);
  46. if (!m_Image.IsNull())
  47. {
  48. //原图大小
  49. CRect rcSrc(0, 0, m_Image.GetWidth(), m_Image.GetHeight());
  50. //锁定原图比例
  51. double fZoomRate = min((double)rcClient.Width() / (double)rcSrc.Width(),
  52. (double)rcClient.Height() / (double)rcSrc.Height());
  53. int cx = (int)(rcSrc.Width()*fZoomRate), cy = (int)(rcSrc.Height()*fZoomRate);
  54. CRect rcDst(0, 0, cx, cy); //目标大小
  55. rcDst.OffsetRect((rcClient.Width() - cx) / 2, (rcClient.Height() - cy) / 2);//居中
  56. //绘图
  57. m_Image.Draw(pDC->m_hDC, rcDst, rcSrc);
  58. }
  59. }
  60. EndPaint(&ps);
  61. return 0;
  62. }
  63. }
  64. return CStatic::WindowProc(message, wParam, lParam);
  65. }