drawDoc.cpp
上传用户:jinlangri
上传日期:2022-07-17
资源大小:10774k
文件大小:10k
源码类别:

GDI/图象编程

开发平台:

Visual C++

  1. // drawDoc.cpp : implementation of the CDrawDoc class
  2. //
  3. #include "stdafx.h"
  4. #include "draw.h"
  5. #include "drawDoc.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CDrawDoc
  13. IMPLEMENT_DYNCREATE(CDrawDoc, CDocument)
  14. BEGIN_MESSAGE_MAP(CDrawDoc, CDocument)
  15. //{{AFX_MSG_MAP(CDrawDoc)
  16. ON_COMMAND(ID_EDIT_CLEARALL, OnEditClearAll)
  17. ON_UPDATE_COMMAND_UI(ID_EDIT_CLEARALL, OnUpdateEditClearAll)
  18. ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
  19. ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
  20. //}}AFX_MSG_MAP
  21. ON_COMMAND(ID_FILE_SEND_MAIL, OnFileSendMail)
  22. ON_UPDATE_COMMAND_UI(ID_FILE_SEND_MAIL, OnUpdateFileSendMail)
  23. END_MESSAGE_MAP()
  24. /////////////////////////////////////////////////////////////////////////////
  25. // CDrawDoc construction/destruction
  26. CDrawDoc::CDrawDoc()
  27. {
  28. // TODO: add one-time construction code here
  29. }
  30. CDrawDoc::~CDrawDoc()
  31. {
  32. }
  33. BOOL CDrawDoc::OnNewDocument()
  34. {
  35. if (!CDocument::OnNewDocument())
  36. return FALSE;
  37. // TODO: add reinitialization code here
  38. // (SDI documents will reuse this document)
  39. return TRUE;
  40. }
  41. /////////////////////////////////////////////////////////////////////////////
  42. // CDrawDoc serialization
  43. void CDrawDoc::Serialize(CArchive& ar)
  44. {
  45. if (ar.IsStoring())
  46. {
  47. m_DrawArray.Serialize(ar);
  48. }
  49. else
  50. {
  51. m_DrawArray.Serialize(ar);
  52. }
  53. }
  54. /////////////////////////////////////////////////////////////////////////////
  55. // CDrawDoc diagnostics
  56. #ifdef _DEBUG
  57. void CDrawDoc::AssertValid() const
  58. {
  59. CDocument::AssertValid();
  60. }
  61. void CDrawDoc::Dump(CDumpContext& dc) const
  62. {
  63. CDocument::Dump(dc);
  64. }
  65. #endif //_DEBUG
  66. /////////////////////////////////////////////////////////////////////////////
  67. // CDrawDoc commands
  68. void CDrawDoc::AddDraw(CDrawBase *pDraw)
  69. {
  70. m_DrawArray.Add(pDraw);
  71. SetModifiedFlag();
  72. }
  73. CDrawBase *CDrawDoc::GetDraw(int Index)
  74. {
  75. if(Index<0||Index>m_DrawArray.GetUpperBound())
  76. return 0;
  77. return (CDrawBase *)m_DrawArray.GetAt(Index);
  78. }
  79. int CDrawDoc::GetNumDraws()
  80. {
  81. return m_DrawArray.GetSize();
  82. }
  83. //CDrawBase类的实现
  84. IMPLEMENT_SERIAL(CDrawBase, CObject, 1)
  85. CRect CDrawBase::GetDimRect()
  86. {
  87. return CRect(min(m_X1, m_X2),
  88.   min(m_Y1, m_Y2),
  89.   max(m_X1, m_X2) + 1,
  90.   max(m_Y1, m_Y2) + 1);
  91. }
  92. void CDrawBase::Serialize(CArchive& ar)
  93. {
  94. if(ar.IsStoring())
  95. ar << m_X1 << m_Y1 << m_X2 << m_Y2 << m_Color;
  96. else 
  97. ar >> m_X1 >> m_Y1 >> m_X2 >> m_Y2 >> m_Color;
  98. }
  99. //CLine类的实现代码
  100. IMPLEMENT_SERIAL(CLine, CDrawBase, 1)
  101. CLine::CLine(int X1, int Y1, int X2, int Y2, COLORREF Color, int Thickness)
  102. {
  103. m_X1 = X1;
  104. m_Y1 = Y1;
  105. m_X2 = X2;
  106. m_Y2 = Y2;
  107. m_Color = Color;
  108. m_Thickness = Thickness;
  109. }
  110. void CLine::Serialize(CArchive& ar)
  111. {
  112. CDrawBase::Serialize(ar);
  113. if(ar.IsStoring())
  114. ar << m_Thickness;
  115. else
  116. ar >> m_Thickness;
  117. }
  118. void CLine::Draw(CDC *pDC)
  119. {
  120. CPen Pen, *pOldPen;
  121. Pen.CreatePen(PS_SOLID, m_Thickness, m_Color);
  122. pOldPen = pDC->SelectObject(&Pen);
  123. pDC->MoveTo(m_X1, m_Y1);
  124. pDC->LineTo(m_X2, m_Y2);
  125. pDC->SelectObject(pOldPen);
  126. }
  127. //CRectangle类的实现代码
  128. IMPLEMENT_SERIAL(CRectangle, CDrawBase, 1)
  129. //数据成员初始化
  130. CRectangle::CRectangle(int X1, int Y1, int X2, int Y2, COLORREF Color, int Thickness)
  131. {
  132. m_X1 = X1;
  133. m_Y1 = Y1;
  134. m_X2 = X2;
  135. m_Y2 = Y2;
  136. m_Color = Color;
  137. m_Thickness = Thickness;
  138. }
  139. void CRectangle::Serialize(CArchive& ar)
  140. {
  141. CDrawBase::Serialize(ar); //基类数据成员序列化
  142. if(ar.IsStoring())        //m_Thickness序列化
  143. ar << m_Thickness;
  144. else
  145. ar >> m_Thickness;
  146. }
  147. void CRectangle::Draw(CDC *pDC)
  148. {
  149. CPen Pen, *pOldPen;
  150. Pen.CreatePen(PS_INSIDEFRAME, m_Thickness, m_Color);//创建画笔
  151. pOldPen = pDC->SelectObject(&Pen); //选入画笔,并保存原来的画笔
  152. //选入库存画刷,并保存原来的画刷
  153. CBrush *pOldBrush = (CBrush *)pDC->SelectStockObject(NULL_BRUSH);
  154. //绘制矩形
  155. pDC->Rectangle(m_X1,m_Y1,m_X2,m_Y2);
  156. //恢复原来的画笔和画刷
  157. pDC->SelectObject(pOldPen);
  158. pDC->SelectObject(pOldBrush);
  159. }
  160. //CRectFill类的实现代码
  161. IMPLEMENT_SERIAL(CRectFill, CDrawBase, 1)
  162. CRectFill::CRectFill(int X1, int Y1, int X2, int Y2, COLORREF Color)
  163. {
  164. m_X1 = X1;
  165. m_Y1 = Y1;
  166. m_X2 = X2;
  167. m_Y2 = Y2;
  168. m_Color = Color;
  169. }
  170. void CRectFill::Draw(CDC *pDC)
  171. {
  172. CBrush Brush, *pOldBrush;
  173. CPen Pen, *pOldPen;
  174. //创建并选入画笔
  175. Pen.CreatePen(PS_INSIDEFRAME, 1, m_Color);
  176. pOldPen = pDC->SelectObject(&Pen);
  177. //创建并选入画刷
  178. Brush.CreateSolidBrush(m_Color);
  179. pOldBrush = pDC->SelectObject(&Brush);
  180. //绘制填充矩形
  181. pDC->Rectangle(m_X1, m_Y1, m_X2, m_Y2);
  182. //恢复原来的画笔和画刷
  183. pDC->SelectObject(pOldPen);
  184. pDC->SelectObject(pOldBrush);
  185. }
  186. //CRectRound类的实现代码
  187. IMPLEMENT_SERIAL(CRectRound,CDrawBase,1)
  188. CRectRound::CRectRound(int X1, int Y1, int X2, int Y2, COLORREF Color, int Thickness)
  189. {
  190. m_X1 = min(X1, X2);
  191. m_Y1 = min(Y1, Y2);
  192. m_X2 = max(X1, X2);
  193. m_Y2 = max(Y1, Y2);
  194. m_Color = Color;
  195. m_Thickness = Thickness;
  196. }
  197. void CRectRound::Serialize(CArchive& ar)
  198. {
  199. CDrawBase::Serialize(ar);//基类数据成员序列化
  200. if(ar.IsStoring())       //m_Thickness序列化
  201. ar << m_Thickness;
  202. else
  203. ar >> m_Thickness;
  204. }
  205. void CRectRound::Draw(CDC *pDC)
  206. {
  207. CPen Pen, *pOldPen;
  208. //创建并选入画笔
  209. Pen.CreatePen(PS_INSIDEFRAME,m_Thickness,m_Color);
  210. pOldPen = pDC->SelectObject(&Pen);
  211. //选入库存画刷,并保存原来的画刷
  212. CBrush *pOldBrush = (CBrush *)pDC->SelectStockObject(NULL_BRUSH);
  213. int SizeRound = (m_X2 - m_X1 + m_Y2 - m_Y1)/6;//计算圆角尺寸
  214. //绘制圆角矩形
  215. pDC->RoundRect(m_X1, m_Y1, m_X2, m_Y2, SizeRound, SizeRound);
  216. //恢复原来的画笔和画刷
  217. pDC->SelectObject(pOldPen);
  218. pDC->SelectObject(pOldBrush);
  219. }
  220. //CRectRoundFill类的实现代码
  221. IMPLEMENT_SERIAL(CRectRoundFill, CDrawBase, 1)
  222. CRectRoundFill::CRectRoundFill(int X1, int Y1, int X2, int Y2, COLORREF Color)
  223. {
  224. m_X1 = min(X1, X2);
  225. m_Y1 = min(Y1, Y2);
  226. m_X2 = max(X1, X2);
  227. m_Y2 = max(Y1, Y2);
  228. m_Color = Color;
  229. }
  230. void CRectRoundFill::Draw(CDC *pDC)
  231. {
  232. CBrush Brush, *pOldBrush;
  233. CPen Pen, *pOldPen;
  234. //创建并选入画笔和画刷
  235. Pen.CreatePen(PS_INSIDEFRAME, 1, m_Color);
  236. pOldPen = pDC->SelectObject(&Pen);
  237. Brush.CreateSolidBrush(m_Color);
  238. pOldBrush = pDC->SelectObject(&Brush);
  239. int SizeRound = (m_X2 - m_X1 + m_Y2 - m_Y1)/6;//计算圆角尺寸
  240. //绘制填充圆角矩形
  241. pDC->RoundRect(m_X1, m_Y1, m_X2, m_Y2, SizeRound, SizeRound);
  242. //恢复原来的画笔和画刷
  243. pDC->SelectObject(pOldPen);
  244. pDC->SelectObject(pOldBrush);
  245. }
  246. //CCircle类的实现代码
  247. IMPLEMENT_SERIAL(CCircle, CDrawBase, 1)
  248. CCircle::CCircle(int X1, int Y1, int X2, int Y2, COLORREF Color, int Thickness)
  249. {
  250. m_X1 = min(X1, X2);
  251. m_Y1 = min(Y1, Y2);
  252. m_X2 = max(X1, X2);
  253. m_Y2 = max(Y1, Y2);
  254. m_Color = Color;
  255. m_Thickness = Thickness;
  256. }
  257. void CCircle::Serialize(CArchive& ar)
  258. {
  259. CDrawBase::Serialize(ar);//基类数据成员序列化
  260. if(ar.IsStoring())       //m_Thickness序列化
  261. ar << m_Thickness;
  262. else 
  263. ar >> m_Thickness;
  264. }
  265. void CCircle::Draw(CDC *pDC)
  266. {
  267. CPen Pen, *pOldPen;
  268. Pen.CreatePen(PS_INSIDEFRAME, m_Thickness, m_Color);//创建画笔
  269. pOldPen = pDC->SelectObject(&Pen); //选入画笔,并保存原来的画笔
  270. //选入库存画刷,并保存原来的画刷
  271. CBrush *pOldBrush = (CBrush *)pDC->SelectStockObject(NULL_BRUSH);
  272. //绘制圆或椭圆
  273. pDC->Ellipse(m_X1, m_Y1, m_X2, m_Y2);
  274. //恢复原来的画笔和画刷
  275. pDC->SelectObject(pOldPen);
  276. pDC->SelectObject(pOldBrush);
  277. }
  278. //CCircleFill类的实现代码
  279. IMPLEMENT_SERIAL(CCircleFill, CDrawBase, 1)
  280. CCircleFill::CCircleFill(int X1, int Y1, int X2, int Y2, COLORREF Color)
  281. {
  282. m_X1 = min(X1, X2);
  283. m_Y1 = min(Y1, Y2);
  284. m_X2 = max(X1, X2);
  285. m_Y2 = max(Y1, Y2);
  286. m_Color = Color;
  287. }
  288. void CCircleFill::Draw(CDC *pDC)
  289. {
  290. CPen Pen, *pOldPen;
  291. CBrush Brush, *pOldBrush;
  292. //创建并选入画笔和画刷
  293. Pen.CreatePen(PS_INSIDEFRAME, 1, m_Color);
  294. pOldPen = pDC->SelectObject(&Pen);
  295. Brush.CreateSolidBrush(m_Color);
  296. pOldBrush = pDC->SelectObject(&Brush);
  297. //绘制填充圆或椭圆
  298. pDC->Ellipse(m_X1, m_Y1, m_X2, m_Y2);
  299. //恢复原来的画笔和画刷
  300. pDC->SelectObject(pOldPen);
  301. pDC->SelectObject(pOldBrush);
  302. }
  303. //CText类的实现代码
  304. IMPLEMENT_SERIAL(CText, CDrawBase, 1)
  305. CText::CText(int X1, int Y1, int X2, int Y2, COLORREF Color, LOGFONT lf, CString str)
  306. {
  307. m_X1 = min(X1, X2);
  308. m_Y1 = min(Y1, Y2);
  309. m_X2 = max(X1, X2);
  310. m_Y2 = max(Y1, Y2);
  311. m_Color = Color;
  312. m_lf = lf;
  313. m_String = str;
  314. }
  315. void CText::Serialize(CArchive &ar)
  316. {
  317. CDrawBase::Serialize(ar);//基类数据成员序列化
  318. if(ar.IsStoring())       //m_lf和m_String的序列化
  319. {
  320. ar.Write(&m_lf, sizeof(m_lf));
  321. ar << m_String;
  322. }
  323. else 
  324. { ar.Read(&m_lf, sizeof(m_lf));
  325. ar >> m_String;
  326. }
  327. }
  328. void CText::Draw(CDC *pDC)
  329. {
  330. CFont Font, *pOldFont;
  331. //创建并选入字体
  332. Font.CreateFontIndirect(&m_lf);
  333. pOldFont = pDC->SelectObject(&Font);
  334. //设置字体颜色
  335. pDC->SetTextColor(m_Color);
  336. //设置字体背景透明
  337. pDC->SetBkMode(TRANSPARENT);
  338. //输出字体
  339. pDC->TextOut(m_X1, m_Y1, m_String);
  340. //恢复原来的字体
  341. pDC->SelectObject(pOldFont);
  342. }
  343. void CDrawDoc::DeleteContents() 
  344. {
  345. // TODO: Add your specialized code here and/or call the base class
  346. int Index = m_DrawArray.GetSize();
  347. while(Index--)
  348. delete m_DrawArray.GetAt(Index);
  349. m_DrawArray.RemoveAll();
  350. CDocument::DeleteContents();
  351. }
  352. void CDrawDoc::OnEditClearAll() 
  353. {
  354. // TODO: Add your command handler code here
  355. DeleteContents();
  356. UpdateAllViews(NULL);
  357. SetModifiedFlag();
  358. }
  359. void CDrawDoc::OnUpdateEditClearAll(CCmdUI* pCmdUI) 
  360. {
  361. // TODO: Add your command update UI handler code here
  362. pCmdUI->Enable(m_DrawArray.GetSize());
  363. }
  364. void CDrawDoc::OnEditUndo() 
  365. {
  366. // TODO: Add your command handler code here
  367. int Index = m_DrawArray.GetUpperBound();
  368. if(Index > -1)
  369. {
  370. delete m_DrawArray.GetAt(Index);
  371. m_DrawArray.RemoveAt(Index);
  372. }
  373. UpdateAllViews(NULL);
  374. SetModifiedFlag();
  375. }
  376. void CDrawDoc::OnUpdateEditUndo(CCmdUI* pCmdUI) 
  377. {
  378. // TODO: Add your command update UI handler code here
  379. pCmdUI->Enable(m_DrawArray.GetSize());
  380. }