DrawObj.cpp
上传用户:seaboy_04
上传日期:2013-02-24
资源大小:284k
文件大小:18k
源码类别:

其他行业

开发平台:

Visual C++

  1. // DrawObj.cpp: implementation of the CDrawObj class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "DrawCli.h"
  6. #include "DrawObj.h"
  7. #include "drawdoc.h"
  8. #include "drawvw.h"
  9. #include "cntritem.h"
  10. #include "rectdlg.h"
  11. #ifdef _DEBUG
  12. #undef THIS_FILE
  13. static char THIS_FILE[]=__FILE__;
  14. #define new DEBUG_NEW
  15. #endif
  16. //////////////////////////////////////////////////////////////////////
  17. // Construction/Destruction
  18. //////////////////////////////////////////////////////////////////////
  19. IMPLEMENT_SERIAL(CDrawObj, CObject, 0)
  20. CDrawObj::CDrawObj()
  21. {
  22. }
  23. CDrawObj::~CDrawObj()
  24. {
  25. }
  26. CDrawObj::CDrawObj(const CRect& position)
  27. {
  28. m_position = position;
  29. m_pDocument = NULL;
  30. m_bPen = TRUE;
  31. m_logpen.lopnStyle = PS_INSIDEFRAME;
  32. m_logpen.lopnWidth.x = 2;
  33. m_logpen.lopnWidth.y = 2;
  34. m_logpen.lopnColor = RGB(0, 0, 0);
  35. m_bBrush = TRUE;
  36. m_logbrush.lbStyle = BS_SOLID;
  37. m_logbrush.lbColor = RGB(192, 192, 192);
  38. m_logbrush.lbHatch = HS_HORIZONTAL;
  39. }
  40. void CDrawObj::Serialize(CArchive& ar)
  41. {
  42. CObject::Serialize(ar);
  43. if (ar.IsStoring())
  44. {
  45. ar << m_position;
  46. ar << (WORD)m_bPen;
  47. ar.Write(&m_logpen, sizeof(LOGPEN));
  48. ar << (WORD)m_bBrush;
  49. ar.Write(&m_logbrush, sizeof(LOGBRUSH));
  50. }
  51. else
  52. {
  53. // get the document back pointer from the archive
  54. m_pDocument = (CDrawDoc*)ar.m_pDocument;
  55. ASSERT_VALID(m_pDocument);
  56. ASSERT_KINDOF(CDrawDoc, m_pDocument);
  57. WORD wTemp;
  58. ar >> m_position;
  59. ar >> wTemp; m_bPen = (BOOL)wTemp;
  60. ar.Read(&m_logpen,sizeof(LOGPEN));
  61. ar >> wTemp; m_bBrush = (BOOL)wTemp;
  62. ar.Read(&m_logbrush, sizeof(LOGBRUSH));
  63. }
  64. }
  65. void CDrawObj::Remove()
  66. {
  67. delete this;
  68. }
  69. void CDrawObj::Draw(CDC*)
  70. {
  71. }
  72. void CDrawObj::DrawTracker(CDC* pDC, TrackerState state)
  73. {
  74. ASSERT_VALID(this);
  75. switch (state)
  76. {
  77. case normal:
  78. break;
  79. case selected:
  80. case active:
  81. {
  82. int nHandleCount = GetHandleCount();
  83. for (int nHandle = 1; nHandle <= nHandleCount; nHandle += 1)
  84. {
  85. CPoint handle = GetHandle(nHandle);
  86. pDC->PatBlt(handle.x - 3, handle.y - 3, 7, 7, DSTINVERT);
  87. }
  88. }
  89. break;
  90. }
  91. }
  92. // position is in logical
  93. void CDrawObj::MoveTo(const CRect& position, CDrawView* pView)
  94. {
  95. ASSERT_VALID(this);
  96.  
  97. if (position == m_position)
  98. return;
  99. if (pView == NULL)
  100. {
  101. Invalidate();
  102. m_position = position;
  103. Invalidate();
  104. }
  105. else
  106. {
  107. pView->InvalObj(this);
  108. m_position = position;
  109. pView->InvalObj(this);
  110. }
  111. m_pDocument->SetModifiedFlag();
  112. }
  113. // Note: if bSelected, hit-codes start at one for the top-left
  114. // and increment clockwise, 0 means no hit.
  115. // If !bSelected, 0 = no hit, 1 = hit (anywhere)
  116. // point is in logical coordinates
  117. int CDrawObj::HitTest(CPoint point, CDrawView* pView, BOOL bSelected)
  118. {
  119. ASSERT_VALID(this);
  120. ASSERT(pView != NULL);
  121. if (bSelected)
  122. {
  123. int nHandleCount = GetHandleCount();
  124. for (int nHandle = 1; nHandle <= nHandleCount; nHandle += 1)
  125. {
  126. // GetHandleRect returns in logical coords
  127. CRect rc = GetHandleRect(nHandle,pView);
  128. if (point.x >= rc.left && point.x < rc.right &&
  129. point.y <= rc.top && point.y > rc.bottom)
  130. return nHandle;
  131. }
  132. }
  133. else
  134. {
  135. if (point.x >= m_position.left && point.x < m_position.right &&
  136. point.y <= m_position.top && point.y > m_position.bottom)
  137. return 1;
  138. }
  139. return 0;
  140. }
  141. // rect must be in logical coordinates
  142. BOOL CDrawObj::Intersects(const CRect& rect)
  143. {
  144. ASSERT_VALID(this);
  145. CRect fixed = m_position;
  146. fixed.NormalizeRect();
  147. CRect rectT = rect;
  148. rectT.NormalizeRect();
  149. return !(rectT & fixed).IsRectEmpty();
  150. }
  151. int CDrawObj::GetHandleCount()
  152. {
  153. ASSERT_VALID(this);
  154. return 8;
  155. }
  156. // returns logical coords of center of handle
  157. CPoint CDrawObj::GetHandle(int nHandle)
  158. {
  159. ASSERT_VALID(this);
  160. int x, y, xCenter, yCenter;
  161. // this gets the center regardless of left/right and top/bottom ordering
  162. xCenter = m_position.left + m_position.Width() / 2;
  163. yCenter = m_position.top + m_position.Height() / 2;
  164. switch (nHandle)
  165. {
  166. default:
  167. ASSERT(FALSE);
  168. case 1:
  169. x = m_position.left;
  170. y = m_position.top;
  171. break;
  172. case 2:
  173. x = xCenter;
  174. y = m_position.top;
  175. break;
  176. case 3:
  177. x = m_position.right;
  178. y = m_position.top;
  179. break;
  180. case 4:
  181. x = m_position.right;
  182. y = yCenter;
  183. break;
  184. case 5:
  185. x = m_position.right;
  186. y = m_position.bottom;
  187. break;
  188. case 6:
  189. x = xCenter;
  190. y = m_position.bottom;
  191. break;
  192. case 7:
  193. x = m_position.left;
  194. y = m_position.bottom;
  195. break;
  196. case 8:
  197. x = m_position.left;
  198. y = yCenter;
  199. break;
  200. }
  201. return CPoint(x, y);
  202. }
  203. // return rectange of handle in logical coords
  204. CRect CDrawObj::GetHandleRect(int nHandleID, CDrawView* pView)
  205. {
  206. ASSERT_VALID(this);
  207. ASSERT(pView != NULL);
  208. CRect rect;
  209. // get the center of the handle in logical coords
  210. CPoint point = GetHandle(nHandleID);
  211. // convert to client/device coords
  212. pView->DocToClient(point);
  213. // return CRect of handle in device coords
  214. rect.SetRect(point.x-3, point.y-3, point.x+3, point.y+3);
  215. pView->ClientToDoc(rect);
  216. return rect;
  217. }
  218. HCURSOR CDrawObj::GetHandleCursor(int nHandle)
  219. {
  220. ASSERT_VALID(this);
  221. LPCTSTR id;
  222. switch (nHandle)
  223. {
  224. default:
  225. ASSERT(FALSE);
  226. case 1:
  227. case 5:
  228. id = IDC_SIZENWSE;
  229. break;
  230. case 2:
  231. case 6:
  232. id = IDC_SIZENS;
  233. break;
  234. case 3:
  235. case 7:
  236. id = IDC_SIZENESW;
  237. break;
  238. case 4:
  239. case 8:
  240. id = IDC_SIZEWE;
  241. break;
  242. }
  243. return AfxGetApp()->LoadStandardCursor(id);
  244. }
  245. // point must be in logical
  246. void CDrawObj::MoveHandleTo(int nHandle, CPoint point, CDrawView* pView)
  247. {
  248. ASSERT_VALID(this);
  249. CRect position = m_position;
  250. switch (nHandle)
  251. {
  252. default:
  253. ASSERT(FALSE);
  254. case 1:
  255. position.left = point.x;
  256. position.top = point.y;
  257. break;
  258. case 2:
  259. position.top = point.y;
  260. break;
  261. case 3:
  262. position.right = point.x;
  263. position.top = point.y;
  264. break;
  265. case 4:
  266. position.right = point.x;
  267. break;
  268. case 5:
  269. position.right = point.x;
  270. position.bottom = point.y;
  271. break;
  272. case 6:
  273. position.bottom = point.y;
  274. break;
  275. case 7:
  276. position.left = point.x;
  277. position.bottom = point.y;
  278. break;
  279. case 8:
  280. position.left = point.x;
  281. break;
  282. }
  283. MoveTo(position, pView);
  284. }
  285. void CDrawObj::Invalidate()
  286. {
  287. ASSERT_VALID(this);
  288. m_pDocument->UpdateAllViews(NULL, HINT_UPDATE_DRAWOBJ, this);
  289. }
  290. CDrawObj* CDrawObj::Clone(CDrawDoc* pDoc)
  291. {
  292. ASSERT_VALID(this);
  293.  
  294. CDrawObj* pClone = new CDrawObj(m_position);
  295. pClone->m_bPen = m_bPen;
  296. pClone->m_logpen = m_logpen;
  297. pClone->m_bBrush = m_bBrush;
  298. pClone->m_logbrush = m_logbrush;
  299. ASSERT_VALID(pClone);
  300. if (pDoc != NULL)
  301. pDoc->Add(pClone);
  302. return pClone;
  303. }
  304. void CDrawObj::OnEditProperties()
  305. {
  306. ASSERT_VALID(this);
  307.    
  308. CPropertySheet sheet( _T("对象显示属性") );
  309. CRectDlg dlg;
  310. dlg.m_bNoFill = !m_bBrush;
  311. dlg.m_penSize = m_bPen ? m_logpen.lopnWidth.x : 0;
  312. dlg.m_LineColor = m_logpen.lopnColor;   
  313.     dlg.m_FillColor = m_logbrush.lbColor;   
  314. sheet.AddPage( &dlg );
  315. if (sheet.DoModal() != IDOK)
  316. return;
  317. m_bBrush = !dlg.m_bNoFill;
  318. m_bPen = dlg.m_penSize > 0;
  319. m_logbrush.lbColor = dlg.m_FillColor;   
  320. if (m_bPen)
  321. {
  322.     m_logpen.lopnWidth.x = dlg.m_penSize;
  323. m_logpen.lopnWidth.y = dlg.m_penSize;
  324. m_logpen.lopnColor = dlg.m_LineColor;   
  325.   }
  326. Invalidate();
  327. m_pDocument->SetModifiedFlag(); 
  328. }
  329. void CDrawObj::OnOpen(CDrawView* /*pView*/ )
  330. {
  331. OnEditProperties();
  332. }
  333. void CDrawObj::SetLineColor(COLORREF color)
  334. {
  335. ASSERT_VALID(this);
  336. m_logpen.lopnColor = color;
  337. Invalidate();
  338. m_pDocument->SetModifiedFlag();
  339. }
  340. void CDrawObj::SetFillColor(COLORREF color)
  341. {
  342. ASSERT_VALID(this);
  343. m_logbrush.lbColor = color;
  344. Invalidate();
  345. m_pDocument->SetModifiedFlag();
  346. }
  347. #ifdef _DEBUG
  348. void CDrawObj::AssertValid()
  349. {
  350. ASSERT(m_position.left <= m_position.right);
  351. ASSERT(m_position.bottom <= m_position.top);
  352. }
  353. #endif
  354. ////////////////////////////////////////////////////////////////////////////
  355. // CDrawRect
  356. IMPLEMENT_SERIAL(CDrawRect, CDrawObj, 0)
  357. CDrawRect::CDrawRect()
  358. {
  359. }
  360. CDrawRect::CDrawRect(const CRect& position)
  361. : CDrawObj(position)
  362. {
  363. ASSERT_VALID(this);
  364. m_nShape = rectangle;
  365. m_roundness.x = 16;
  366. m_roundness.y = 16;
  367. }
  368. void CDrawRect::Serialize(CArchive& ar)
  369. {
  370. ASSERT_VALID(this);
  371. CDrawObj::Serialize(ar);
  372. if (ar.IsStoring())
  373. {
  374. ar << (WORD) m_nShape;
  375. ar << m_roundness;
  376. }
  377. else
  378. {
  379. WORD wTemp;
  380. ar >> wTemp; m_nShape = (Shape)wTemp;
  381. ar >> m_roundness;
  382. }
  383. }
  384. /**/
  385. void CDrawRect::DrawCircle(CDC* pDC,CRect rect)
  386. {
  387. ASSERT_VALID(this);
  388. int cx,cy;
  389. if (rect.right < rect.left)
  390. {
  391. cx = rect.left;
  392. rect.left = rect.right;
  393. rect.right = cx;
  394. }
  395. if (rect.bottom < rect.top)
  396. {
  397. cy = rect.top;
  398. rect.top = rect.bottom;
  399. rect.bottom = cy;
  400. }
  401. cx = rect.right - rect.left;
  402.     cy = rect.bottom - rect.top;
  403. if (cx > cy)
  404. {
  405. rect.left += (cx-cy) / 2;
  406. rect.right = rect.left + cy;
  407. }
  408. else
  409. {
  410.             rect.top += (cy-cx) / 2;
  411. rect.bottom = rect.top + cx;
  412. }
  413. //pDC->TextOut(rect.left,rect.bottom,"123",3);
  414. pDC->Ellipse(rect);
  415. }
  416. /**/
  417. void CDrawRect::Draw(CDC* pDC)
  418. {
  419. ASSERT_VALID(this);
  420. CBrush brush;
  421. if (!brush.CreateBrushIndirect(&m_logbrush))
  422. return;
  423. CPen pen;
  424. if (!pen.CreatePenIndirect(&m_logpen))
  425. return;
  426. CBrush* pOldBrush;
  427. CPen* pOldPen;
  428. if (m_bBrush)
  429. pOldBrush = pDC->SelectObject(&brush);
  430. else
  431. pOldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH);
  432. if (m_bPen)
  433. pOldPen = pDC->SelectObject(&pen);
  434. else
  435. pOldPen = (CPen*)pDC->SelectStockObject(NULL_PEN);
  436. CRect rect = m_position;
  437. switch (m_nShape)
  438. {
  439. case rectangle:
  440. pDC->Rectangle(rect);
  441. break;
  442. case roundRectangle:
  443. pDC->RoundRect(rect, m_roundness);
  444. break;
  445. case ellipse:
  446. pDC->Ellipse(rect);
  447. break;
  448. case circle:
  449. DrawCircle(pDC,rect);
  450. //pDC->Circle(rect);
  451. break;
  452. case line:
  453. if (rect.top > rect.bottom)
  454. {
  455. rect.top -= m_logpen.lopnWidth.y / 2;
  456. rect.bottom += (m_logpen.lopnWidth.y + 1) / 2;
  457. }
  458. else
  459. {
  460. rect.top += (m_logpen.lopnWidth.y + 1) / 2;
  461. rect.bottom -= m_logpen.lopnWidth.y / 2;
  462. }
  463. if (rect.left > rect.right)
  464. {
  465. rect.left -= m_logpen.lopnWidth.x / 2;
  466. rect.right += (m_logpen.lopnWidth.x + 1) / 2;
  467. }
  468. else
  469. {
  470. rect.left += (m_logpen.lopnWidth.x + 1) / 2;
  471. rect.right -= m_logpen.lopnWidth.x / 2;
  472. }
  473. pDC->MoveTo(rect.TopLeft());
  474. pDC->LineTo(rect.BottomRight());
  475. break;
  476. }
  477. pDC->SelectObject(pOldBrush);
  478. pDC->SelectObject(pOldPen);
  479. }
  480. int CDrawRect::GetHandleCount()
  481. {
  482. ASSERT_VALID(this);
  483. return m_nShape == line ? 2 :
  484. CDrawObj::GetHandleCount() + (m_nShape == roundRectangle);
  485. }
  486. // returns center of handle in logical coordinates
  487. CPoint CDrawRect::GetHandle(int nHandle)
  488. {
  489. ASSERT_VALID(this);
  490. if (m_nShape == line && nHandle == 2)
  491. nHandle = 5;
  492. else if (m_nShape == roundRectangle && nHandle == 9)
  493. {
  494. CRect rect = m_position;
  495. rect.NormalizeRect();
  496. CPoint point = rect.BottomRight();
  497. point.x -= m_roundness.x / 2;
  498. point.y -= m_roundness.y / 2;
  499. return point;
  500. }
  501. return CDrawObj::GetHandle(nHandle);
  502. }
  503. HCURSOR CDrawRect::GetHandleCursor(int nHandle)
  504. {
  505. ASSERT_VALID(this);
  506. if (m_nShape == line && nHandle == 2)
  507. nHandle = 5;
  508. else if (m_nShape == roundRectangle && nHandle == 9)
  509. return AfxGetApp()->LoadStandardCursor(IDC_SIZEALL);
  510. return CDrawObj::GetHandleCursor(nHandle);
  511. }
  512. // point is in logical coordinates
  513. void CDrawRect::MoveHandleTo(int nHandle, CPoint point, CDrawView* pView)
  514. {
  515. ASSERT_VALID(this);
  516. if (m_nShape == line && nHandle == 2)
  517. nHandle = 5;
  518. else if (m_nShape == roundRectangle && nHandle == 9)
  519. {
  520. CRect rect = m_position;
  521. rect.NormalizeRect();
  522. if (point.x > rect.right - 1)
  523. point.x = rect.right - 1;
  524. else if (point.x < rect.left + rect.Width() / 2)
  525. point.x = rect.left + rect.Width() / 2;
  526. if (point.y > rect.bottom - 1)
  527. point.y = rect.bottom - 1;
  528. else if (point.y < rect.top + rect.Height() / 2)
  529. point.y = rect.top + rect.Height() / 2;
  530. m_roundness.x = 2 * (rect.right - point.x);
  531. m_roundness.y = 2 * (rect.bottom - point.y);
  532. m_pDocument->SetModifiedFlag();
  533. if (pView == NULL)
  534. Invalidate();
  535. else
  536. pView->InvalObj(this);
  537. return;
  538. }
  539. CDrawObj::MoveHandleTo(nHandle, point, pView);
  540. }
  541. // rect must be in logical coordinates
  542. BOOL CDrawRect::Intersects(const CRect& rect)
  543. {
  544. ASSERT_VALID(this);
  545. CRect rectT = rect;
  546. rectT.NormalizeRect();
  547. CRect fixed = m_position;
  548. fixed.NormalizeRect();
  549. if ((rectT & fixed).IsRectEmpty())
  550. return FALSE;
  551. CRgn rgn;
  552. switch (m_nShape)
  553. {
  554. case rectangle:
  555. return TRUE;
  556. case roundRectangle:
  557. rgn.CreateRoundRectRgn(fixed.left, fixed.top, fixed.right, fixed.bottom,
  558. m_roundness.x, m_roundness.y);
  559. break;
  560. case ellipse:
  561. rgn.CreateEllipticRgnIndirect(fixed);
  562. break;
  563. case line:
  564. {
  565. int x = (m_logpen.lopnWidth.x + 5) / 2;
  566. int y = (m_logpen.lopnWidth.y + 5) / 2;
  567. POINT points[4];
  568. points[0].x = fixed.left;
  569. points[0].y = fixed.top;
  570. points[1].x = fixed.left;
  571. points[1].y = fixed.top;
  572. points[2].x = fixed.right;
  573. points[2].y = fixed.bottom;
  574. points[3].x = fixed.right;
  575. points[3].y = fixed.bottom;
  576. if (fixed.left < fixed.right)
  577. {
  578. points[0].x -= x;
  579. points[1].x += x;
  580. points[2].x += x;
  581. points[3].x -= x;
  582. }
  583. else
  584. {
  585. points[0].x += x;
  586. points[1].x -= x;
  587. points[2].x -= x;
  588. points[3].x += x;
  589. }
  590. if (fixed.top < fixed.bottom)
  591. {
  592. points[0].y -= y;
  593. points[1].y += y;
  594. points[2].y += y;
  595. points[3].y -= y;
  596. }
  597. else
  598. {
  599. points[0].y += y;
  600. points[1].y -= y;
  601. points[2].y -= y;
  602. points[3].y += y;
  603. }
  604. rgn.CreatePolygonRgn(points, 4, ALTERNATE);
  605. }
  606. break;
  607. case circle:
  608. rgn.CreateEllipticRgnIndirect(fixed);
  609. break;
  610. }
  611. return rgn.RectInRegion(fixed);
  612. }
  613. CDrawObj* CDrawRect::Clone(CDrawDoc* pDoc)
  614. {
  615. ASSERT_VALID(this);
  616. CDrawRect* pClone = new CDrawRect(m_position);
  617. pClone->m_bPen = m_bPen;
  618. pClone->m_logpen = m_logpen;
  619. pClone->m_bBrush = m_bBrush;
  620. pClone->m_logbrush = m_logbrush;
  621. pClone->m_nShape = m_nShape;
  622. pClone->m_roundness = m_roundness;
  623. ASSERT_VALID(pClone);
  624. if (pDoc != NULL)
  625. pDoc->Add(pClone);
  626. ASSERT_VALID(pClone);
  627. return pClone;
  628. }
  629. ////////////////////////////////////////////////////////////////////////////
  630. IMPLEMENT_SERIAL(CDrawOleObj, CDrawObj, 0)
  631. BOOL CDrawOleObj::c_bShowItems = TRUE;
  632. CDrawOleObj::CDrawOleObj() : m_extent(0,0)
  633. {
  634. m_pClientItem = NULL;
  635. }
  636. CDrawOleObj::CDrawOleObj(const CRect& position)
  637. : CDrawObj(position), m_extent(0, 0)
  638. {
  639. m_pClientItem = NULL;
  640. }
  641. CDrawOleObj::~CDrawOleObj()
  642. {
  643. if (m_pClientItem != NULL)
  644. {
  645. m_pClientItem->Release();
  646. m_pClientItem = NULL;
  647. }
  648. }
  649. void CDrawOleObj::Remove()
  650. {
  651. if (m_pClientItem != NULL)
  652. {
  653. m_pClientItem->Delete();
  654. m_pClientItem = NULL;
  655. }
  656. CDrawObj::Remove();
  657. }
  658. void CDrawOleObj::Serialize( CArchive& ar )
  659. {
  660. ASSERT_VALID(this);
  661. CDrawObj::Serialize(ar);
  662. if (ar.IsStoring())
  663. {
  664. ar << m_extent;
  665. ar << m_pClientItem;
  666. }
  667. else
  668. {
  669. ar >> m_extent;
  670. ar >> m_pClientItem;
  671. m_pClientItem->m_pDrawObj = this;
  672. }
  673.  }
  674. CDrawObj* CDrawOleObj::Clone(CDrawDoc* pDoc)
  675. {
  676. ASSERT_VALID(this);
  677.  
  678. AfxGetApp()->BeginWaitCursor();
  679. CDrawOleObj* pClone = NULL;
  680. CDrawItem* pItem = NULL;
  681.  
  682. TRY
  683. {
  684. // perform a "deep copy" -- need to copy CDrawOleObj and the CDrawItem
  685. //  that it points to.
  686. CDrawOleObj* pClone = new CDrawOleObj(m_position);
  687. CDrawItem* pItem = new CDrawItem(m_pDocument, pClone);
  688. if (!pItem->CreateCloneFrom(m_pClientItem))
  689. AfxThrowMemoryException();
  690. pClone->m_pClientItem = pItem;
  691. pClone->m_bPen = m_bPen;
  692. pClone->m_logpen = m_logpen;
  693. pClone->m_bBrush = m_bBrush;
  694. pClone->m_logbrush = m_logbrush;
  695. ASSERT_VALID(pClone);
  696. if (pDoc != NULL)
  697. pDoc->Add(pClone);
  698. }
  699. CATCH_ALL(e)
  700. {
  701. pItem->Delete();
  702. pClone->m_pClientItem = NULL;
  703. pClone->Remove();
  704. AfxGetApp()->EndWaitCursor();
  705. THROW_LAST();
  706. }
  707. END_CATCH_ALL
  708. AfxGetApp()->EndWaitCursor();
  709. return pClone;
  710. }
  711. void CDrawOleObj::Draw(CDC* pDC)
  712. {
  713. ASSERT_VALID(this);
  714. CDrawItem* pItem = m_pClientItem;
  715. if (pItem != NULL)
  716. {
  717. // draw the OLE item itself
  718. pItem->Draw(pDC, m_position);
  719. // don't draw tracker in print preview or on printer
  720. if (!pDC->IsPrinting())
  721. {
  722. // use a CRectTracker to draw the standard effects
  723. CRectTracker tracker;
  724. tracker.m_rect = m_position;
  725. pDC->LPtoDP(tracker.m_rect);
  726. if (c_bShowItems)
  727. {
  728. // put correct border depending on item type
  729. if (pItem->GetType() == OT_LINK)
  730. tracker.m_nStyle |= CRectTracker::dottedLine;
  731. else
  732. tracker.m_nStyle |= CRectTracker::solidLine;
  733. }
  734. // put hatching over the item if it is currently open
  735. if (pItem->GetItemState() == COleClientItem::openState ||
  736. pItem->GetItemState() == COleClientItem::activeUIState)
  737. {
  738. tracker.m_nStyle |= CRectTracker::hatchInside;
  739. }
  740. tracker.Draw(pDC);
  741. }
  742. }
  743. }
  744. void CDrawOleObj::OnOpen(CDrawView* pView)
  745. {
  746. AfxGetApp()->BeginWaitCursor();
  747. m_pClientItem->DoVerb(
  748. #ifndef _MAC
  749. GetKeyState(VK_CONTROL) < 0 ? OLEIVERB_OPEN : OLEIVERB_PRIMARY,
  750. #else
  751. GetKeyState(VK_OPTION) < 0 ? OLEIVERB_OPEN : OLEIVERB_PRIMARY,
  752. #endif
  753. pView);
  754. AfxGetApp()->EndWaitCursor();
  755. }
  756. void CDrawOleObj::OnEditProperties()
  757. {
  758. // using COlePropertiesDialog directly means no scaling
  759. COlePropertiesDialog dlg(m_pClientItem, 100, 100, NULL);
  760. dlg.DoModal();
  761. }
  762. // position is in logical
  763. void CDrawOleObj::MoveTo(const CRect& position, CDrawView* pView)
  764. {
  765. ASSERT_VALID(this);
  766. if (position == m_position)
  767. return;
  768. // call base class to update position
  769. CDrawObj::MoveTo(position, pView);
  770. // update position of in-place editing session on position change
  771. if (m_pClientItem->IsInPlaceActive())
  772. m_pClientItem->SetItemRects();
  773. }
  774. /////////////////////////////////////////////////////////////////////////////