GraphViewCtl.cpp
上传用户:hxb_1234
上传日期:2010-03-30
资源大小:8328k
文件大小:10k
源码类别:

VC书籍

开发平台:

Visual C++

  1. // GraphViewCtl.cpp : Implementation of the CGraphViewCtrl ActiveX Control class.
  2. #include "stdafx.h"
  3. #include "GraphView.h"
  4. #include "GraphViewCtl.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. IMPLEMENT_DYNCREATE(CGraphViewCtrl, COleControl)
  11. /////////////////////////////////////////////////////////////////////////////
  12. // Message map
  13. BEGIN_MESSAGE_MAP(CGraphViewCtrl, COleControl)
  14. //{{AFX_MSG_MAP(CGraphViewCtrl)
  15. // NOTE - ClassWizard will add and remove message map entries
  16. //    DO NOT EDIT what you see in these blocks of generated code !
  17. //}}AFX_MSG_MAP
  18. ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
  19. END_MESSAGE_MAP()
  20. /////////////////////////////////////////////////////////////////////////////
  21. // Dispatch map
  22. BEGIN_DISPATCH_MAP(CGraphViewCtrl, COleControl)
  23. //{{AFX_DISPATCH_MAP(CGraphViewCtrl)
  24. DISP_PROPERTY_NOTIFY(CGraphViewCtrl, "ForeColor", m_foreColor, OnForeColorChanged, VT_COLOR)
  25. DISP_PROPERTY_NOTIFY(CGraphViewCtrl, "LineType", m_lineType, OnLineTypeChanged, VT_I4)
  26. DISP_PROPERTY_NOTIFY(CGraphViewCtrl, "LineWidth", m_lineWidth, OnLineWidthChanged, VT_I4)
  27. DISP_PROPERTY_NOTIFY(CGraphViewCtrl, "BackColor", m_backColor, OnBackColorChanged, VT_COLOR)
  28. DISP_FUNCTION(CGraphViewCtrl, "Clear", Clear, VT_EMPTY, VTS_NONE)
  29. DISP_FUNCTION(CGraphViewCtrl, "SetScale", SetScale, VT_EMPTY, VTS_R8 VTS_R8 VTS_R8 VTS_R8)
  30. DISP_FUNCTION(CGraphViewCtrl, "LineTo", LineTo, VT_EMPTY, VTS_R8 VTS_R8)
  31. DISP_FUNCTION(CGraphViewCtrl, "MoveTo", MoveTo, VT_EMPTY, VTS_R8 VTS_R8)
  32. DISP_FUNCTION(CGraphViewCtrl, "Multiline", Multiline, VT_EMPTY, VTS_I4 VTS_PR8 VTS_PR8)
  33. DISP_FUNCTION(CGraphViewCtrl, "DrawLine", DrawLine, VT_EMPTY, VTS_R8 VTS_R8 VTS_R8 VTS_R8)
  34. //}}AFX_DISPATCH_MAP
  35. END_DISPATCH_MAP()
  36. /////////////////////////////////////////////////////////////////////////////
  37. // Event map
  38. BEGIN_EVENT_MAP(CGraphViewCtrl, COleControl)
  39. //{{AFX_EVENT_MAP(CGraphViewCtrl)
  40. // NOTE - ClassWizard will add and remove event map entries
  41. //    DO NOT EDIT what you see in these blocks of generated code !
  42. //}}AFX_EVENT_MAP
  43. END_EVENT_MAP()
  44. /////////////////////////////////////////////////////////////////////////////
  45. // Initialize class factory and guid
  46. IMPLEMENT_OLECREATE_EX(CGraphViewCtrl, "GRAPHVIEW.GraphViewCtrl.1",
  47. 0x37573b5e, 0x2a9a, 0x4686, 0x9c, 0xb7, 0x8d, 0x26, 0x11, 0xc4, 0x92, 0x72)
  48. /////////////////////////////////////////////////////////////////////////////
  49. // Type library ID and version
  50. IMPLEMENT_OLETYPELIB(CGraphViewCtrl, _tlid, _wVerMajor, _wVerMinor)
  51. /////////////////////////////////////////////////////////////////////////////
  52. // Interface IDs
  53. const IID BASED_CODE IID_DGraphView =
  54. { 0xb2c79461, 0x51b8, 0x4eeb, { 0x8e, 0x89, 0x8b, 0xf8, 0xdc, 0x83, 0xda, 0x60 } };
  55. const IID BASED_CODE IID_DGraphViewEvents =
  56. { 0x2e5c7806, 0x20f7, 0x493a, { 0xad, 0x4c, 0xfd, 0xf6, 0xb7, 0xb0, 0x25, 0xd4 } };
  57. /////////////////////////////////////////////////////////////////////////////
  58. // Control type information
  59. static const DWORD BASED_CODE _dwGraphViewOleMisc =
  60. OLEMISC_ACTIVATEWHENVISIBLE |
  61. OLEMISC_SETCLIENTSITEFIRST |
  62. OLEMISC_INSIDEOUT |
  63. OLEMISC_CANTLINKINSIDE |
  64. OLEMISC_RECOMPOSEONRESIZE;
  65. IMPLEMENT_OLECTLTYPE(CGraphViewCtrl, IDS_GRAPHVIEW, _dwGraphViewOleMisc)
  66. /////////////////////////////////////////////////////////////////////////////
  67. // CGraphViewCtrl::CGraphViewCtrlFactory::UpdateRegistry -
  68. // Adds or removes system registry entries for CGraphViewCtrl
  69. BOOL CGraphViewCtrl::CGraphViewCtrlFactory::UpdateRegistry(BOOL bRegister)
  70. {
  71. // TODO: Verify that your control follows apartment-model threading rules.
  72. // Refer to MFC TechNote 64 for more information.
  73. // If your control does not conform to the apartment-model rules, then
  74. // you must modify the code below, changing the 6th parameter from
  75. // afxRegApartmentThreading to 0.
  76. if (bRegister)
  77. return AfxOleRegisterControlClass(
  78. AfxGetInstanceHandle(),
  79. m_clsid,
  80. m_lpszProgID,
  81. IDS_GRAPHVIEW,
  82. IDB_GRAPHVIEW,
  83. afxRegApartmentThreading,
  84. _dwGraphViewOleMisc,
  85. _tlid,
  86. _wVerMajor,
  87. _wVerMinor);
  88. else
  89. return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
  90. }
  91. /////////////////////////////////////////////////////////////////////////////
  92. // CGraphViewCtrl::CGraphViewCtrl - Constructor
  93. CGraphViewCtrl::CGraphViewCtrl()
  94. {
  95. InitializeIIDs(&IID_DGraphView, &IID_DGraphViewEvents);
  96. //Default properties
  97. m_backColor = RGB(255,255,255);
  98. m_foreColor = RGB(  0,  0,  0);
  99. m_lineType = PS_SOLID;
  100. m_lineWidth = 1;
  101. //Instanciate drawing tools
  102. ptrPen = new CPen(m_lineType, m_lineWidth, m_foreColor);
  103. ptrBrush = new CBrush(m_backColor);
  104. penpos = (0,0);
  105. }
  106. /////////////////////////////////////////////////////////////////////////////
  107. // CGraphViewCtrl::~CGraphViewCtrl - Destructor
  108. CGraphViewCtrl::~CGraphViewCtrl()
  109. {
  110. delete ptrPen;
  111. delete ptrBrush;
  112. }
  113. /////////////////////////////////////////////////////////////////////////////
  114. // CGraphViewCtrl::OnDraw - Drawing function
  115. void CGraphViewCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
  116. {
  117. CRect bufRect = rcBounds;
  118. //Drawing rect
  119. pdc->FillRect(rcBounds, ptrBrush);
  120. pdc->DrawEdge(bufRect, EDGE_BUMP, BF_RECT);
  121. }
  122. /////////////////////////////////////////////////////////////////////////////
  123. // CGraphViewCtrl::DoPropExchange - Persistence support
  124. void CGraphViewCtrl::DoPropExchange(CPropExchange* pPX)
  125. {
  126. ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
  127. COleControl::DoPropExchange(pPX);
  128. // TODO: Call PX_ functions for each persistent custom property.
  129. }
  130. /////////////////////////////////////////////////////////////////////////////
  131. // CGraphViewCtrl::OnResetState - Reset control to default state
  132. void CGraphViewCtrl::OnResetState()
  133. {
  134. COleControl::OnResetState();  // Resets defaults found in DoPropExchange
  135. // TODO: Reset any other control state here.
  136. }
  137. //--- PUBLIC METHODS ---------------------------------------------------------------------------------------
  138. //----------------------------------------------------------------------------------------------------------
  139. void CGraphViewCtrl::Clear() 
  140. {
  141. CDC *pdc;
  142. CRect rcBounds;
  143. pdc = GetDC();
  144. pdc->GetClipBox(&rcBounds);
  145. //Drawing rect
  146. pdc->FillRect(rcBounds, ptrBrush);
  147. pdc->DrawEdge(rcBounds, EDGE_BUMP, BF_RECT);
  148. ReleaseDC(pdc);
  149. }
  150. //----------------------------------------------------------------------------------------------------------
  151. void CGraphViewCtrl::SetScale(double x1, double y1, double x2, double y2) 
  152. {
  153. CDC *pdc=GetDC();
  154. CRect rcBounds;
  155. GetClientRect(&rcBounds);
  156. x1world = x1;
  157. y1world = y1;
  158. x2world = x2;
  159. y2world = y2;
  160. dxworld = x2 - x1;
  161. dyworld = y2 - y1;
  162. dxwin = rcBounds.Width();
  163. dywin = rcBounds.Height();
  164. ReleaseDC(pdc);
  165. }
  166. //----------------------------------------------------------------------------------------------------------
  167. void CGraphViewCtrl::DrawLine(double x1, double y1, double x2, double y2) 
  168. {
  169. CDC *pdc = GetDC();
  170. CPen *oldPen = pdc->SelectObject(ptrPen);
  171. CRect rcBounds;
  172. GetClientRect(&rcBounds);
  173. CPoint p1,p2;
  174. p1 = WorldToWindows(x1, y1);
  175. p2 = WorldToWindows(x2, y2);
  176. pdc->MoveTo(p1);
  177. pdc->LineTo(p2);
  178. pdc->SelectObject(oldPen);
  179. penpos = p2;
  180. pdc->DrawEdge(rcBounds, EDGE_BUMP, BF_RECT);
  181. ReleaseDC(pdc);
  182. }
  183. //----------------------------------------------------------------------------------------------------------
  184. void CGraphViewCtrl::Multiline(long segments, double FAR* xi, double FAR* yi) 
  185. {
  186. CDC *pdc=GetDC();
  187. CPen *oldPen=pdc->SelectObject(ptrPen);
  188. CPoint p;
  189. p = WorldToWindows(xi[0], yi[0]);
  190. pdc->MoveTo(p);
  191. for (int i=1; i<segments; i++)
  192. {
  193. p = WorldToWindows(xi[i], yi[i]);
  194. pdc->LineTo(p);
  195. }
  196. pdc->SelectObject(oldPen);
  197. penpos = p;
  198. ReleaseDC(pdc);
  199. }
  200. //----------------------------------------------------------------------------------------------------------
  201. void CGraphViewCtrl::MoveTo(double x, double y) 
  202. {
  203. CPoint p = WorldToWindows(x, y);
  204. penpos = p;
  205. }
  206. //----------------------------------------------------------------------------------------------------------
  207. void CGraphViewCtrl::LineTo(double x, double y)
  208. {
  209. CDC *pdc = GetDC();
  210. CPen *oldPen = pdc->SelectObject(ptrPen);
  211. CPoint p = WorldToWindows(x, y);
  212. pdc->MoveTo(penpos);
  213. pdc->LineTo(p);
  214. penpos=p;
  215. pdc->SelectObject(oldPen);
  216. ReleaseDC(pdc);
  217. }
  218. //--- PRIVATE METHODS --------------------------------------------------------------------------------------
  219. //----------------------------------------------------------------------------------------------------------
  220. CPoint CGraphViewCtrl::WorldToWindows(double x, double y)
  221. {
  222. CPoint bufPoint;
  223. bufPoint.x = (int)((x - x1world) * (dxwin / dxworld));
  224. bufPoint.y = (int)((y2world - y) * (dywin / dyworld));
  225. return bufPoint;
  226. }
  227. //--- PROPERTIES -------------------------------------------------------------------------------------------
  228. //----------------------------------------------------------------------------------------------------------
  229. void CGraphViewCtrl::OnBackColorChanged() 
  230. {
  231. CDC *pdc;
  232. CRect rcBounds;
  233. delete ptrBrush;
  234. ptrBrush = new CBrush(m_backColor);
  235. pdc = GetDC();
  236. pdc->GetClipBox(&rcBounds);
  237. //Drawing rect
  238. pdc->FillRect(rcBounds, ptrBrush);
  239. pdc->DrawEdge(rcBounds, EDGE_BUMP, BF_RECT);
  240. ReleaseDC(pdc);
  241. SetModifiedFlag();
  242. }
  243. //----------------------------------------------------------------------------------------------------------
  244. void CGraphViewCtrl::OnForeColorChanged() 
  245. {
  246. delete ptrPen;
  247. ptrPen = new CPen(m_lineType, m_lineWidth, m_foreColor);
  248. SetModifiedFlag();
  249. }
  250. //----------------------------------------------------------------------------------------------------------
  251. void CGraphViewCtrl::OnLineTypeChanged() 
  252. {
  253. delete ptrPen;
  254. ptrPen = new CPen(m_lineType, m_lineWidth, m_foreColor);
  255. SetModifiedFlag();
  256. }
  257. //----------------------------------------------------------------------------------------------------------
  258. void CGraphViewCtrl::OnLineWidthChanged() 
  259. {
  260. delete ptrPen;
  261. ptrPen = new CPen(m_lineType, m_lineWidth, m_foreColor);
  262. SetModifiedFlag();
  263. }