PicControl.cpp
上传用户:gzboli
上传日期:2013-04-10
资源大小:471k
文件大小:5k
源码类别:

图片显示

开发平台:

Visual C++

  1. // PicContro.cpp: implementation of the CPicContro class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "QuickImage.h"
  6. #include "PicControl.h"
  7. #include "raw.h"
  8. //#include "gemfile.h"
  9. //#include "MathEx.h"
  10. #include "dibapi.h"
  11. #include "importsjpegfile.h"
  12. #ifdef _DEBUG
  13. #undef THIS_FILE
  14. static char THIS_FILE[]=__FILE__;
  15. #define new DEBUG_NEW
  16. #endif
  17. //////////////////////////////////////////////////////////////////////
  18. // Construction/Destruction
  19. //////////////////////////////////////////////////////////////////////
  20. double CPicControl::ViewFit(CPoint &ptDIBCent, const CRect &rcView, const HDIB hDIB)
  21. {
  22. ASSERT(NULL != hDIB);
  23. LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
  24. long cxDIB = ::DIBWidth(lpDIB);         // Size of DIB - x
  25. long cyDIB = abs(::DIBHeight(lpDIB));        // Size of DIB - y
  26. ::GlobalUnlock((HGLOBAL) hDIB);
  27. double dX= (double)cxDIB/rcView.Width();
  28. double dY= (double)cyDIB/rcView.Height();
  29. double dZoom = dX > dY ? dX : dY;
  30. ptDIBCent.x = cxDIB/2;
  31. ptDIBCent.y = cyDIB/2;
  32. return dZoom;
  33. }
  34. double CPicControl::ViewActual(CPoint &ptDIBCent, const CRect &rcView, const HDIB hDIB)
  35. {
  36. ASSERT(NULL != hDIB);
  37. // ASSERT(NULL != pView);
  38. LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
  39. long cxDIB = ::DIBWidth(lpDIB);         // Size of DIB - x
  40. long cyDIB = abs(::DIBHeight(lpDIB));        // Size of DIB - y
  41. ::GlobalUnlock((HGLOBAL) hDIB);
  42. ptDIBCent.x = cxDIB < rcView.Width() ? cxDIB/2 : rcView.Width()/2;
  43. ptDIBCent.y = cyDIB < rcView.Height() ? cyDIB/2 : rcView.Height()/2;
  44. return 1.0;
  45. }
  46. double CPicControl::ZoomIn(double dZoom)
  47. {
  48. dZoom *= 2.0;
  49. if(dZoom > 10)
  50. {
  51. dZoom=10.0;
  52. }
  53. return dZoom;
  54. }
  55. double CPicControl::ZoomOut(double dZoom)
  56. {
  57. dZoom /= 2.0;
  58. if(dZoom < 0.01)
  59. {
  60. dZoom=0.01;
  61. }
  62. return dZoom;
  63. }
  64. double CPicControl::ZoomPan(CPoint &ptDIBCent,
  65.    const CPoint &ptMouseD, const CPoint& ptMouseU, double dZoom)
  66. {
  67. ptDIBCent.x -= int((ptMouseU.x-ptMouseD.x) * dZoom);
  68. ptDIBCent.y -= int((ptMouseU.y-ptMouseD.y) * dZoom);
  69. return dZoom;
  70. }
  71. double CPicControl::ZoomWindow(CPoint &ptDIBCent,
  72.   const CRect &rcView, CRect &rcWindow, double dZoom)
  73. {
  74. // ASSERT(NULL != hDIB);
  75. // ASSERT(NULL != pView);
  76. rcWindow.NormalizeRect();
  77. if((rcWindow.Width() < 10) || (rcWindow.Height() <10))
  78. {
  79. return dZoom;
  80. }
  81. CPoint ptWindow,ptView;
  82. ptWindow = rcWindow.CenterPoint();
  83. ptView = rcView.CenterPoint();
  84. ptDIBCent.x += long((ptWindow.x-ptView.x) * dZoom);
  85. ptDIBCent.y += long((ptWindow.y-ptView.y) * dZoom);
  86. double dX,dY;
  87. dX = (double)rcView.Width() / rcWindow.Width();
  88. dY = (double)rcView.Height() / rcWindow.Height();
  89. dZoom /= (dX < dY ? dX : dY);
  90. return dZoom;
  91. }
  92. void CPicControl::CalcuRect(CRect& rcView, CRect& rcDIB,
  93. const CPoint &ptDIBCent, const HDIB hDIB, double dZoom)
  94. {
  95. ASSERT(NULL != hDIB);
  96. // ASSERT(NULL != pView);
  97. LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
  98. long cxDIB = ::DIBWidth(lpDIB);         // Size of DIB - x
  99. long cyDIB = abs(::DIBHeight(lpDIB));        // Size of DIB - y
  100. ::GlobalUnlock((HGLOBAL) hDIB);
  101. int iDCMid = rcView.CenterPoint().x;
  102. double dDIBDiff = ptDIBCent.x / dZoom;
  103. if(iDCMid < dDIBDiff)
  104. {
  105. rcDIB.left = ptDIBCent.x - int(iDCMid * dZoom);
  106. }
  107. else
  108. {
  109. rcView.left = iDCMid - (int)dDIBDiff;
  110. rcDIB.left = 0;
  111. }
  112. dDIBDiff = (cxDIB - ptDIBCent.x) / dZoom;
  113. if(iDCMid < dDIBDiff)
  114. {
  115. rcDIB.right = ptDIBCent.x + int(iDCMid * dZoom);
  116. }
  117. else
  118. {
  119. rcView.right = iDCMid + (int)dDIBDiff;
  120. rcDIB.right = cxDIB;
  121. }
  122. iDCMid = rcView.CenterPoint().y;
  123. dDIBDiff = ptDIBCent.y / dZoom;
  124. if(iDCMid < dDIBDiff)
  125. {
  126. rcDIB.top = ptDIBCent.y - int(iDCMid * dZoom);
  127. }
  128. else
  129. {
  130. rcView.top = iDCMid - int(ptDIBCent.y / dZoom);
  131. rcDIB.top = 0;
  132. }
  133. dDIBDiff = (cyDIB - ptDIBCent.y) / dZoom;
  134. if(iDCMid < dDIBDiff)
  135. {
  136. rcDIB.bottom = ptDIBCent.y + int(iDCMid * dZoom);
  137. }
  138. else
  139. {
  140. rcView.bottom = iDCMid + (int)dDIBDiff;
  141. rcDIB.bottom = cyDIB;
  142. }
  143. if(rcDIB.top == 0)
  144. {
  145. rcDIB.top = cyDIB - rcDIB.Height();
  146. rcDIB.bottom = cyDIB;
  147. }
  148. if(rcView.top == 0)
  149. {
  150. cxDIB = cyDIB - rcDIB.bottom;
  151. rcDIB.bottom = cyDIB - rcDIB.top;
  152. rcDIB.top = cxDIB;
  153. }
  154. }
  155. void CPicControl::ViewIdeal(CPoint &ptDIBCent, double &dZoom,
  156. const CView *pView, const HDIB hDIB)
  157. {
  158. ASSERT(NULL != hDIB);
  159. ASSERT(NULL != pView);
  160. LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
  161. long cxDIB = ::DIBWidth(lpDIB);         // Size of DIB - x
  162. long cyDIB = abs(::DIBHeight(lpDIB));        // Size of DIB - y
  163. ::GlobalUnlock((HGLOBAL) hDIB);
  164. ptDIBCent.x = cxDIB / 2;
  165. ptDIBCent.y = cyDIB / 2;
  166. CRect rcDC;
  167. pView->GetClientRect(&rcDC);
  168. rcDC.InflateRect(-2, -2);
  169. double dx = (double)rcDC.Width() / cxDIB;
  170. double dy = (double)rcDC.Height() / cyDIB;
  171. if((dx > 1.0) && (dy > 1.0))
  172. {
  173. dZoom = 1.0;
  174. }
  175. else
  176. {
  177. dZoom = dx > dy ? dx : dy;
  178. }
  179. }