mfc简单绘图程序报告
vc++基于mfc简单绘图
利用MFC简单绘图实验报告一、实验目的1、了解学会VC++ 6.0集成环境操作界面的使用;2、使用MFC进行可视化的编程;3、能够以交互方式在图形绘制区绘制点、直线、矩形、椭圆;4、设置线条的颜色、线型和线条宽度,对绘制的图元进行线条和填充属性的修改;二、简单的功能介绍1、画点:通过Ondot()函数实现2、画直线:通过OnLine()函数实现。
3、画矩形:通过OnRectangle()函数实现。
4、画圆角矩形:通过OnRoundrect()函数实现。
5、画椭圆:通过OnEllipse()函数实现。
6、铅笔工具:可以画任意线条。
通过直接在OnMouseMove(UINT nFlags, CPoint point)函数里面添加代码实现。
7、右键弹出菜单:可以在客户中点击鼠标右键,快速选择常用菜单。
通过OnContextMenu函数实现。
8、状态栏显示鼠标移动的坐标:在程序的右下角显示,通过调用setWidnowTextGetParent()实现。
9、画图颜色选择:可以画任何颜色的线条,通过OnColor()函数实现。
10、线条类型及线宽的设置:可以将画出的线条设置成实线、虚线、点线、点划线,双点划线,还可以设置线条的粗细,通过实例这一功能立刻显示所选择线条的粗细及线型。
通过新建CLineSettingDlg类,其中OnSelchangeLineStyle()函数实现线型的OnChangeEditLineWidth()函数实现线宽的改变。
再在CDrawView类中调用OnLineSetting()函数实现画笔的对话框,CLineSettingDlg类中的OnPaint()函数是实现示例功能的。
11、窗口的重绘时不擦除原来的内容:新建CShape类用来保存线条的颜色,线宽,填充色等属性,在窗口大小发生变化时有OnDraw(CDC* pDC)函数进行重绘工作,重绘中调用了各个绘图函数的Draw(CDC *pDC)函数。
mfc简单绘图程序报告
mfc简单绘图程序报告简单绘图程序1 需求说明1.1 问题描述设计一个简单的绘图应用程序,可以绘制图形或自由绘制线段,可以更改颜色、画笔粗细、保存文件。
1.2功能说明1.图形绘制功能:直线、椭圆、矩形。
在菜单栏中选择需要的图形(也可以通过工具栏中选择)用鼠标便能在视图中绘出相应的图形。
2.可以绘制自由线段3.对图形的操作:能通过菜单栏弹出对话框选择线宽、自定义颜色,也可以擦除绘制的线段。
4.可以保存绘图文件,保存后打开可以继续绘制。
2.1.3 数据说明在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以便随后的绘图操作使用。
在CDzyView类中添加一个私有变量xz;用来保存用户的选择(直线、矩形、椭圆、自由绘图)在绘制时都可有两点来确定其图形。
当鼠标左击时得到一个点,当鼠标停止移动时得到另外一个点。
为视图类CDzyView分别捕获鼠标左键按下和弹起这两个消息。
当鼠标左键按下时,需要将鼠标当前按下点保存至sx、sy,在鼠标移动停止后,将当前坐标保存至ex,ey.其他主要数据说明:int fd 判断是否为自由绘图模式int w 线宽int R RGB中的Rint G RGB中的Gint B RGB中的BCGraph类中int m_nType:保存后重绘时用户的选择int qdx; 重绘起点xint qdy; 重绘起点yint zdx; 重绘终点xint zdy; 重绘终点yCLine类中int cx; 重绘线宽int sx; 重绘起点xint sy; 重绘起点yint zx; 重绘终点xint zy; 重绘终点yint w; 重绘线宽自定义颜色对话框关联变量:IDC_EDIT_RED int m_RedIDC_EDIT_GREEN int m_GreenIDC_EDIT_BLUE int m_BlueIDC_SCROLL_RED CScrollBar m_SredIDC_SLIDER_GREEN CSliderCtrl m_SgreenIDC_SPIN_BLUE CSpinButtonCtrl m_Sblue2 分析、设计与实现2.1 主要功能设计与实现2.1.1 有关文档视图功能的设计与实现单文档结构可序列化的类CGraph从CObject派生可序列化的类CLine从CObject派生对话框类zdyyanse从CDialog派生2.1.2 有关消息处理的设计与实现方案:需要响应的消息应有:鼠标移动、鼠标左键按下、鼠标左键抬起、菜单栏中的画矩形、画直线、画椭圆、自由绘图、更多选项中的自定义颜色、工具栏中的红色、蓝色、绿色、线宽1、线宽2、线宽3、橡皮擦。
MFC绘图程序实验报告
《面向对象课程设计》实验报告题目学生姓名学号专业班级指导老师20 年1月画图软件一.实验要求该程序设计是用MFC开发绘图软件。
此绘图软件可进行自由绘图和画规定图形,并能对图形进行颜色笔宽的编辑。
同时增加了添加背景与打开绘图文件的功能。
这个程序除了一般的绘制图形功能外还增加了自定义背景功能,使得用户可以简单便捷的进行切换背景操作,以达到美观的效果。
在背景上画图更加直接与便捷。
二、实验程序设计及结构1、需求分析(功能、类、成员)这个程序需要实现自由绘图的功能,并能绘制规定图形且能为图形变换颜色与笔宽。
其中主要在Cview类下进行操作。
其中成员函数有:afx_msg void Onfromfile(); //打开视图文件afx_msg void Onwidth2(); //设置笔宽2afx_msg void Oncolour(); //选择颜色afx_msg void OnLButtonDown(UINT nFlags, CPoint point); //鼠标按下操作afx_msg void OnLButtonUp(UINT nFlags, CPoint point); //鼠标弹起操作afx_msg void OnMouseMove(UINT nFlags, CPoint point); //鼠标移动操作afx_msg void Onwidth3(); //设置笔宽3afx_msg void Onwidth4(); //设置笔宽10afx_msg void rect(); //画矩形afx_msg void cricle() //画圆afx_msg void selfdraw(); //自由绘图成员变量有:CString filename;COLORREF m_color;int m_penwidth;short m_show_type;bool m_flag;bool m_isbuttondown;CPoint m_oldpoint;int m_draw_type;CPoint m_draw_originpt;CPoint m_draw_oldpt;设计结构(包括总体结构和数据结构)i)总体结构程序有五个菜单项,选择颜色、选择笔宽、画规定图形、自由绘图、插入背景。
MFC实现简单画图形程序
《MFC编程及应用》课程设计报告题目:简单画图形程序学号:姓名:指导老师:时间:程序设计步骤:一、建立基于对话框的应用程序框架;二、CMy0910200155Dlg类中关键新增变量的作用:CPtrArray pta; //用于保存已绘图形的相关信息。
CMemoryNode *pmN; //指向CMemoryNode类的指针,程序运行过程中动态保存对象信息。
CMemoryNode *pmn; //指向CMemoryNode类的指针,从文件中读取信息时动态创建类的对象。
COLORREF m_CurrentBrushColor; //用于存放当前画刷的颜色。
COLORREF m_CurrentPenColor; //用于存放当前画笔的颜色。
int num; //用于存放从"Index.txt"文件中读取的数字。
int flag=0; //用于标识:当为1时,表示按下了”画图”按钮;当为2时,表示按下了”撤消”按钮;当为3时,表示按下了”加载历史”按钮,则从文件中读取信息。
int mark; //用于标识:当为0时,表示刚画过矩形;当为1时,表示刚画过圆角矩形;当为2时,表示刚画过椭圆。
int index; //用于存放pta数组的容量。
int flag1=0; //用于标识,和flag搭配,用来处理多种情况下的窗口重绘问题。
int ButtonState=0; //用于标识,是类CShow和类CMy0910200155Dlg的一个接口,通过其值在1和0之间转换,来处理弹出式对话框的初次绘制和移动时的重绘问题。
三、CMemoryNode类中变量的作用:COLORREF BrushColor;COLORREF PenColor;int Mark; //以上三者为类CMemoryNode的成员变量,分别用来保存绘图时画刷颜色,画笔颜色和形状。
四、与控件相关联的变量:CComboBox m_BrushColor; //指示画刷颜色组合框。
画图程序设计报告(MFC)
Windows程序设计课程设计报告班级:计本08-1班姓名:X X学号:XXXXXXXXX指导老师:2010-11-29目录1 引言 (3)1.1 课题背景 (3)1.2 课程设计目的 (3)2 功能说明 (3)3 系统的实现 (4)3.1 视图设计 (4)3.2 编辑资源 (4)3.3 编程思路及各个函数的实现 (5)4程序功能的测试 (7)4.1测试的研究与选择 (7)4.2 测试环境 (7)5.3 实例测试结果 (7)5学习的总结 (9)6参考文献 (10)摘要:本课程设计实现的是画椭圆、矩形、直线和随手画功能等。
这个画图小程序实现了简单的画图功能,具有简洁大方的图文外观。
它的设计按软件工程的方法进行,系统具有良好的界面、必要的交互信息和简易的菜单进行操作。
即时准确地获得需要的画图的工具,适合休闲娱乐和简单的画画,对人们的生活有一定的帮助。
在课程设计中,系统开发平台为WindowsXP,程序设计设计语言采用Visual C++,在程序设计中,采用了结构化与面向对象两种解决问题的方法。
关键词:程序设计;画图;MFC;画图函数Ellipse()Restangle()1 引言1.1 课题背景本课程设计主要在生活中的娱乐,可以在本程序上进行简单的绘图娱乐。
画图是日常生活中有效的工具,能实现简单的画图。
本程序是在VC6.0中使用AppWizard创建基于对话框的应用程序。
1.2 课程设计目的画图的实现,通过C++语句实现。
在视图中实现画线功能,更好的了解MFC、C++等面向对象语言的设计和实现,运用自己所学的一些知识来实现其运用到现实的实践中,从而做到学而有用。
2 功能说明本程序可以实现的功能如下:1.运行程序后单击“编辑”菜单,选择“画矩形”后,用鼠标就可以在视图中画出一个矩形。
2.选择“画椭圆”,用鼠标就可以在视图中画出一个椭圆。
3.选择“画直线”,用鼠标就可以在视图中画出一条直线。
4.选择“随手画”,用鼠标就可以在试图中随手画画。
实验四 MFC图形绘制编程实验
实验四 MFC图形绘制编程实验一、实验目的(1) 熟悉Visual C++ 6.0开发环境;(2) 掌握MFC消息映射的操作步骤;(2) 掌握MFC图形输出的方法;(3) 理解设备环境、画笔、画刷的概念,掌握常用的绘图函数。
二、实验内容请编写程序,要求如下:(1) 定义一支黄色画笔,绘制一条线段;(1) 定义一支紫色画笔,绘制一条多段线;(3) 定义一支红色画笔,绘制一个正方形,并用适当的画刷填充图形内部;(4) 定义一支绿色画笔,绘制一个圆,并用适当的画刷填充图形内部;(5) 定义一支蓝色画笔,绘制一个正六边形,并用适当的画刷填充图形内部。
三、实验报告1.列出图形绘制程序代码清单:(1)在头文件Demo.h中:#include "afxwin.h"class CDemoWnd:public CFrameWnd{public:CDemoWnd();~CDemoWnd();public:LRESULT OnPaint(WPARAM wParam,LPARAM lParam);DECLARE_MESSAGE_MAP()public:int m_nX0;int m_nY0;int m_nX1;int m_nY1;};class CDemoApp:public CWinApp{public:BOOL InitInstance();};CDemoApp ThisApp;(2)在源文件Demo.cpp中:#include "tpd1.h"CDemoWnd::CDemoWnd(){m_nX0 = 0;m_nY0 = 0;m_nX1 = 0;m_nY1 = 0;}CDemoWnd::~CDemoWnd(){}BEGIN_MESSAGE_MAP(CDemoWnd,CFrameWnd)ON_MESSAGE(WM_PAINT,OnPaint)END_MESSAGE_MAP()LRESULT CDemoWnd::OnPaint(WPARAM wParam,LPARAM lParam) {CPaintDC dc(this);CPen Pen1,*pOldPen1;Pen1.CreatePen(PS_SOLID,10,RGB(255,255,0));pOldPen1=dc.SelectObject(&Pen1);dc.SelectObject(&Pen1);dc.MoveTo(10,10);dc.LineTo(100,100);CPen Pen2,*pOldPen2;Pen2.CreatePen(PS_SOLID,4,RGB(255,0,255));pOldPen2=dc.SelectObject(&Pen2);dc.SelectObject(&Pen2);POINT pt1[]={{100,10},{10,180},{200,150}};dc.Polyline(pt1,3);CPen Pen3,*pOldPen3;dc.SelectStockObject(BLACK_BRUSH);Pen3.CreatePen(PS_SOLID,4,RGB(255,0,0));pOldPen3=dc.SelectObject(&Pen3);dc.SelectObject(&Pen3);dc.Rectangle(300,50,400,150);CPen Pen4,*pOldPen4;dc.SelectStockObject(GRAY_BRUSH);Pen4.CreatePen(PS_SOLID,4,RGB(0,255,0));pOldPen4=dc.SelectObject(&Pen4);dc.SelectObject(&Pen4);dc.Ellipse(500,200,700,400);CPen Pen5,*pOldPen5;Pen5.CreatePen(PS_SOLID,4,RGB(0,0,255));pOldPen5=dc.SelectObject(&Pen5);dc.SelectStockObject(DKGRAY_BRUSH);dc.SelectObject(&Pen5);POINT pt2[]={{250,250},{400,250},{475,379},{400,509},{250,509},{175,379}};dc.Polygon(pt2,6);return 0;}BOOL CDemoApp::InitInstance(){CDemoWnd *pMainWnd = new CDemoWnd();pMainWnd->Create(NULL,"Demo Mini-MFC");pMainWnd->ShowWindow(m_nCmdShow);pMainWnd->UpdateWindow();m_pMainWnd = pMainWnd;return TRUE;}2、程序运行结果:3、总结在MFC 程序中绘制图形的基本操作步骤:(1)获取图形设备接口。
MFC 一个简单的绘图程序
MFC 一个简单的绘图程序涉及到的知识点:1. 鼠标信息的处理,2. 文档和视图的关系,3. 新建一个类及其使用方法的技巧,4. 改变窗口大小或者刷新窗口后原来所绘制的图形没有显示出来的问题。
绘制图形的原理:鼠标被用作画笔,绘图过程中要进行不同的鼠标消息的处理,如按下鼠标,移动鼠标和释放鼠标。
当用户按下鼠标左键是必须记录鼠标当前的位置,并捕获鼠标,设置光标形状;当移动鼠标时,先判断鼠标左键是否同时被按住,如果是则从上一个鼠标位置到当前鼠标位置绘制一条直线。
并保存当前鼠标位置点,供绘制下一段直线用,当释放鼠标左键时将鼠标释放给系统。
一、简单绘图程序程序的实现1.使用MFC AppWizard 应用程序向导创建一个SDI应用程序MyDraw,在视图类CMyDrawView.h中添加如下代码:protected: // create from serialization onlyCMyDrawView();DECLARE_DYNCREATE(CMyDrawView)CPoint m_ptOrigin; //起始点坐标bool m_bDragging; //鼠标是否处于拖拽状态标记HCURSOR m_hCross;//拖拽状态时鼠标的样式2. 在构造函数中对拖拽标记和鼠标样式进行初始化CMyDrawView::CMyDrawView(){// TODO: add construction code herem_bDragging=false;//初始化为falsem_hCross=AfxGetApp()->LoadStandardCursor(IDC_CROSS);//十字光标}3. 使用类向导为视图类添加按下鼠标左键,移动鼠标,释放鼠标左键的消息处理函数。
代码分别为:void CMyDrawView::OnLButtonDown(UINT nFlags, CPoint point) //按下鼠标左键{// TODO: Add your message handler code here and/or call default SetCapture();::SetCursor(m_hCross);m_ptOrigin=point;m_bDragging=true;CView::OnLButtonDown(nFlags, point);}void CMyDrawView::OnLButtonUp(UINT nFlags, CPoint point) //释放鼠标左键{ // TODO: Add your message handler code here and/or calldefault if(m_bDragging){m_bDragging=false;ReleaseCapture();}CView::OnLButtonUp(nFlags, point);}void CMyDrawView::OnMouseMove(UINT nFlags, CPoint point) //移动鼠标{// TODO: Add your message handler code here and/or callif(m_bDragging){//CMyDrawDoc * pDoc=GetDocument();//ASSERT_VALID(pDoc);//pDoc->AddLine(m_ptOrigin,point);CClientDC dc(this);dc.MoveTo(m_ptOrigin);dc.LineTo(point);m_ptOrigin=point;}CView::OnMouseMove(nFlags, point);}4.在MyDraw.CPP中设置窗口标题m_pMainWnd->SetWindowText("简单的绘图程序");此后,编译、链接,运行程序后可以将鼠标当作一个画笔绘制曲线了。
MFC画简单点线面界面实验报告
CView::OnLButtonDblClk(nFlags, point);
}
调试→运行→成果图:
→添加头文件#include“point.h”和#include <vector>→
加入代码:
public:
enum{
DONOTHING,
POINT,
LINESTRING,
POLYGON
};
protected:
void addPoint(const CPoint& pt);
void addLinestring(const std::vector<gis::Point>& pts);
if (mCurrentOperation==POINT) {
}else if (mCurrentOperation==LINESTRING) {
mPoints.push_back(gis::Point(point.x,point.y));
}else if (mCurrentOperation==POLYGON) {
{
gis::Point *pt;
gis::LineString *ls;
gis::Polygon *pg;
if( pt = dynamic_cast<gis::Point*>(geo) ){
drawPoint(pt,pDC);
}else if( ls = dynamic_cast<gis::LineString*>(geo)){
2)Resource View→Toolbar→ → →画图 →双击 →
→同理画出 和 并设置ID为ID_LINESTRING和ID_POLYGON
MFC画图实验报告
// TODO: Add your command handler code here
width=10;
}
void CMfcView::On20()
{
// TODO: Add your command handler code here
width=20;
}
(4).画线,曲线,矩形,圆角矩形,椭圆的功能由成员变量shape的值控制。
MFC画图程序实验报告
一.实验目的
用基于单文档应用程序创建一个类似Windows画图板的程序。功能主要有:手绘线,简单图形,画笔和画刷颜色的选择,画笔粗细的选择,文字的编辑与输出。具有菜单,通过菜单执行画线,曲线,矩形,圆角矩形,椭圆的功能,能填充图形设置图形的颜色,,实现重做和撤销,并设置字体的属性。
p2=point;
DC->SelectObject(&pen);//选择画笔pen
CRect rc(p1, p2);//定义矩形左上角和右下角点的成员变量
DC->Rectangle( rc );//画矩形
DC->DrawText( "这是我的文本框", rc, DT_CENTER);//显示文本
CView::OnRButtonUp(nFlags, point);
}
void CMfcView::Onpen()//画笔颜色按钮进行COMMAND消息响应,创建画笔。
{画笔风格为PS_DOT,由返回的整形变量width确定画笔的宽度。
// TODO: Add your command handler code here
CColorDialog dlg;
dlg.DoModal();
LOGFONT lf;
基于mfc的实验报告
基于mfc的实验报告摘要本实验旨在通过使用MFC(Microsoft Foundation Classes)开发框架,实现一个简单的图形化界面程序。
通过这次实验,我深入理解了MFC框架的基本原理和开发流程,并成功完成了一个简单的图形化界面程序。
1. 引言MFC是微软公司开发的一套C++类库,用于创建Windows平台上的应用程序。
它建立在Windows API之上,简化了Windows操作系统的编程方式。
MFC 提供了一系列的类和函数,包括窗口(Window)、对话框(Dialog)、消息映射(Message Map)等,极大地简化了Windows应用程序的开发过程。
2. 实验目的本实验主要目的是熟悉MFC框架的基本原理和开发流程,实现一个简单的图形化界面程序。
通过本实验,能够掌握MFC框架中的窗口创建、消息处理、界面设计等基本概念和操作。
3. 实验过程3.1 环境配置首先,需要在计算机上安装Visual Studio和MFC组件。
打开Visual Studio,创建一个新的MFC应用程序项目,并选择对话框类型作为项目的基础结构。
3.2 窗口创建在MFC应用程序中,窗口是最基本的界面单位。
通过菜单选择“添加类”的方式,创建一个新的对话框类,并继承自CDialog类。
在新建的对话框类中,可以定义与界面相关的成员变量和控件。
3.3 控件添加在对话框设计界面中,可以通过拖拽和调整控件的方式,向对话框中添加各种控件,如按钮、文本框、列表框等。
每个控件都有自己的属性和事件响应函数。
3.4 消息映射消息映射是MFC框架的核心概念之一。
通过消息映射,可以将用户的操作(如点击按钮)与特定的函数关联起来。
在对话框类中,可以通过DECLARE_MESSAGE_MAP和BEGIN_MESSAGE_MAP宏定义来实现消息映射关系的建立。
3.5 编译和运行完成界面设计和消息映射后,即可对程序进行编译和运行。
在编译过程中,MFC 会自动将资源文件编译成可执行的文件。
mfc实验报告
mfc实验报告MFC实验报告引言:MFC(Microsoft Foundation Classes)是一种用于开发Windows应用程序的C++类库,它提供了一套丰富的类和函数,使开发者能够更加方便地创建图形界面、处理用户输入和输出、管理窗口等。
本实验旨在通过使用MFC库来开发一个简单的图形界面应用程序,以展示MFC的基本功能和使用方法。
一、实验准备在开始实验之前,我们需要安装Visual Studio软件,该软件集成了MFC库。
通过Visual Studio,我们可以轻松创建一个MFC项目,并使用其中的工具和组件来开发我们的应用程序。
二、创建MFC项目1. 打开Visual Studio软件,选择“创建新项目”。
2. 在弹出的对话框中,选择“Visual C++” -> “MFC” -> “MFC应用程序”。
3. 输入项目名称和保存路径,点击“确定”按钮。
4. 在下一个对话框中,选择“单文档”或“多文档”应用程序,根据需要进行选择。
5. 点击“完成”按钮,Visual Studio将自动生成一个基本的MFC应用程序框架。
三、设计图形界面MFC提供了丰富的工具和组件,使我们能够轻松地设计出漂亮的图形界面。
在本实验中,我们将创建一个简单的计算器应用程序作为示例。
1. 在Visual Studio的资源视图中,找到“Dialog”文件夹,双击打开“MainDialog”对话框。
2. 在对话框上拖拽和调整按钮、文本框等控件,设计出计算器的布局。
3. 双击每个按钮控件,添加相应的点击事件处理函数,实现计算器的功能逻辑。
四、添加功能逻辑1. 在Visual Studio的“类视图”中,找到“MainDialog”类,双击打开对应的源文件。
2. 在源文件中,找到“BEGIN_MESSAGE_MAP”和“END_MESSAGE_MAP”之间的区域,在其中添加按钮点击事件的处理函数。
3. 在处理函数中,根据按钮的功能,编写相应的逻辑代码。
c++实验报告mfc简单画图程序)
在OnPaint()创建的画刷中,brush.CreateSolidBrush(m_fColor),颜色就是用m_fColor表示的,改变m_fColor即改变了画刷的颜色。选择菜单绘图→填充色,会弹出通过WM_COLORREF从系统中引入的颜色选择对话框,选择颜色后,点击确定则相应颜色值就赋给变量m_fColor,此时画刷的颜色就会发上变化。若不选择颜色,则默认填充色为黑色。
CPen *oldpen=dc.SelectObject(&pen);
dc.MoveTo(opoint);
dc.LineTo(cpoint);
dc.SelectObject(oldpen);
opoint=cpoint;
}
}
CView::OnMouseMove(nFlags, point);
}
void CDrawView::OnPaint()
2.选择好图形后,通过鼠标可以绘制出相应的直线,矩形或椭圆,鼠标的按下确定图形的起点,鼠标的拖动则确定了图形的终点,即通过鼠标的拖动来决定图形的大小,当鼠标弹起,此图形则绘制完毕。
设计思路
1.对需要用到的变量进行初始化。
2.选择相应的图形之后就响应相应的消息处理函数,给shape赋对应的值。选择不同的线宽,线色与填充色,即可改变画笔或画刷的属性。
线宽5
ID_W5
建立类向导,在视图类CDrawView中,对各菜单项添加对应的COMMAND消息处理函数,部分菜单项还添加对应的UPDATE_COMMAND_UI消息函数,如图6所示。
图6 建立类向导
3.在相应消息函数处添加代码,实现其功能
建立类向导,在视图类CDrawView中,添加WM_PAINT消息,以及WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE消息,并在其中添加相应的代码。
实验一 MFC基本绘图
数学与计算科学系学生实验报告实验课程名称:计算机图形学实验内容:实验一 MFC基本绘图系别:年级:专业班:学生姓名:学号:开课时间:年下学期一、实验要求1. 按照教材第40页2.2节所介绍的操作步骤,熟悉MFC应用程序的创建过程,并完成第50页的例2-5。
2.在上面程序的基础上,通过设置不同的画笔和画刷,至少实现8个不同图形的绘制,如:椭圆、矩形、实线、虚线、位图显示、五角星(多边形)、圆弧、扇形、Bezier曲线等等。
二、实验过程1.启动Visval 6.0++,创建MFC单文档工程。
2. 在MFC的OnDraw(CDC* pDC)中“ // TODO: add draw code for native data here”下进行编程。
3.建立直角坐标系,并标出x,y轴和原点O。
4.在坐标系里画图。
5.用图片填充背景时要先将图片导入MFCresources中。
6.画五角星时在头文件中加入以下代码:#include "math.h"#define PI 3.1415926#define Round(d) int(floor(d+0.5))三、程序代码void CMywork1View::OnDraw(CDC* pDC){CMywork1Doc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data hereCRect rect;//定义矩阵GetClientRect(&rect);//获得客户区矩阵pDC->SetMapMode(MM_ANISOTROPIC);//设置映射模式pDC->SetWindowExt(100,100);//设置窗口pDC->SetViewportExt(100,100);//设置视区:x轴水平向右为正,y轴垂直向上为正pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);//设置客户区中心为坐标系原点rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);//客户区矩阵校正//建立坐标系CPen NewPen,*pOldPen;NewPen.CreatePen(PS_SOLID,1,RGB(0,255,0));//画实线,选择绿色画笔pOldPen=pDC->SelectObject(&NewPen);pDC->MoveTo(-rect.right,0); //自定义坐标轴pDC->LineTo(rect.right,0);pDC->MoveTo(0,-rect.bottom);pDC->LineTo(0,rect.bottom);pDC->MoveTo(rect.right,0); //画x轴的箭头pDC->LineTo(rect.right-10,-7);pDC->MoveTo(rect.right,0); //画x轴的箭头pDC->LineTo(rect.right-10,7);pDC->MoveTo(0,-rect.bottom); //画y轴的箭头pDC->LineTo(7,10-rect.bottom);pDC->MoveTo(0,-rect.bottom); //画y轴的箭头pDC->LineTo(-7,10-rect.bottom);pDC->TextOut(rect.right-15,5,"x"); //显示x轴pDC->TextOut(25,15-rect.bottom,"y"); //显示y轴pDC->TextOut(-15,10,"O"); //显示原点//直线---画实线1CPoint A(50,50),B(450,300);CPen NewPen1,*pOldPen1;NewPen1.CreatePen(PS_SOLID,1,RGB(0,225,225));//画实线,选择青色画笔pOldPen1=pDC->SelectObject(&NewPen1);pDC->MoveTo(A);pDC->LineTo(B);pDC->SelectObject(pOldPen1);pDC->TextOut(50,50,'A');pDC->TextOut(450,300,'B');pDC->TextOut(200,200,"实线");//直线---画虚线2CPoint C(300,150),D(600,100);CPen NewPen2,*pOldPen2;NewPen2.CreatePen(PS_DASH,1,RGB(225,0,0));//画虚线,选择红色画笔pOldPen2=pDC->SelectObject(&NewPen2);pDC->MoveTo(C);pDC->LineTo(D);pDC->SelectObject(pOldPen2);pDC->TextOut(300,150,'C');pDC->TextOut(600,100,'D');pDC->TextOut(450,100,"虚线");//画椭圆3rect.DeflateRect(100,50);CBrush * pOldBrush3;pOldBrush3=(CBrush *)pDC->SelectStockObject(NULL_BRUSH);//选择透明画刷pDC->Ellipse(rect);//绘制椭圆pDC->SelectObject(pOldBrush3);//画圆角矩形4CBrush NewBrush4,*pOldBrush4;NewBrush4.CreateSolidBrush(RGB(255,0,0));pOldBrush4=pDC->SelectObject(&NewBrush4);pDC->RoundRect(-400,-200,-50,-40,40,20);pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush4);//画Bezier样条9CPoint pp[7];pp[0]=CPoint(20,-200);pp[1]=CPoint(90,-70);pp[2]=CPoint(220,-30);pp[3]=CPoint(250,-160);double a=(pp[3].y-pp[2].y)/(pp[3].x-pp[2].x);double x=270,y=a*(x-pp[3].x)+pp[3].y;pp[4]=CPoint(Round(x),Round(y));pp[5]=CPoint(480,-130);pp[6]=CPoint(400,-25);for(int j=0;j<7;j++){if(0==j)pDC->MoveTo(pp[j]);elsepDC->LineTo(pp[j]);pDC->Ellipse(pp[j].x-5,pp[j].y-5,pp[j].x+5,pp[j].y+5);//黑色实心圆绘制控制点}CPen NewPen9,*pOldPen9;NewPen9.CreatePen(PS_SOLID,3,RGB(255,0,0));//红色画笔绘制样条pOldPen9=pDC->SelectObject(&NewPen9);pDC->PolyBezier(pp,7);//绘制Bezier样条pDC->SelectObject(pOldPen9);pDC->TextOut(280,-100,"Bezier曲线");//绘制五角星6CPen penBlue(PS_SOLID,5,RGB(0,0,255));//定义五个像素宽的蓝色画笔CPen *pOldPen6=pDC->SelectObject(&penBlue);CBrush brushRed(RGB(255,0,0));//定义红色画笔CBrush * pOldBrush6=pDC->SelectObject(&brushRed);pDC->SetPolyFillMode(WINDING);//设置填充模式int r=200;//正五边形外接圆的半径CPoint p[5];//定义正五边形顶点数组double Beta=2*PI/5;//定义每个顶点的圆心角double Alpha=PI/10;//定义起始角for(int i=0;i<5;i++){p[i].x=Round(r*cos(i*Beta+Alpha));//计算正五边形顶点坐标p[i].y=Round(r*sin(i*Beta+Alpha));}CPoint v[5];//定义五角星顶点数组v[0]=p[0];v[1]=p[2];v[2]=p[4];v[3]=p[1];v[4]=p[3];//转储顶点pDC->Polygon(v,5);//绘制五角星pDC->SelectObject(pOldPen6);//恢复画笔pDC->SelectObject(pOldBrush6);//恢复画刷//画扇形7CBitmap NewBitmap7; CBrush NewBrush7,*pOldBrush7;NewBrush7.CreatePatternBrush(&NewBitmap7);//将背景图作为画刷填充扇形pOldBrush7=pDC->SelectObject(&NewBrush7);CPen *pOldPen7;pOldPen7=(CPen*)pDC->SelectStockObject(NULL_PEN);CPoint ld,rt,sp,ep;ld=CPoint(500,150),rt=CPoint(100,300);//第一个扇形的位置sp=CPoint(-100,-300),ep=CPoint(-500,-150);pDC->Pie(CRect(ld,rt),sp,ep);//画扇形函数CBrush Brush7;Brush7.CreateSolidBrush(RGB(0,255,255));//为下面的的扇形配青色pDC->SelectObject(&Brush7);ld=CPoint(-400,-170),rt=CPoint(-300,-130);//第二个扇形的位置sp=CPoint(-200,-100),ep=CPoint(-500,-100);pDC->Pie(CRect(ld,rt),sp,ep);//画获取像素图8srand((unsigned)time(NULL));//随机变量(随时间变化)COLORREF crColor;int m,n;for(n=50;n<100;n++)for(m=-100;m<-50;m++)pDC->SetPixelV(m,n,RGB(rand()%256,rand()%256,rand()%256));//生成随机像素点for(n=50;n<100;n++)for(m=-100;m<-50;m++){crColor=pDC->GetPixel(m,n);//获取原矩形区域的像素点pDC->SetPixelV(m-200,n+50,crColor);//用获取的像素点在y-90的位置生成原图}}四、实验结果。
北邮程序设计实践报告mfc画图
程序设计实践设计报告课题名称:简单画图程序的设计与实现学生姓名:班级:班内序号:学号:日期:课题概述1.1课题目标和主要内容:该软件功能与Windows下附件中的画图软件有相似功能。
本程序是在VC2010平台上用MFC所编。
绘制方面的功能主要包括绘制各种图元,包括直线、矩形、椭圆、扇形、连续线,用笔自由绘图。
绘图时可以选择各种颜色,各种线型和线宽。
1.2系统的主要功能设计一个单文档类型的MFC AppWizard (exe)工程,此程序将实现简单的绘图功能,包括点、直线、矩形、椭圆、扇形和连续线的绘制。
并且能实现绘图的控制,包括线宽、线型和颜色和字体的设置。
2. 系统设计2.1 系统总体框架总体设计设计图如图62.2 系统详细设计1.首先,新建一个单文档类型的MFC AppWizard (exe)工程,工程取名为:SHOW。
为此程序添加一个子菜单,菜单名称为“绘图”,并为其添加六个菜单项,分别用来控制不同图形的绘制。
当用户选择其中的一个菜单项后,程序将按照当前的选择进行相应图形的绘制。
在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以便随后的绘图操作使用。
因此在CSHOWView类中添加一个私有变量dType;用来保存用户的选择,该变量的定义如下所述:private: DrawType dType;接着,在视类的构造函数中将此变量初始化为0,程序代码如下:利用switch/case语句,来分别完成相应图形的绘制。
当用户选择【绘图】菜单下的不同子菜单项时,将变量dType设置为不同的值。
程序代码如下:void CSHOWView::OnShowSline(){// TODO: Add your command handler code here//MessageBox("直¡À线? Clicked!");dType=SLine;}void CSHOWView::OnShowCline(){// TODO: Add your command handler code heredType=CLine;}void CSHOWView::OnShowNosector(){// TODO: Add your command handler code heredType=NoSector;}void CSHOWView::OnShowSector(){// TODO: Add your command handler code heredType=Sector;}void CSHOWView::OnShowRect(){// TODO: Add your command handler code heredType=Recta;}void CSHOWView::OnShowEcllipse(){// TODO: Add your command handler code heredType=Ecllipse;}2.直线、矩形、椭圆扇形的绘制对于直线、矩形和椭圆,在绘制时都可有两点来确定其图形。
MFC绘图 实验报告
基于MFC的绘图软件目录基于MFC的绘图软件11 .引言 (2)2.MFC设备上下文及绘图的基本理论知识 (2)2.1 GDI(Graphic Device Interface)绘图的实现 (2)2.2 MFC图形对象类 (2)2.3 库存的GDI对象 (3)2.4与绘图有关的简单数据类型 (4)2.5 MFC应用程序框架中的图形绘制和刷新 (5)3.设计的主体内容MFC设备描述表---CDC类 (5)3.1 CDC类及其派生类 (5)3.2 文本输出 (6)3.3CDC常用的绘图函数 (6)3.4画笔和画刷 (8)4.软件主体设计 (8)4.1 资源编辑 (8)4.2 具体实现 (11)5.结果分析与讨论 (19)6.总结 (19)附录:简单绘图软件作品说明............................................ 错误!未定义书签。
1 .引言计算机的发展也是计算机语言的发展得到了很大的提高,人们的生活中离不开图像,除了我们可以用铅笔在纸上画图外,我们也可以在电脑上绘制我们的想象,本实验就是基于VC++的一个小型的绘图软件,虽然麻雀虽小五脏俱全。
本课题就是要实现这一小小的软件。
2.MFC 设备上下文及绘图的基本理论知识2.1 GDI(Graphic Device Interface)绘图的实现图形设备接口(GDI )可以理解为一个可执行程序,它处理来自windows 应用程序的图形函数调用,然后把这些调用传递给合适的设备驱动程序,由设备驱动程构关系如下:设备描述表(DC )是一种windows 数据结构,它包含了与一个设备(如显示器)的绘制属性的相关信息。
所有的绘制操作通过一个设备上下文对象进行,该对象封装了实现绘制线条,形状和文本的windows API 函数。
设备上下文可以用来向屏幕,打印机和图元件输入结果。
2.2 MFC 图形对象类Windows 提供了多种用于在设备描述表中进行绘图的图形对象,如画笔,位图,调色板,区域,和路径等。
北邮程序设计实践mfc绘图程序报告
程序设计实践设计报告课题名称:基于MFC简单绘图的设计与实现学生姓名:_____________________班级:_________________班内序号:________________________学号:_________________日期:_________2014.5.17___________1.课题概述1.1课题目标和主要内容简述本课题实现的主要内容和目标: 简单绘图软件的设计和实现使用的开发平台:MFC开发平台采用的主要工具:visual studio 2013.1.2系统的主要功能2. 系统设计2.1 系统总体框架2.2 系统详细设计[1] 模块划分图及描述a.画图模块:该模块的大部份功能都写在了CDrawSomethingView类里面。
该模块也是此次程序的重点模块之一,主要负责画一些简单图形,例如:直线、矩形、椭圆、任意曲线等等;有线型、线宽的设置;还有画笔颜色和填充色的选择,可以画各种各样颜色的线条。
b.窗口模块:这部分大多数都是编译器自动生成,只做了一些修改,例如:使程序一开始运行便最大化。
c.菜单模块:该部分同样大部分都是编译器自动生成的,自己增添了一部分菜单例如:绘图工具、颜色设置、线条设置等等,让使用者可以进行快速的操作。
[2] 类关系图及描述a.CAboutDlg类由编译器生成。
b.CDrawSomethingView类由编译器自动生成的类表1 CDrawView类说明表名称属性说明m_flag 数据成员用于选择图形的类型(直线,矩形,椭圆等)m_ptOld数据成员画图的临时点(也是绘图结束的终点)m_ptOrigin 数据成员画图的起点m_color 数据成员画笔颜色选择m_vLineWidth 数据成员指向线宽的指针m_vLineStyle 数据成员线型选择(点线,实线,虚线)OnEditColor() 成员函数颜色选择[3] 程序流程图及描述[4] 存储结构、内存分配无2.3 关键算法分析变量分析:m_nType:画图类型(必须选择,若未选择便开始画图则弹出“您还没有选择要画的图形”)m_cType:画图以及填充颜色(设置了默认,红,绿,蓝以及自定义,未选择时则缺省默认值(RGB(255,255,255)))m_lType:线型(设置了实线型,虚线型,点型,未选择时则缺省实线型)m_wType:线宽(设置了1,2,3,5,10,12,14,16,18,20,25,30,50,70,72常见线宽以及自定义,未选择时则缺省线宽为1)m_bType:画刷(设置了填充和透明,未选择时则缺省为透明)算法1:函数名void CDrawSomethingView::OnLButtonUp(UINT nFlags, CPoint point)[1] 算法功能绘制具体图形[2] 算法基本思想通过变量m_nType来确定用户需要绘制的图形,进一步通过不同的代码实现图形[3] 算法空间、时间复杂度分析[4] 代码逻辑void CDrawSomethingView::OnLButtonUp(UINT nFlags, CPoint point)//绘图{// TODO: 在此添加消息处理程序代码和/或调用默认值m_Mouse = FALSE;if (m_nType == -1){MessageBox(_T("您还没有选择要画的图形"));}CClientDC dc(this);CPen PenColor(m_Style, m_Kuan, m_color);CBrush BrushColor(m_Brush);dc.SelectObject(&PenColor);dc.SelectObject(&BrushColor);CRect rectEllipse(m_ptOrigin, point);int r = (int)sqrt((point.x - m_ptOrigin.x)*(point.x - m_ptOrigin.x) +(point.y - m_ptOrigin.y)*(point.y - m_ptOrigin.y));//定义圆的半径CRect rect(m_ptOrigin.x - r, m_ptOrigin.y - r, m_ptOrigin.x + r, m_ptOrigin.y + r);//定义一个正方形switch (m_nType){case 1:if (m_bType == TRUE)//矩形{dc.Rectangle(rectEllipse);}else{dc.SelectStockObject(NULL_BRUSH);dc.Rectangle(rectEllipse);}break;case 2:if (m_bType == TRUE){dc.Ellipse(rectEllipse);}else{dc.SelectStockObject(NULL_BRUSH);dc.Ellipse(rectEllipse);}//椭圆break;case 3:dc.MoveTo(m_ptOrigin);//直线dc.LineTo(point);break;case 5:dc.SetPixel(point, m_color);//点}CGraph *pGraph = new CGraph(m_nType, m_ptOrigin, point);GetDocument()->m_obArray.Add(pGraph);CView::OnLButtonUp(nFlags, point);}算法2:函数名void CDrawSomethingView::OnMouseMove(UINT nFlags, CPoint point)[1] 算法功能绘制曲线[2] 算法基本思想通过连续取得用户鼠标移动中形成的直线段近似成一条曲线[3] 算法空间、时间复杂度分析[4] 代码逻辑void CDrawSomethingView::OnMouseMove(UINT nFlags, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值CClientDC dc(this);if (m_Mouse == TRUE&& m_nType==4){CPen PenColor(m_Style, m_Kuan, m_color);dc.SelectObject(&PenColor);dc.MoveTo(m_ptOrigin);dc.LineTo(point);m_ptOrigin = point;}CView::OnMouseMove(nFlags, point);}2.4 其他无3.程序运行结果分析包括输入数据来源和格式:鼠标轨迹输出显示方式:图形主要界面:绘图界面操作流程:选择图形、线宽、线型、是否填充,按鼠标绘制响应时间:即时运行效果4.总结4.1课题的难点和关键点关键点之一:椭圆的绘制。
简易绘图程序 使用API和MFC
XXX大学程序设计实践报告课题名称:程序设计实践学生姓名:XXXXXxxxxx班级:2012XXXXX班内序号:XXX学号:XXxx21XXX日期:2014年5月1.课题概述1.1课题目标和主要内容本课题了实现一个基于API和MFC的简易绘图软件。
此简易绘图软件,满足用户进行绘图时的基本需求,主要功能包括绘制会动的时钟,绘制三角形(API实现),绘制线条(MFC实现)。
应具有良好的界面、必要的交互信息和简易的菜单进行操作。
在程序的设计与实现中,系统开发平台为Windows7,主要工具为Visual Studio 2012。
1.2系统的主要功能主要功能与说明:DROW1(API):1)会动的时钟的绘制:模拟一个真实的表盘,绘制图形,显示实际的时间。
2)绘制简单的三角形;MFC:1)图形的绘制:a)线形绘图函数:Lineto:绘制直线Polyline:绘制折线Arc:绘制圆弧线Polybezir:绘制弯曲线b)区域绘图函数Rectant:绘制矩形Roundrect:绘制圆边矩形Ellips:绘制椭圆Pie:绘制扇形2)自由绘图:拖动鼠标可以自由绘制曲线,可以通过一个对话框选择所需线形线宽等。
3)清空功能:1)全部清空:可以清空整个屏幕内容。
2. 系统设计2.1 系统总体框架API:MFC:2.2 系统详细设计2.2.1 模块划分图及描述a) 绘图函数模块:通过各种系统自带的绘图函数,直接调用绘图。
设置他们的位置,并添加到菜单项,使点击菜单项则可出现相应图形。
Lineto:绘制直线 Polyline:绘制折线 Arc:绘制圆弧线 Polybezir:绘制弯曲线 Rectant:绘制矩形 Roundrect:绘制圆边矩形 Ellips:绘制椭圆Pie :绘制扇形b) 自由绘图模块:按下鼠标左键,初始化起始位置,在选定自由绘图模式的情况下,拖动鼠标的同时,获取鼠标当前位置为终点位置,调用MoveTo 和LineTo 函数连接两点。
MFC绘图 实验报告
基于MFC的绘图软件目录基于MFC的绘图软件11 .引言 (2)2.MFC设备上下文及绘图的基本理论知识 (2)2.1 GDI(Graphic Device Interface)绘图的实现 (2)2.2 MFC图形对象类 (2)2.3 库存的GDI对象 (3)2.4与绘图有关的简单数据类型 (4)2.5 MFC应用程序框架中的图形绘制和刷新 (5)3.设计的主体内容MFC设备描述表---CDC类 (5)3.1 CDC类及其派生类 (5)3.2 文本输出 (6)3.3CDC常用的绘图函数 (6)3.4画笔和画刷 (8)4.软件主体设计 (8)4.1 资源编辑 (8)4.2 具体实现 (11)5.结果分析与讨论 (19)6.总结 (19)附录:简单绘图软件作品说明............................................ 错误!未定义书签。
1 .引言计算机的发展也是计算机语言的发展得到了很大的提高,人们的生活中离不开图像,除了我们可以用铅笔在纸上画图外,我们也可以在电脑上绘制我们的想象,本实验就是基于VC++的一个小型的绘图软件,虽然麻雀虽小五脏俱全。
本课题就是要实现这一小小的软件。
2.MFC 设备上下文及绘图的基本理论知识2.1 GDI(Graphic Device Interface)绘图的实现图形设备接口(GDI )可以理解为一个可执行程序,它处理来自windows 应用程序的图形函数调用,然后把这些调用传递给合适的设备驱动程序,由设备驱动程构关系如下:设备描述表(DC )是一种windows 数据结构,它包含了与一个设备(如显示器)的绘制属性的相关信息。
所有的绘制操作通过一个设备上下文对象进行,该对象封装了实现绘制线条,形状和文本的windows API 函数。
设备上下文可以用来向屏幕,打印机和图元件输入结果。
2.2 MFC 图形对象类Windows 提供了多种用于在设备描述表中进行绘图的图形对象,如画笔,位图,调色板,区域,和路径等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
简单绘图程序1 需求说明1.1 问题描述设计一个简单的绘图应用程序,可以绘制图形或自由绘制线段,可以更改颜色、画笔粗细、保存文件。
1.2功能说明1.图形绘制功能:直线、椭圆、矩形。
在菜单栏中选择需要的图形(也可以通过工具栏中选择)用鼠标便能在视图中绘出相应的图形。
2.可以绘制自由线段3.对图形的操作:能通过菜单栏弹出对话框选择线宽、自定义颜色,也可以擦除绘制的线段。
4.可以保存绘图文件,保存后打开可以继续绘制。
2.1.3 数据说明在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以便随后的绘图操作使用。
在CDzyView类中添加一个私有变量xz;用来保存用户的选择(直线、矩形、椭圆、自由绘图)在绘制时都可有两点来确定其图形。
当鼠标左击时得到一个点,当鼠标停止移动时得到另外一个点。
为视图类CDzyView分别捕获鼠标左键按下和弹起这两个消息。
当鼠标左键按下时,需要将鼠标当前按下点保存至sx、sy,在鼠标移动停止后,将当前坐标保存至ex,ey.其他主要数据说明:int fd 判断是否为自由绘图模式int w 线宽int R RGB中的Rint G RGB中的Gint B RGB中的BCGraph类中int m_nType:保存后重绘时用户的选择int qdx; 重绘起点xint qdy; 重绘起点yint zdx; 重绘终点xint zdy; 重绘终点yCLine类中int cx; 重绘线宽int sx; 重绘起点xint sy; 重绘起点yint zx; 重绘终点xint zy; 重绘终点yint w; 重绘线宽自定义颜色对话框关联变量:IDC_EDIT_RED int m_RedIDC_EDIT_GREEN int m_GreenIDC_EDIT_BLUE int m_BlueIDC_SCROLL_RED CScrollBar m_SredIDC_SLIDER_GREEN CSliderCtrl m_SgreenIDC_SPIN_BLUE CSpinButtonCtrl m_Sblue2 分析、设计与实现2.1 主要功能设计与实现2.1.1 有关文档视图功能的设计与实现单文档结构可序列化的类CGraph从CObject派生可序列化的类CLine从CObject派生对话框类zdyyanse从CDialog派生2.1.2 有关消息处理的设计与实现方案:需要响应的消息应有:鼠标移动、鼠标左键按下、鼠标左键抬起、菜单栏中的画矩形、画直线、画椭圆、自由绘图、更多选项中的自定义颜色、工具栏中的红色、蓝色、绿色、线宽1、线宽2、线宽3、橡皮擦。
整体思路为,用户选择不同的功能后就响应相应的消息处理函数,给xz赋对应的值。
选择不同的线宽,线色,即可改变画笔或画刷的属性。
鼠标的按下响应函数OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标,鼠标的拖动响函数OnMouseMove()改变终点的坐标,鼠标的弹起响应OnLButtonUp(),得到绘制图形。
ID_DRAW_ELLIPSE:COMMAND 画椭圆ID_DRAW_LINE:COMMAND 画直线ID_DRAW_RECTANGLE:COMMAND 画矩形ON_WM_LBUTTONDOWN 鼠标左键按下ON_WM_LBUTTONUP 鼠标左键抬起ON_WM_MOUSEMOVE 鼠标移动void CDzyView::OnDrawEllipse(){// TODO: Add your command handler code herexz=3;}//当用户选择画椭圆,将变量xz赋值为3.void CDzyView::OnDrawLine(){// TODO: Add your command handler code herexz=1;}//当用户选择画直线,将变量xz赋值为1.void CDzyView::OnDrawRectangle(){// TODO: Add your command handler code herexz=2;}//当用户选择画矩形,将变量xz赋值为2.void CDzyView::OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultsx=point.x;sy=point.y;fd=1;CView::OnLButtonDown(nFlags, point);}//鼠标左键按下,将当前坐标赋值给sx,sy 并判断鼠标是否按下(fd=1)void CDzyView::OnLButtonUp(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultCClientDC dc(this); //this一般指向本窗口或当前活动视图CPen pen; //定义画笔pen.CreatePen(PS_SOLID,w,RGB(R,G,B)); //创建画笔dc.SelectStockObject(NULL_BRUSH);dc.SelectObject(&pen); //获取画笔fd=0;switch (xz){case 1:dc.MoveTo(sx,sy);dc.LineTo(ex,ey);break;case 2:dc.Rectangle(sx,sy,ex,ey);break;case 3:dc.Ellipse(sx,sy,ex,ey);break;}CGraph *pGraph=new CGraph(xz,sx,sy,ex,ey,w,R,G,B);GetDocument()->m_obArray.Add(pGraph);CView::OnLButtonUp(nFlags, point);CDzyDoc* pDoc=GetDocument();}//鼠标抬起时进行绘图,并将用户画的每一个图形对象保存到m_obArray中void CDzyView::OnMouseMove(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultex=point.x;ey=point.y;CMainFrame *pFrame;pFrame=(CMainFrame *)AfxGetApp()->m_pMainWnd ; //获得指向主框架窗口的指针CStatusBar *pStatus=&pFrame->m_wndStatusBar;//获得指向主框架窗口上状态条的地址CString str;if(pStatus){str.Format("X=%d",point.x);pStatus->SetPaneText(1,str); //在第1个窗格中显示str的内容str.Format("Y=%d",point.y);pStatus->SetPaneText(2,str); //在第2个窗格中显示str的内容}if(xz==4){if(fd==1){CLine *pLine=new CLine(sx,sy,ex,ey,w,R,G,B);GetDocument()->m_lineObarry.Add(pLine);CClientDC dc(this);CPen pen; //定义画笔pen.CreatePen(PS_SOLID,w,RGB(R,G,B)); //创建画笔dc.SelectObject(&pen); //获取画笔dc.MoveTo(sx,sy);dc.LineTo(point);sx=point.x;sy=point.y;}}CView::OnMouseMove(nFlags, point);}//获取终点坐标,并进行自由绘图操作,同时在状态栏中显示鼠标当前坐标。
并保存自由绘图的坐标。
void CDzyView::OnW1(){// TODO: Add your command handler code herew=2;}//将线宽设为2void CDzyView::OnW2(){// TODO: Add your command handler code herew=3;}//将线宽设为3void CDzyView::Onw3(){// TODO: Add your command handler code here w=5;}//将线宽设为5void CDzyView::OnBlue(){// TODO: Add your command handler code here R=0;G=0;B=255;}//工具栏中选择蓝色void CDzyView::OnRed(){// TODO: Add your command handler code here R=255;G=0;B=0;}//工具栏中选择红色void CDzyView::OnGreen(){// TODO: Add your command handler code here R=0;G=255;B=0;}//工具栏中选择绿色void CDzyView::OnFreedraw(){// TODO: Add your command handler code here xz=4;}//自由绘图void CDzyView::OnEraser(){// TODO: Add your command handler code here R=255;G=255;B=255;xz=4;}void CDzyView::Onzdy(){// TODO: Add your command handler code herezdyyanse dlg; //定义对话框对象int result= dlg.DoModal();if(result==IDOK){R=dlg.m_Red;B=dlg.m_Blue;G=dlg.m_Green;}}2.1.3 有关菜单、工具栏、状态栏设计与实现保持原有菜单并添加绘图工具--矩形颜色与线宽----颜色自由绘图更多椭圆线宽------线宽1直线线宽2线宽3工具栏:添加矩形、直线、椭圆的快速绘图按钮添加颜色快速选择按钮添加线宽快速选择按钮状态栏:设计显示当前鼠标坐标2.1.4 有关对话框的设计与实现通过菜单点击更多选项中的自定义颜色弹出对话框用滚动条、滑动条、旋转按钮修改3种颜色的值,并改变改变预览值的填充色初始化单色的值为0~255,应把滚动控件值的变化范围限制在此区间,且初始值为0 颜色的存储3种单色值存放在编辑框的关联变量中(int型)滚动控件当前值的变化和编辑框中数值的变化均应改变这3个关联变量(关联变量与编辑框、滚动控件联动)可在相应的消息处理函数中完成联动画图3种单色值每次变化,都重画椭圆,所以画椭圆的代码应放在每个消息处理函数中void zdyyanse::OnChangeEditBlue(){// TODO: If this is a RICHEDIT control, the control will not// send this notification unless you override the CDialog::OnInitDialog()// function and call CRichEditCtrl().SetEventMask()// with the ENM_CHANGE flag ORed into the mask.UpdateData();m_Sblue.SetPos(m_Blue);// TODO: Add your control notification handler code here}void zdyyanse::OnChangeEditGreen(){// TODO: If this is a RICHEDIT control, the control will not// send this notification unless you override the CDialog::OnInitDialog()// function and call CRichEditCtrl().SetEventMask()// with the ENM_CHANGE flag ORed into the mask.UpdateData();m_Sgreen.SetPos(m_Green);// TODO: Add your control notification handler code here}void zdyyanse::OnChangeEditRed(){// TODO: If this is a RICHEDIT control, the control will not// send this notification unless you override the CDialog::OnInitDialog()// function and call CRichEditCtrl().SetEventMask()// with the ENM_CHANGE flag ORed into the mask.UpdateData();m_Sred.SetScrollPos(m_Red);// TODO: Add your control notification handler code here}void zdyyanse::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) {// TODO: Add your message handler code here and/or call defaultif(pScrollBar==&m_Sred){ // 滚动条switch(nSBCode){case SB_THUMBTRACK: // 拖动划块m_Sred.SetScrollPos(nPos);m_Red=nPos; break;case SB_LINEDOWN: // 按zuo按钮m_Red=m_Sred.GetScrollPos()+1;m_Sred.SetScrollPos(m_Red); break;case SB_LINEUP: // 按you按钮m_Red=m_Sred.GetScrollPos()-1;m_Sred.SetScrollPos(m_Red); break;}}if((pScrollBar->GetDlgCtrlID())==IDC_SLIDER_GREEN ) // 滑动条m_Green=m_Sgreen.GetPos();UpdateData(false);CDC* pDC=GetDC();CBrush newBrush;CPen newPen;newBrush.CreateSolidBrush(RGB(m_Red,m_Green,m_Blue));newPen.CreatePen(PS_SOLID,1,RGB(m_Red,m_Green,m_Blue));pDC->SelectObject(&newPen);pDC->SelectObject(&newBrush);pDC->Rectangle(50,70,150,150);ReleaseDC(pDC);CDialog::OnHScroll(nSBCode, nPos, pScrollBar);}BOOL zdyyanse::OnInitDialog(){CDialog::OnInitDialog();// TODO: Add extra initialization herem_Sred.SetScrollRange(0,255);m_Sred.SetScrollPos(0);m_Sgreen.SetRange(0,255);m_Sgreen.SetPos(0);m_Sblue.SetRange(0,255);m_Sblue.SetPos(0);return TRUE; // return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE }void zdyyanse::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar){// TODO: Add your message handler code here and/or call defaultm_Blue=nPos;UpdateData(false);CDC* pDC=GetDC();CBrush newBrush;CPen newPen;newBrush.CreateSolidBrush(RGB(m_Red,m_Green,m_Blue));newPen.CreatePen(PS_SOLID,1,RGB(m_Red,m_Green,m_Blue));pDC->SelectObject(&newPen);pDC->SelectObject(&newBrush);pDC->Rectangle(50,70,150,150);ReleaseDC(pDC);CDialog::OnVScroll(nSBCode, nPos, pScrollBar);}2.1.5 有关图形显示的设计与实现为用户提供绘制矩形、椭圆、直线、自由曲线功能。