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