1、二维绘图工具文档xjh 实验报告计算机图形学实验大作业 课程名称 计算机图形学 实验名称 二维绘图与计算机动画 姓 名 学 号 专业班级 成 绩 指导教师 二维绘图工具文档说明目录1简介 1.1基本绘图功能- 1.2附加功能-2程序代码实现 2.0设计的实现曲线对话框等的类- 2.1鼠标左键按下消息响应函数- 2.2鼠标左键弹起消息响- 2.3鼠标移动消息响应函数- 2.4鼠标右键按下消息响应函数-2.5选择绘画类型消息相应函数- 2.6画直线线函数- 2.7画有向箭头的函数- 2.8画长方形函数- 2.9画圆函数- 2.10画椭圆函数- 2.11点击“撤消” 消息响应函数- 2.12点击“清
2、空”消息响应函数- 2.13点击“设置线宽线形”消息响应函数- 2.14点击“设置颜色”消息响应函- 2.15点击“设置字体”消息响应函数- 2.16点击“打开bmp格式测试文件”消息响应函数-3程序的运行结果3.1启动图片-3.2打开的测试图片-3.3运行程序界面-4总结 4.1 程序的问题和缺陷-4.2通过这次编写程序的认知和感触-1简介 使用VC开发平台,MFC框架实现一个画图程序,尽可能多的实现Windows自带的画图功能,并扩展其功能。在视图类中完成图形的绘制,显示,重绘,清空,撤消,设置画笔,设置字体,打开bmp图片。在文档类保存了,画笔的信息。1.1基本绘图功能:1) 用鼠标可以
3、绘制图形,包括一下几种:直线,带箭头的线,任意线,圆形,椭圆,矩形。2) 可以对画笔进行设置:画笔的颜色,画笔的线宽,画笔的形状。3) 可以保存所有的图形到内存中,所有图形绘制后,拉动窗口发生重绘不改变。4) 可以将所有绘制的图形保存到文件中,并且可以读取。5) 可以“新建”空白绘图文档。6) 可以查看最近打开的文档。7) 可以打印用户绘制好后的图形,打印预览你绘制的图形。8) 可以完成一部分的“撤消”功能,1.2附加功能:(1) 应用程序的标题栏上有程序的图标。(2) 可选择打开或关闭工具栏。(3) 可以打开一些文件中放的测试图片。、(4) 有一个开机启动画面。(5)有个绘图工具栏。2程序实
4、现的主要代码/实现文件IMPLEMENT_SERIAL( CGraph, CObject, 1 )/文档串行化的 宏定义DECLARE_SERIAL( CGraph )CGraph:CGraph()CGraph:CGraph(UINT DrawIndex,CPoint FirstPoint,CPoint SecondPoint,COLORREF color,UINT LineWidth,int LineStyle)/5 this-m_DrawIndex = DrawIndex; this-m_FirstPoint = FirstPoint; this-m_SecondPoint= Second
5、Point; this-m_color = color; this-m_nLineStyle = LineStyle; this-m_nLineWidth = LineWidth;CGraph:CGraph()void CGraph:Draw(CDC *pDC)/CGraph m_DrawIndex CPen hpen(m_nLineStyle,m_nLineWidth,m_color); CBrush *pBrush = CBrush:FromHandle(HBRUSH)GetStockObject(NULL_BRUSH); CBrush *pOldBrush = pDC-SelectObj
6、ect(pBrush); switch(m_DrawIndex) case 1: pDC-SelectObject(&hpen); pDC-MoveTo(m_FirstPoint); pDC-LineTo(m_SecondPoint); break; case 2: break; case 3: float flRlt; flRlt=(float)(m_FirstPoint.x-m_SecondPoint.x)*(m_FirstPoint.x-m_SecondPoint.x)+(m_FirstPoint.y-m_SecondPoint.y)*(m_FirstPoint.y-m_SecondPo
7、int.y); flRlt=sqrt(flRlt); if(flRlt = 0) return; float flLength = 15; float flAngle = 100;/ float tmpX = (float)(m_SecondPoint.x) + (float)(m_FirstPoint.x)-(float)(m_SecondPoint.x)*flLength/flRlt; float tmpY = (float)(m_SecondPoint.y) + (float)(m_FirstPoint.y)-(float)(m_SecondPoint.y)*flLength/flRlt
8、; float fl1X = (tmpX-(float)(m_SecondPoint.x)*cos(-flAngle/2) - (tmpY-(float)(m_SecondPoint.y)*sin(-flAngle/2) + (float)(m_SecondPoint.x); float fl1Y = (tmpY-(float)(m_SecondPoint.y)*cos(-flAngle/2) + (tmpX-(float)(m_SecondPoint.x)*sin(-flAngle/2) + (float)(m_SecondPoint.y); float fl2X = (tmpX-(floa
9、t)(m_SecondPoint.x)*cos(flAngle/2) - (tmpY-(float)(m_SecondPoint.y)*sin(flAngle/2) + (float)(m_SecondPoint.x); float fl2Y = (tmpY-(float)(m_SecondPoint.y)*cos(flAngle/2) + (tmpX-(float)(m_SecondPoint.x)*sin(flAngle/2) + (float)(m_SecondPoint.y); pDC-SelectObject(&hpen); pDC-MoveTo(m_FirstPoint); pDC
10、-LineTo(m_SecondPoint); pDC-MoveTo(m_SecondPoint.x,m_SecondPoint.y); pDC-LineTo(fl1X,fl1Y); pDC-MoveTo(m_SecondPoint.x,m_SecondPoint.y); pDC-LineTo(fl2X,fl2Y); pDC-MoveTo(fl1X,fl1Y); pDC-LineTo(fl2X,fl2Y); break; case 4: pDC-SelectObject(&hpen); pDC-Ellipse(CRect(m_FirstPoint,m_SecondPoint); pDC-Sel
11、ectObject(pOldBrush); break; case 5: pDC-SelectObject(&hpen); pDC-Ellipse(CRect(m_FirstPoint,m_SecondPoint); pDC-SelectObject(pOldBrush); break; case 6: pDC-SelectObject(&hpen); pDC-Rectangle(CRect(m_FirstPoint,m_SecondPoint); pDC-SelectObject(pOldBrush); break; void CGraph:Serialize(CArchive &ar)/C
12、Archive / if(ar.IsStoring() arm_DrawIndexm_FirstPointm_SecondPointm_colorm_nLineWidthm_DrawIndexm_FirstPointm_SecondPointm_colorm_nLineWidthm_nLineStyle; /任意曲线类class CStroke : public CObject/public: CStroke(UINT nPenWidth,COLORREF color);protected: CStroke(); DECLARE_SERIAL(CStroke)/ Attributesprote
13、cted: UINT m_nPenWidth; / one pen width applies to entire stroke COLORREF m_color; /颜色public: CArray m_pointArray; / series of connected points/ Operationspublic: BOOL DrawStroke(CDC* pDC);public: virtual void Serialize(CArchive& ar);实现文件CStroke.cppIMPLEMENT_SERIAL(CStroke, CObject, 2)CStroke:CStrok
14、e() / This empty constructor should be used by serialization onlyCStroke:CStroke(UINT nPenWidth,COLORREF color) m_nPenWidth = nPenWidth; m_color = color;void CStroke:Serialize(CArchive& ar) if (ar.IsStoring() ar (WORD)m_nPenWidth w m_color; m_nPenWidth = w; m_pointArray.Serialize(ar); BOOL CStroke:D
15、rawStroke(CDC* pDC) CPen penStroke; if (!penStroke.CreatePen(PS_SOLID, m_nPenWidth, m_color) return FALSE; CPen* pOldPen = pDC-SelectObject(&penStroke); pDC-MoveTo(m_pointArray0); for (int i=1; i LineTo(m_pointArrayi); pDC-SelectObject(pOldPen); return TRUE;/线形状和线宽设置对话框类class CSettingDlg : public CD
16、ialogpublic: CSettingDlg(CWnd* pParent = NULL); /AFX_DATA(CSettingDlg) enum IDD = IDD_DIALOG1 ; UINT m_nLineWidth; /线宽 int m_nLineStyle; /线形状 COLORREF m_color; /线的颜色 /AFX_DATA/ Overrides / ClassWizard generated virtual function overrides /AFX_VIRTUAL(CSettingDlg) protected: virtual void DoDataExchan
17、ge(CDataExchange* pDX); / DDX/DDV support /AFX_VIRTUALprotected: / Generated message map functions /AFX_MSG(CSettingDlg) afx_msg void OnPaint(); /AFX_MSG DECLARE_MESSAGE_MAP();实现文件CSettingDlg.cppCSettingDlg:CSettingDlg(CWnd* pParent /*=NULL*/) : CDialog(CSettingDlg:IDD, pParent) /AFX_DATA_INIT(CSett
18、ingDlg) m_nLineWidth = 0; m_nLineStyle = -1; /AFX_DATA_INITvoid CSettingDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MAP(CSettingDlg) DDX_Text(pDX, IDC_EDIT2, m_nLineWidth); DDX_Radio(pDX, IDC_RADIO1, m_nLineStyle); /AFX_DATA_MAPBEGIN_MESSAGE_MAP(CSettingDlg, CDialog
19、) /AFX_MSG_MAP(CSettingDlg) ON_WM_PAINT() /AFX_MSG_MAPEND_MESSAGE_MAP()/ CSettingDlg message handlersvoid CSettingDlg:OnPaint() /这里添加了代码 用于对话框的示例显示 CPaintDC dc(this); / device context for painting / TODO: Add your message handler code here UpdateData(); CPen pen(m_nLineStyle,m_nLineWidth,m_color);/定
20、义画笔 dc.SelectObject(&pen); CRect rect;/定义矩形区域 GetDlgItem(IDC_STATIC1)-GetWindowRect(&rect);/得到示例静态空间的矩形区域 ScreenToClient(&rect);/坐标转换 dc.MoveTo(rect.left+20,rect.top+rect.Height()/2); dc.LineTo(rect.right-20,rect.top+rect.Height()/2); / Do not call CDialog:OnPaint() for painting messages/添加成员变量CTool
21、Bar m_newToolBar 一个新的绘图工具栏/在CMainFrame中的OnCreat()函数中添加的代码:CSplashWnd:ShowSplashScreen(this);/启动画面Sleep(1000);/程序暂停/-新建画图工具栏-/if (!m_newToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) | !m_newToolBar.LoadToolBar(ID
22、R_DRAW_TOOLBAR) TRACE0(Failed to create toolbarn); return -1; / fail to create m_newToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_newToolBar);CMFCDoc.h中public: virtual CMFCDoc(); CPen m_penCur; / pen created according to CTypedPtrList m_strokeList; UINT m_nPen
23、Width; / current user-selected pen width COLORREF m_color; /颜色 CPen* GetCurrentPen(); CStroke* NewStroke(); void InitDocument(); /初始化任意曲线的画笔 void DeleteContents();/删除任意曲线 BOOL OnOpenDocument(LPCTSTR lpszPathName);CMFCDoc.cpp中CStroke* CMFCDoc:NewStroke()/newStroke POSITION pos = GetFirstViewPosition(
24、); CMFCView *pView = (CMFCView*)GetNextView(pos); /获取视类的指针 /获取视类的画笔宽度和颜色 m_nPenWidth = pView-m_nLineWidth; m_color = pView-m_color; CStroke* pStrokeItem = new CStroke(m_nPenWidth,m_color); m_strokeList.AddTail(pStrokeItem); SetModifiedFlag(); / Mark the document as having been modified, for / purposes of confirming File Close. return pStrokeItem;BOOL CMFCDoc:OnNewDocument()/新建空白文档 if (!CDocument:OnNewDocument() return FALSE; / TODO: add reinitialization code here / (SDI documents will reuse this document) /新建空白文档就是把当前的数据全部删除掉 POSITION pos = GetFirstViewPositi
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1