VC++程序设计实验报告一、 实验目的掌握MFC编程二、 实验内容用MFC向导创建单文档应用程序,一个简朴的画图程序n 使用C++语言实现n 使用VC++6.0集成开发环境开发n 使用MFC应用程序开发框架三、实验环节n 基本功能描述 1. 打开exe文献,在绘图下拉菜单中可分别设立绘制的图形形状,如直线、曲线、矩形及椭圆,线宽选项,有1-6可供选择,线型选项有实线、虚线、点线和点段线供设立,还可以设立线色以及填充色,通过弹出的颜色对话框选择需要的颜色,假如不选择线宽、线色以及填充色,则按默认的画笔,画刷来绘制选择的图形 2. 选择好图形后,通过鼠标可以绘制出相应的直线,矩形或椭圆,鼠标的按下拟定图形的起点,鼠标的拖动则拟定了图形的终点,即通过鼠标的拖动来决定图形的大小,当鼠标弹起,此图形则绘制完毕n 设计思绪 1. 对需要用到的变量进行初始化 2. 选择相应的图形之后就响应相应的消息解决函数,给shape赋相应的值选择不同的线宽,线色与填充色,即可改变画笔或画刷的属性 3. 鼠标的按下响应函数OnLButtonDown(),捕获鼠标当前位置得到起点的坐标,鼠标的拖动响函数OnMouseMove()改变终点的坐标,鼠标的弹起响应OnLButtonUp(),拟定终点坐标,刷新,得到绘制图形。
4. 选择图形或其它属性,可进行下一次绘制n 软件设计A 设计环节 1.创建单文档 创建一个MFC AppWizard[exe]工程,命名为“Draw”,如图1所示,并创建单文档,如图2所示创建成功后,系统自动生成相应的类,如图3所示图1 创建工程图2 创建单文档图3 生成类2.编辑菜单添加需要的菜单项,如图4所示;并在菜单的属性中设定好所相应的ID,如图5所示,各项菜单相应的ID如表1所示(其中线宽菜单为弹出菜单,只需在菜单项目属性中的弹出选项前打勾即可,分隔线亦只需在菜单项目属性中选中分隔符选项即可)图4 添加菜单项图5 设立菜单ID表1 菜单项相应ID菜单名ID菜单名ID菜单名ID直线ID_LINE线宽1ID_W1实线ID_SOLID矩形ID_RECT线宽2ID_W2虚线ID_DASH椭圆ID_ELLIPSE线宽3ID_W3点线ID_DOT颜色ID_COLOR线宽4ID_W4点段线ID_DASHDOT填充色ID_FILLCOLOR线宽5ID_W5 建立类向导,在视图类CDrawView中,对各菜单项添加相应的COMMAND消息解决函数,部分菜单项还添加相应的UPDATE_COMMAND_UI消息函数,如图6所示。
图6 建立类向导 3.在相应消息函数处添加代码,实现其功能建立类向导,在视图类CDrawView中,添加WM_PAINT消息,以及WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE消息,并在其中添加相应的代码B 关键功能实现 1.选择要绘制的图形在直线、矩形以及椭圆的消息解决函数里为shape分别赋值为1,2,3,在OnPaint()函数里添加3个if语句的代码来这实现这三个图形的绘制:当选择画直线时,shape=1,则执行绘制直线代码,当选择画矩形时,shape =2,则执行绘制矩形的代码,当性选择画椭圆时,shape=3,则执行绘制椭圆的代码2.改变线宽在OnPaint()创建的画笔中,pen.CreatePen(penstyle,w, m_nColor),线宽处用w表达,则改变w的值即改变了画笔的粗细选择菜单绘图→线宽选择划线宽度值,此时所选的线宽值就赋给线宽变量w若不选择线宽值,则w=1(即默认线宽值为1)3.改变线型 在OnPaint()创建的画笔中,pen.CreatePen(penstyle,w, m_nColor),线型处用penstyle表达,则改变penstyle的值即改变了画笔的类型。
选择菜单绘图→线型选择线型,此时所选的线型就赋给线型变量penstyle若不选择线型值,则penstyle=ID_SOLID(即默认线型为实线)4.改变线色 在OnPaint()创建的画笔中,pen.CreatePen(penstyle,w, m_nColor),线的颜色处用m_nColor表达,则改变m_nColor即改变了画笔的颜色选择菜单绘图→颜色,会弹出通过WM_COLORREF从系统中引入的颜色选择对话框,选择颜色后,点击拟定则相应颜色值就赋给变量m_nColor,此时画笔的颜色就会发上变化若不选择颜色,则默认(线)颜色为黑色4.改变填充色 在OnPaint()创建的画刷中,brush.CreateSolidBrush(m_fColor),颜色就是用m_fColor表达的,改变m_fColor即改变了画刷的颜色选择菜单绘图→填充色,会弹出通过WM_COLORREF从系统中引入的颜色选择对话框,选择颜色后,点击拟定则相应颜色值就赋给变量m_fColor,此时画刷的颜色就会发上变化若不选择颜色,则默认填充色为黑色5.绘制图形鼠标左键按下,则捕获鼠标此时的位置坐标为画图的起点,此时在OnLButtonDown()函数里,将捕获的坐标值赋给定义作为起点的变量opoint;按下鼠标左键拖动鼠标时,捕获鼠标当前位置坐标值为终点坐标值,此时在OnMouseMove()函数里,把捕获的坐标值赋给定义作为终点的变量cpoint,OnPaint()中绘图的代码中的坐标都得到了,进行绘图;鼠标左键弹起时,此时绘图结束,鼠标弹起时所在位置就是画图的最终终点位置,画图结束后,刷新窗口,以便重新画图,此时执行的是OnLButtonUp()函数。
四、 结果及源代码4.1 运营结果1.点击链接,编译,运营后的窗口如图7所示图7 运营结果4.2 程序代码1.在视图类构造函数中对各定义变量初始化CDrawView::CDrawView(){ w=1;//初始状态时线宽 shape=1;//初始状态时形状 m_nColor=RGB(0,0,0);//初始状态时线色 m_fColor=RGB(0,0,0);//初始状态时填充色 penstyle=PS_SOLID;//初始化线型为实线}2.形状函数void CDrawView::OnLine() { shape=1;}void CDrawView::OnRect() { shape=2;}void CDrawView::OnEllipse() { shape=3;}3.线宽改变函数void CDrawView::OnW1() { w=1; }void CDrawView::OnW2() { w=2;}void CDrawView::OnW3() { w=3;}void CDrawView::OnW4() { w=4;}void CDrawView::OnW5() { w=5;}void CDrawView::OnW6() { w=6; }4. 线型选择函数void CDrawView::OnSolid() { penstyle=PS_SOLID; }void CDrawView::OnDash() { penstyle=PS_DASH; }void CDrawView::OnDot() { penstyle=PS_DOT;}void CDrawView::OnDashdot() { penstyle=PS_DASHDOT; }5. 颜色选择函数void CDrawView::OnColor() { CColorDialog Color;//创建颜色对话框 if(Color.DoModal()==IDOK)//假如用户点击OK按钮 { m_nColor=Color.GetColor();//更改颜色,把颜色赋到m_nColor }}6. 填充色选择函数void CDrawView::OnFullcolor() { CColorDialog FullColor;//创建颜色对话框 if(FullColor.DoModal()==IDOK)//假如用户点击OK按钮 { m_fColor=FullColor.GetColor();//更改颜色,把颜色赋到m_nColor } }7. 单击、移动、绘画函数void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) { m_Down=TRUE; //鼠标按下 SetCapture(); //获取坐标 opoint=point; //把鼠标所在坐标赋给起点坐标opoint ReleaseCapture(); //释放坐标 CView::OnLButtonDown(nFlags, point);}void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) { m_Down=FALSE; //鼠标不按下,即弹起 Invalidate(0); //刷新 CView::OnLButtonUp(nFlags, point);}void CDrawView::OnMouseMove(UINT nFlags, CPoint point) { if(m_Down) //假如鼠标按下 { cpoint=point; //把鼠标所在点坐标赋给终点坐标cpoint CClientDC dc(this); if(4==shape)//画曲线 { CPen pen(PS_SOLID,10,RGB(255,0,0)); CPen *oldpen=dc.SelectObject(&pen); dc.MoveTo(opoint); dc.LineTo(cpoint); dc.SelectObject(oldpen); opoint=cpoint; } } CView::OnMouseMove(nFlags, point);}void CDrawView::OnPaint() { CPaintDC dc(this); // device context for painting CPen pen; //定义画笔 CBrush brush; //定义画刷 pen.CreatePen(penstyle,w, m_nColor); //创建画笔 brush.CreateSolidBrush(m_fColor); //创建画刷 dc.SelectObject(&pen); //获取画笔 dc.SelectObject(&brush); //获取画刷 if(1==shape)//画直线 { dc.MoveTo(opoint.x,opoint.y); dc.。