WorkSpace.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:9k
源码类别:

图形图象

开发平台:

Visual C++

  1. // WorkSpace.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ISeeExplorer.h"
  5. #include "WorkSpace.h"
  6. #include "ISeeExplorerDoc.h"
  7. #include "ISeeExplorerView.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CWorkSpace
  15. CWorkSpace::CWorkSpace()
  16. {
  17. m_WSClassName.Empty();
  18. m_brGround.CreateSolidBrush((COLORREF)::GetSysColor(COLOR_3DFACE));
  19. m_hand_free = ::AfxGetApp()->LoadCursor(IDC_HAND_FREE);
  20. m_hand_move = ::AfxGetApp()->LoadCursor(IDC_HAND_MOVE);
  21. m_auto = ::LoadCursor(NULL, (LPCTSTR)MAKEINTRESOURCE(IDC_ARROW));
  22. m_pImage = NULL;
  23. m_bmove = FALSE;
  24. m_wndrect.SetRectEmpty();
  25. m_imgrect.SetRectEmpty();
  26. m_imgdisprect.SetRectEmpty();
  27. m_hDrawDib = DrawDibOpen();
  28. }
  29. CWorkSpace::~CWorkSpace()
  30. {
  31. if(m_hDrawDib)
  32. DrawDibClose(m_hDrawDib);
  33. }
  34. BEGIN_MESSAGE_MAP(CWorkSpace, CWnd)
  35. //{{AFX_MSG_MAP(CWorkSpace)
  36. ON_WM_SETCURSOR()
  37. ON_WM_PAINT()
  38. ON_WM_SIZE()
  39. ON_WM_LBUTTONDOWN()
  40. ON_WM_LBUTTONUP()
  41. ON_WM_LBUTTONDBLCLK()
  42. ON_WM_MOUSEMOVE()
  43. //}}AFX_MSG_MAP
  44. ON_MESSAGE(IMN_CHANGING_IMAGE, OnChangImage)
  45. ON_MESSAGE(IMN_CHANGING_FOCI, OnChangFoci)
  46. END_MESSAGE_MAP()
  47. /////////////////////////////////////////////////////////////////////////////
  48. // CWorkSpace message handlers
  49. BOOL CWorkSpace::PreCreateWindow(CREATESTRUCT& cs) 
  50. {
  51. if (cs.lpszClass == NULL)
  52. {
  53. m_WSClassName = ::AfxRegisterWndClass(CS_DBLCLKS, NULL, m_brGround);
  54. cs.lpszClass = (LPCTSTR)m_WSClassName;
  55. }
  56. cs.dwExStyle |= WS_EX_CLIENTEDGE;
  57. return CWnd::PreCreateWindow(cs);
  58. }
  59. BOOL CWorkSpace::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  60. {
  61. CISeeExplorerView *pView = (CISeeExplorerView*)GetParent();
  62. ASSERT(pView);
  63. if (pView->GetDispMode() == ISEE_EXPLORER_VIEW_SWITCH_DISP_AUTO)
  64. ::SetCursor(m_auto);
  65. else
  66. {
  67. if (pView->GetSliMark())
  68. {
  69. if (m_bmove == FALSE)
  70. ::SetCursor(m_hand_free);
  71. else
  72. ::SetCursor(m_hand_move);
  73. }
  74. else
  75. ::SetCursor(m_auto);
  76. }
  77. return TRUE;
  78. }
  79. void CWorkSpace::OnPaint() 
  80. {
  81. CPaintDC dc(this); // device context for painting
  82. CISeeExplorerView *pView = (CISeeExplorerView*)GetParent();
  83. ASSERT(pView);
  84. if ((m_pImage)&&(m_pImage->GetDataPackState() >= PKST_PASSINFO))
  85. {
  86. DrawDibDraw(m_hDrawDib, dc.GetSafeHdc(), m_wndrect.left, 
  87. m_wndrect.top, m_wndrect.Width(), m_wndrect.Height(),
  88. (LPBITMAPINFOHEADER)(m_pImage->GetImageBitmapInfo()), 
  89. (LPVOID)(m_pImage->GetImageBitData()), 
  90. m_imgdisprect.left, m_imgdisprect.top, 
  91. m_imgdisprect.Width(), m_imgdisprect.Height(), 
  92. DDF_HALFTONE);
  93. pView->SendMessage(IMN_CHANGING_DEM, 
  94. (LPARAM)(CRect*)&m_imgdisprect, 
  95. (LPARAM)(CRect*)&m_imgrect);
  96. }
  97. }
  98. CReturnReceipt * CWorkSpace::GetCurCRRt()
  99. {
  100. CISeeExplorerView *pView = (CISeeExplorerView*)GetParent();
  101. ASSERT(pView);
  102. return pView->GetCurCRRt();
  103. }
  104. void CWorkSpace::OnSize(UINT nType, int cx, int cy) 
  105. {
  106. CWnd::OnSize(nType, cx, cy);
  107. CISeeExplorerView *pView = (CISeeExplorerView*)GetParent();
  108. ASSERT(pView);
  109. int ccx, ccy;
  110. m_wndrect.SetRect(0,0,cx,cy);
  111. if (m_pImage)
  112. {
  113. if (pView->GetDispMode() == ISEE_EXPLORER_VIEW_SWITCH_DISP_AUTO)
  114. {
  115. m_imgdisprect = m_imgrect;
  116. }
  117. else
  118. {
  119. ASSERT(pView->GetDispMode() == ISEE_EXPLORER_VIEW_SWITCH_DISP_HAND);
  120. if (pView->GetFoci() == ISEE_EXPLORER_VIEW_FOCI_ZOOM)
  121. { // 原始尺寸
  122. ccx = cx;
  123. ccy = cy;
  124. }
  125. else if ((ISEE_EXPLORER_VIEW_FOCI_ZOOM < pView->GetFoci())&&(pView->GetFoci() < ISEE_EXPLORER_VIEW_FOCI_OUT))
  126. { // 放大显示方式
  127. ccx = cx/pView->GetFoci();
  128. ccy = cy/pView->GetFoci();
  129. }
  130. else if ((ISEE_EXPLORER_VIEW_FOCI_IN < pView->GetFoci())&&(pView->GetFoci() < ISEE_EXPLORER_VIEW_FOCI_ZOOM))
  131. { // 缩小显示方式
  132. ASSERT(pView->GetFoci());
  133. ccx = cx*::abs(pView->GetFoci());
  134. ccy = cy*::abs(pView->GetFoci());
  135. }
  136. else
  137. ASSERT(FALSE); // 非法的缩放倍数值
  138. if ((m_imgdisprect.left+ccx) <= m_imgrect.right)
  139. m_imgdisprect.right = m_imgdisprect.left+ccx;
  140. else
  141. {
  142. m_imgdisprect.right = m_imgrect.right;
  143. m_imgdisprect.left  = m_imgdisprect.right-ccx;
  144. }
  145. if ((m_imgdisprect.top+ccy) <= m_imgrect.bottom)
  146. m_imgdisprect.bottom = m_imgdisprect.top+ccy;
  147. else
  148. {
  149. m_imgdisprect.bottom = m_imgrect.bottom;
  150. m_imgdisprect.top    = m_imgdisprect.bottom-ccy;
  151. }
  152. }
  153. }
  154. }
  155. void CWorkSpace::OnLButtonDown(UINT nFlags, CPoint point) 
  156. {
  157. CISeeExplorerView *pView = (CISeeExplorerView*)GetParent();
  158. ASSERT(pView);
  159. if ((pView->GetDispMode() == ISEE_EXPLORER_VIEW_SWITCH_DISP_HAND)&&
  160. (pView->GetSliMark()))
  161. {
  162. m_bmove = TRUE;
  163. m_cursor = point;
  164. ::SetCursor(m_hand_move);
  165. ::SetCapture((HWND)(*this));
  166. }
  167. CWnd::OnLButtonDown(nFlags, point);
  168. }
  169. void CWorkSpace::OnLButtonUp(UINT nFlags, CPoint point) 
  170. {
  171. #ifdef _DEBUG
  172. CISeeExplorerView *pView = (CISeeExplorerView*)GetParent();
  173. ASSERT(pView);
  174. #endif
  175. if (m_bmove == TRUE)
  176. {
  177. ASSERT(pView->GetDispMode() == ISEE_EXPLORER_VIEW_SWITCH_DISP_HAND);
  178. ::ReleaseCapture();
  179. ::SetCursor(m_hand_free);
  180. m_cursor = point;
  181. m_bmove = FALSE;
  182. }
  183. CWnd::OnLButtonUp(nFlags, point);
  184. }
  185. void CWorkSpace::OnLButtonDblClk(UINT nFlags, CPoint point) 
  186. {
  187. // TODO: Add your message handler code here and/or call default
  188. CWnd::OnLButtonDblClk(nFlags, point);
  189. }
  190. void CWorkSpace::OnMouseMove(UINT nFlags, CPoint point) 
  191. {
  192. CPoint cpt = m_cursor;
  193. BOOL bMark = FALSE;
  194. CISeeExplorerView *pView = (CISeeExplorerView*)GetParent();
  195. ASSERT(pView);
  196. if (m_bmove == TRUE)
  197. {
  198. ASSERT(nFlags & MK_LBUTTON);
  199. cpt -= point;
  200. if (pView->GetDispMode() == ISEE_EXPLORER_VIEW_SWITCH_DISP_AUTO)
  201. {
  202. ASSERT(FALSE);
  203. }
  204. else
  205. {
  206. ASSERT(pView->GetDispMode() == ISEE_EXPLORER_VIEW_SWITCH_DISP_HAND);
  207. if (pView->GetFoci() == ISEE_EXPLORER_VIEW_FOCI_ZOOM)
  208. { // 原始尺寸
  209. bMark = TRUE;
  210. }
  211. else if ((ISEE_EXPLORER_VIEW_FOCI_ZOOM < pView->GetFoci())&&(pView->GetFoci() < ISEE_EXPLORER_VIEW_FOCI_OUT))
  212. { // 放大显示方式
  213. cpt.x /= pView->GetFoci();
  214. cpt.y /= pView->GetFoci();
  215. if ((cpt.x+cpt.y) == 0) 
  216. bMark = FALSE;
  217. else
  218. bMark = TRUE;
  219. }
  220. else if ((ISEE_EXPLORER_VIEW_FOCI_IN < pView->GetFoci())&&(pView->GetFoci() < ISEE_EXPLORER_VIEW_FOCI_ZOOM))
  221. { // 缩小显示方式
  222. ASSERT(pView->GetFoci());
  223. cpt.x *= ::abs(pView->GetFoci());
  224. cpt.y *= ::abs(pView->GetFoci());
  225. if ((cpt.x+cpt.y) == 0) 
  226. bMark = FALSE;
  227. else
  228. bMark = TRUE;
  229. }
  230. else
  231. ASSERT(FALSE); // 非法的缩放倍数值
  232. }
  233. if (bMark == TRUE)
  234. {
  235. m_imgdisprect.OffsetRect(cpt);
  236. if (m_imgdisprect.left < m_imgrect.left)
  237. m_imgdisprect.OffsetRect(-m_imgdisprect.left, 0);
  238. if (m_imgdisprect.right > m_imgrect.right)
  239. m_imgdisprect.OffsetRect(-(m_imgdisprect.right-m_imgrect.right), 0);
  240. if (m_imgdisprect.top < m_imgrect.top)
  241. m_imgdisprect.OffsetRect(0, -m_imgdisprect.top);
  242. if (m_imgdisprect.bottom > m_imgrect.bottom)
  243. m_imgdisprect.OffsetRect(0, -(m_imgdisprect.bottom-m_imgrect.bottom));
  244. m_cursor = point;
  245. RedrawWindow(NULL, NULL, RDW_INVALIDATE|RDW_UPDATENOW);
  246. }
  247. }
  248. CWnd::OnMouseMove(nFlags, point);
  249. }
  250. LONG CWorkSpace::OnChangImage(UINT parm1, LONG parm2)
  251. {
  252. CRect *pRect = (CRect*)parm2;
  253. CISeeExplorerView *pView = (CISeeExplorerView*)GetParent();
  254. ASSERT(pView);
  255. m_pImage = GetCurCRRt();
  256. m_imgrect.SetRect(0,0,m_pImage->GetImageWidth(),m_pImage->GetImageHeight());
  257. m_wndrect = *pRect;
  258. if (pView->GetDispMode() == ISEE_EXPLORER_VIEW_SWITCH_DISP_AUTO)
  259. {
  260. m_imgdisprect = m_imgrect;
  261. }
  262. else
  263. {
  264. ASSERT(pView->GetDispMode() == ISEE_EXPLORER_VIEW_SWITCH_DISP_HAND);
  265. ASSERT(pView->GetFoci() == ISEE_EXPLORER_VIEW_FOCI_ZOOM);
  266. m_imgdisprect = m_wndrect;
  267. }
  268. RedrawWindow();
  269. return 0L;
  270. }
  271. LONG CWorkSpace::OnChangFoci(UINT parm1, LONG parm2)
  272. {
  273. CISeeExplorerView *pView = (CISeeExplorerView*)GetParent();
  274. ASSERT(pView);
  275. CRect *pRect = (CRect*)parm2;
  276. int cx, cy, ccx, ccy;
  277. cx = pRect->Width(); cy = pRect->Height();
  278. m_wndrect = *pRect;
  279. if (m_pImage)
  280. {
  281. if (pView->GetDispMode() == ISEE_EXPLORER_VIEW_SWITCH_DISP_AUTO)
  282. {
  283. m_imgdisprect = m_imgrect;
  284. }
  285. else
  286. {
  287. ASSERT(pView->GetDispMode() == ISEE_EXPLORER_VIEW_SWITCH_DISP_HAND);
  288. if (pView->GetFoci() == ISEE_EXPLORER_VIEW_FOCI_ZOOM)
  289. { // 原始尺寸
  290. ccx = cx;
  291. ccy = cy;
  292. }
  293. else if ((ISEE_EXPLORER_VIEW_FOCI_ZOOM < pView->GetFoci())&&(pView->GetFoci() < ISEE_EXPLORER_VIEW_FOCI_OUT))
  294. { // 放大显示方式
  295. ccx = cx/pView->GetFoci();
  296. ccy = cy/pView->GetFoci();
  297. }
  298. else if ((ISEE_EXPLORER_VIEW_FOCI_IN < pView->GetFoci())&&(pView->GetFoci() < ISEE_EXPLORER_VIEW_FOCI_ZOOM))
  299. { // 缩小显示方式
  300. ASSERT(pView->GetFoci());
  301. ccx = cx*::abs(pView->GetFoci());
  302. ccy = cy*::abs(pView->GetFoci());
  303. }
  304. else
  305. ASSERT(FALSE); // 非法的缩放倍数值
  306. if ((m_imgdisprect.left+ccx) <= m_imgrect.right)
  307. m_imgdisprect.right = m_imgdisprect.left+ccx;
  308. else
  309. {
  310. m_imgdisprect.right = m_imgrect.right;
  311. m_imgdisprect.left  = m_imgdisprect.right-ccx;
  312. }
  313. if ((m_imgdisprect.top+ccy) <= m_imgrect.bottom)
  314. m_imgdisprect.bottom = m_imgdisprect.top+ccy;
  315. else
  316. {
  317. m_imgdisprect.bottom = m_imgrect.bottom;
  318. m_imgdisprect.top    = m_imgdisprect.bottom-ccy;
  319. }
  320. }
  321. pView->SendMessage(IMN_CHANGING_DEM, 
  322. (LPARAM)(CRect*)&m_imgdisprect, 
  323. (LPARAM)(CRect*)&m_imgrect);
  324. RedrawWindow();
  325. }
  326. return 0L;
  327. }