MFC画笔程序实验报告

合集下载

vc++基于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》实验报告模板

贵州大学实验报告学院:梁玉涛专业:计算机科学与技术班级:计科职091 姓名梁玉涛学号0920020217 实验组 1 实验时间2011.10.25 指导教师曾劼成绩实验项目名称使用计算数据画直方图实验目的1.了解图形设备接口GDI编程;2.学会应用GDI编写应用程序;3.实现使用计算数据画直方图。

实验要求1.了解有关GDI的相关知识及使用;2.根据实验指导书完成实验内容。

实验原理图形设备接口GDI(Graphics Device Interface)是一个系统库,允许对系统的硬件进行独立于设备的访问。

GDI的核心是设备上下文类DC(Device Contex):设置绘图属性和驱动设备绘图的方法。

封装了Windows API中的画图函数,设备上下文是内存中的一个对象,设备可以是屏幕或打印机。

实验仪器计算机、VC++ 6.0实验步骤1.使用AppWixard生成单文档工程Plot2.在PlotDoc.h中类CPlotDoc的定义之前加入类Max的定义3.在PlotDoc.cpp的文件尾部加入类Max的实现部分4.为CPlotDoc类增加一个公有的void类型的成员函数Find和一个公有int数据成员数组m_num[5],使用类产生对象并计算它们的最大值,将它们转换成int,存入整数数组m_num。

5.为CPlotDoc类的成员函数OnNewDocument增加调用语句准备数据。

6.在视类中画图写字;7.运行程序,并观察结果。

1实验使用计算数据画直方图内容实验数据实验总结指导教师意见签名:年月日。

mfc简单绘图程序报告

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绘图程序实验报告

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)

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 Windows 程序设计实验报告(1)

MFC Windows 程序设计实验报告(1)
pDC->Ellipse(pDoc->m_Rectag[i].rect);
pDC->SelectObject(oldPen);
pDC->SelectObject(oldBrush);
}
}
四、实验结果(反思)
实验完成情况:完成基本完成未完成
int rnd=rand()%50+5;
intr,g,b;
r=பைடு நூலகம்and()%256;
g=rand()%256;
b=rand()%256;
aa.color=RGB(r,g,b);
CRect rect(point.x-rnd,point.y-rnd,point.x+rnd,point.y+rnd);
aa.rect=rect;
CJkxDoc::CJkxDoc()
{m_Rectag.SetSize(256,256);}
#endif // _MSC_VER > 1000
struct shap//定义填充颜色的函数
{
CRect rect;
int color;
};
5、在视图类的OnLButtonDown函数中设置指向文档的指针并通过该指针获取文档的成员。
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
int red=rand()%256,green=rand()%256,blue=rand()%256;
int width=2;
for(int i=0;i<pDoc->m_Rectag.GetSize();i++)
#include <afxtempl.h>

实验四 MFC图形绘制编程实验

实验四 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画图实验报告
{
// 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;

C++ MFC 实验报告

C++ MFC 实验报告

MFC实验报告实验一1.1显示一首诗。

在view 类的ondraw 函数中添加代码如下:void CEx11View::OnDraw(CDC* pDC){CEx11Doc* pDoc = GetDocument();ASSERT_V ALID(pDoc);if (!pDoc)return ;// TODO: 在此处为本机数据添加绘制代码CString s[4]; s[0]="人生得意须尽欢,莫使金樽空对月。

";s[1]="两岸青山相对出,孤帆一片日边来。

";s[2]="孤帆远影碧空尽,惟见长江天际流。

";s[3]="飞流直下三千尺,疑是银河落九天。

";for (int i=0;i<4;i++){pDC->TextOut(100,100+20*i,s[i]);} } 1.2画一个坐标系,画函数sin(),(2,2)y x x ππ=∈-的图像。

在view 类的ondraw 函数中添加代码如下:void CEx12View::OnDraw(CDC* pDC){CEx12Doc* pDoc = GetDocument();ASSERT_V ALID(pDoc);if (!pDoc)return ;// TODO: 在此处为本机数据添加绘制代码 pDC->SetMapMode(MM_TEXT);pDC->SetWindowOrg(CPoint(-370,-250));pDC->MoveTo(0,0); pDC->LineTo(420,0); pDC->MoveTo(0,0);pDC->LineTo(0,-220);pDC->MoveTo(0,0);pDC->LineTo(-420,0);pDC->MoveTo(0,0);pDC->LineTo(0,220);// pDC->TextOut(50,10,"1");CStringArray p;p.SetSize(8,-1);p[0]="-1";p[1]="-2";p[2]="-3";p[3]="-4";p[4]="-5";p[5]="-6";p[6]="-7";p[7]="-8";for(int i=1;i<=8;i++){pDC->MoveTo(i*(-50),-10);pDC->LineTo(i*(-50),+10);pDC->TextOut(i*(-50),10,p[i-1]);}CStringArray s;s.SetSize(8,-1);s[0]="1";s[1]="2";s[2]="3";s[3]="4";s[4]="5";s[5]="6";s[6]="7";s[7]="8";for(int i=1;i<=8;i++){pDC->MoveTo(i*50,-10);pDC->LineTo(i*50,+10);pDC->TextOut(i*50,10,s[i-1]);}int x,y,j;float a;pDC->MoveTo(0,0);for(j=0;j<=315;j++){x=j;a=j;y=-50*sin(a/50);pDC->LineTo(x,y);}pDC->MoveTo(0,0);for(j=0;j>=-315;j--){x=j;a=j;y=-50*sin(a/50);pDC->LineTo(x,y);}}1.3显示资源中的一幅位图。

实验一 基于MFC的绘图基础

实验一 基于MFC的绘图基础

实验一基于MFC的绘图基础
一、实验目的与要求
1、熟悉Visual C++的界面
2、掌握MFC的上机操作步骤
3、了解计算机的设备坐标系
4、理解计算机图形显示的像素概念
5、理解RGB色彩模型
6、掌握MFC中画点函数的用法
7、掌握MFC中画笔的用法
8、掌握利用画笔完成直线的绘制的方法
二、实验内容
1、利用应用程序向导生成单文档的应用程序。

工程名用中文名;在CMyView类中的OnDraw函数中添加绘图的相应代码,由于OnDraw函数是系统框架自动生成的,所以编译后执行程序就可以马上看到绘图的成果。

2、进行代码添加。

1.用SetPixel函数画点(这里的点就是像素),利用for循环连续地画点就形成一条直线,试分别作出水平,垂直和45°的三条直线,直线用渐变的颜色显示出来(原理是对每个点设置不同的颜色,对RGB色彩模型的参数值做递增或递减);
2.利用MFC中的画笔来画直线,尝试画笔的不同样式;首先定义一个画笔,然后画线用MoveTo和LineTo函数完成。

三、实验成果
水平的直线(红色渐进)如下图:
垂直的直线(绿色渐进)如下图:
45°倾斜的直线(蓝色渐进)如下图:
2画笔画直线。

实验一 MFC基本绘图

实验一 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画图软件

计算机程序设计实践  MFC画图软件
m_nDrawType=6;
}
void CCGraphicsView::OnPie()
{
// TODO: Add your command handler code here
m_nDrawType=7;
}
void CCGraphicsView::OnRoundrect()
{
// TODO: Add your command handler code here
{
// TODO: Add your command handler code here
CSettingDlg dlg;
dlg.m_nLineWidth=m_nLineWidth;/*保存用户设定的值*/
dlg.m_nLineStyle=m_nLineStyle;
if (IDOK==dlg.DoModal())
目的:
1.掌握用VC++6.0开发环境开发软件的方法;
2.熟悉获得帮助的方法;
3.掌握SDI应用程序结构,熟悉基于对话框的应用程序编程方法;
4.掌握用资源编辑器进行图标,菜单,工具栏,对话框等资源的编辑;
5.掌握对话框,常用控件的使用方法;
6.熟悉文档/视图结构,掌握文档和视图的相互控制技巧;
2.需求分析
计算机程序设计实践
课程设计报告
班级_计算机科学与技术1303班
学号130405320
姓名__________韦昌杆___________
指导教师___________杨威_____________
2015年1月8日
交互式绘图程序
1.引言
计算机的发展也是计算机语言的发展得到了很大的提高,人们的生活中离不 开图像,除了我们可以用铅笔在纸上画图外,我们也可以在电脑上绘制我们的想象,本实验就是基于VC++的一个小型的绘图软件。

北邮程序设计实践报告mfc画图

北邮程序设计实践报告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.直线、矩形、椭圆扇形的绘制对于直线、矩形和椭圆,在绘制时都可有两点来确定其图形。

C++实验报告(MFC简单画图程序)

C++实验报告(MFC简单画图程序)

C++实验报告(MFC简单画图程序)VC++程序设计实验报告一、实验目的掌握MFC编程二、实验内容用MFC向导创建单文档应用程序,一个简单的画图程序。

使用C++语言实现使用VC++6.0集成开发环境开发使用MFC应用程序开发框架三、实验步骤基本功能描述1. 打开exe文件,在绘图下拉菜单中可分别设置绘制的图形形状,如直线、曲线、矩形及椭圆,线宽选项,有1-6可供选择,线型选项有实线、虚线、点线和点段线供设置,还可以设置线色以及填充色,通过弹出的颜色对话框选择需要的颜色,如果不选择线宽、线色以及填充色,则按默认的画笔,画刷来绘制选择的图形。

2. 选择好图形后,通过鼠标可以绘制出相应的直线,矩形或椭圆,鼠标的按下确定图形的起点,鼠标的拖动则确定了图形的终点,即通过鼠标的拖动来决定图形的大小,当鼠标弹起,此图形则绘制完毕。

设计思路1. 对需要用到的变量进行初始化。

2. 选择相应的图形之后就响应相应的消息处理函数,给shape赋对应的值。

选择不同的线宽,线色与填充色,即可改变画笔或画刷的属性。

3. 鼠标的按下响应函数OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标,鼠标的拖动响函数OnMouseMove()改变终点的坐标,鼠标的弹起响应OnLButtonUp(),确定终点坐标,刷新,得到绘制图形。

4. 选择图形或其它属性,可进行下一次绘制。

软件设计A 设计步骤1.创建单文档创建一个MFC AppWizard[exe]工程,命名为“Draw”,如图1所示,并创建单文档,如图2所示。

创建成功后,系统自动生成相应的类,如图3所示。

图1 创建工程图2 创建单文档图3 生成类2.编辑菜单添加需要的菜单项,如图4所示;并在菜单的属性中设定好所对应的ID,如图5所示,各项菜单对应的ID如表1所示(其中线宽菜单为弹出菜单,只需在菜单项目属性中的弹出选项前打勾即可,分隔线亦只需在菜单项目属性中选中分隔符选项即可)。

MFC画图程序(含源文件)

MFC画图程序(含源文件)

面向对象课程作业我做的是画笔程序,首先把作业要求写在开头。

作业要求:1、程序界面参考Microsoft画图程序。

2、能够支持画直线、自由连线(随鼠标移动连线)、实体圆形、实体矩形、实体椭圆3、支持区域选中(通过鼠标拖拽方框选中),并删除选中区域内所画的形状。

4、支持各种笔形画图时的前景和背景色。

5、支持图擦功能,选中图擦时,随着图擦的移动,根据图擦的大小,将图擦经过的区域中的形状相关部分清除。

6、支持打印、打印预览功能,并保持图片所见即所得。

支持将所画的内容保存为文件,格式为BMP格式。

本设计报告包括以下几部分:一.程序实现的功能二.程序功能的具体实现方法三.程序示例说明四.课程设计的体会五.本程序的不足之处六.本程序参考文献一.程序实现的功能程序所用开发工具: Visual C++ 6.0编程工具。

实现功能:能够支持画直线、自由连线(随鼠标移动连线)、实体圆形、实体矩形、实体椭圆;支持区域选中(通过鼠标拖拽方框选中),并删除选中区域内所画的形状;支持各种笔形画图时的前景和背景色;支持图擦功能,选中图擦时,随着图擦的移动,根据图擦的大小,将图擦经过的区域中的形状相关部分清除;支持打印、打印预览功能;并保持图片所见即所得;支持将所画的内容保存为文件,格式为BMP格式。

另外本程序还支持任意设置画笔的颜色,设置画笔笔画的宽度(粗细),支持当窗口发生重绘时将原来所绘的图形在新窗口中重绘出来。

二.问题分析按照程序设计实现功能的要求,其中应该有以下几部分,划线的实现部分可以在鼠标单击响应函数中实现,其中有:鼠标左键按下,鼠标左键移动,鼠标左键弹起等;设置颜色部分应该创建一个颜色设置对话框,这可用MFC自带的类来实现,为此我们在菜单中添加一个设置菜单,并且下面添加颜色设置菜单项,并且对此菜单项的添加命令响应函数,在其中创建颜色对话框,并且将我们选择的颜色保存到我们预定义的对象中去;同理笔画宽度和背景色的设置也是如此;其中在背景色的设置中当我们选择某种颜色设置背景色时,程序将会刷新窗口,并且用新的背景色填充视口背景。

北邮程序设计实践mfc绘图程序报告

北邮程序设计实践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课题的难点和关键点关键点之一:椭圆的绘制。

MFC画笔程序实验报告

MFC画笔程序实验报告

功能说明1、在画图之前,点菜单【画笔】,设置画笔之后才能绘图图1、画笔设置2、左侧工具条依次对应直线、自由画线、实体矩形、实体圆形、实体椭圆、选中区域、擦除功能图2、图形绘制及编辑3、选中区域后删除,点击菜单【编辑\删除选定区域】,即可完成删除功能4、颜色设置,点击菜单【颜色】,弹出颜色对话框,选中颜色图3、颜色设置5、背景设置,点击菜单【背景设置】,弹出对话框,选择“是”加载默认位图资源图4、背景设置6、点击保存按钮,生成图片保存到工程文件的文件夹中问题分析建立MFC单文档工程文件:Draw一、画图程序支持画直线、自由连线(随鼠标移动连线)、实体圆形、实体矩形、实体椭圆。

在主窗口中添加工具条,工具条上有直线、自由连线、实体圆形、实体矩形、实体椭圆的的图标,命名为IDR_DRAWFRAME,在CmainFrame的OnCreat函数中将工具条加载上去,函数名为:LoadToolBar二、支持区域选中(通过鼠标拖拽方框选中),并删除选中区域内所画的形状。

鼠标拖拽方框选中:可以设计绘制为背景为透明色的矩形删除选中区域即将选中矩形上的图像去掉,变为系统白色区域,即:设计矩形填充为白色三、支持各种笔形画图时的前景色和背景色前景色:在菜单中添加颜色菜单,单击颜色菜单,弹出颜色选择框,选择颜色对画笔的颜色进行设置。

背景色:在菜单栏中添加背景设置按钮,选择背景设置,则默认设置图画位图背景为选定的文件四、支持图擦功能,选中图擦时,随着图擦的移动,根据图擦的大小,将图擦经过的区域中的形状相关部分清除。

在工具条上添加擦出按钮,随着鼠标的移动,鼠标经过的区域图形消失,采用InvalidateRect函数、五、支持打印、打印预览功能,并保持图片所见即所得。

在视图窗口绘制图形是在逻辑坐标系中展示的,而打印设备对应的是物理坐标系。

为了实习所见即所得,需要继续逻辑坐标系到物理坐标系的转换。

六、支持将所画的内容保存为文件,格式为BMP格式。

MFC绘图 实验报告

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实验四

实验内容1:编写一个单文档界面应用程序,用不同样式、宽度的画笔绘制图。

利用appwizard创建一个单文档界面应用程序,项目名为10_1。

在类10_1View的成员函数ondraw中添加如下黑体代码。

void CMy10_1View::OnDraw(CDC* pDC){CMy10_1Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here// TODO: add draw code for native data hereCPen*pOldPen,NewPen;int nPenStyle[]={PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_DASHDOTDOT,PS_NULL,PS_INSIDEFRAME};pDC->TextOut(80,10,"用不同样式的画笔画圆");CRect rect1(50,50,320,320);for (int i=0;i<7;i++){if (NewPen.CreatePen(nPenStyle[i],1,RGB(0,0,0))) //用不同样式创建画笔{pOldPen=pDC->SelectObject(&NewPen); //将画笔选入设备环境pDC->Ellipse(&rect1);rect1.DeflateRect(15,15,15,15); //缩小椭圆外接矩形pDC->SelectObject(pOldPen); //恢复原来的画笔NewPen.DeleteObject(); //删除GDI对象}else{MessageBox("创建画笔失败!");}}pDC->TextOut(400,10,"用不同宽度的画笔画圆");CRect rect2(350,50,620,320);for (i=0;i<7;i++){if (NewPen.CreatePen(PS_SOLID,1+i,RGB(0,0,0))){pOldPen=pDC->SelectObject(&NewPen);pDC->Ellipse(&rect2);rect2.DeflateRect(15,15,15,15);pDC->SelectObject(pOldPen);NewPen.DeleteObject();}elseMessageBox("创建画笔失败!");}}程序运行结果如下:实验2:绘图模式使用示例。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

功能说明1、在画图之前,点菜单【画笔】,设置画笔之后才能绘图图1、画笔设置2、左侧工具条依次对应直线、自由画线、实体矩形、实体圆形、实体椭圆、选中区域、擦除功能图2、图形绘制及编辑3、选中区域后删除,点击菜单【编辑\删除选定区域】,即可完成删除功能4、颜色设置,点击菜单【颜色】,弹出颜色对话框,选中颜色图3、颜色设置5、背景设置,点击菜单【背景设置】,弹出对话框,选择“是”加载默认位图资源图4、背景设置6、点击保存按钮,生成图片保存到工程文件的文件夹中问题分析建立MFC单文档工程文件:Draw一、画图程序支持画直线、自由连线(随鼠标移动连线)、实体圆形、实体矩形、实体椭圆。

在主窗口中添加工具条,工具条上有直线、自由连线、实体圆形、实体矩形、实体椭圆的的图标,命名为IDR_DRAWFRAME,在CmainFrame的OnCreat函数中将工具条加载上去,函数名为:LoadToolBar二、支持区域选中(通过鼠标拖拽方框选中),并删除选中区域内所画的形状。

鼠标拖拽方框选中:可以设计绘制为背景为透明色的矩形删除选中区域即将选中矩形上的图像去掉,变为系统白色区域,即:设计矩形填充为白色三、支持各种笔形画图时的前景色和背景色前景色:在菜单中添加颜色菜单,单击颜色菜单,弹出颜色选择框,选择颜色对画笔的颜色进行设置。

背景色:在菜单栏中添加背景设置按钮,选择背景设置,则默认设置图画位图背景为选定的文件四、支持图擦功能,选中图擦时,随着图擦的移动,根据图擦的大小,将图擦经过的区域中的形状相关部分清除。

在工具条上添加擦出按钮,随着鼠标的移动,鼠标经过的区域图形消失,采用InvalidateRect函数、五、支持打印、打印预览功能,并保持图片所见即所得。

在视图窗口绘制图形是在逻辑坐标系中展示的,而打印设备对应的是物理坐标系。

为了实习所见即所得,需要继续逻辑坐标系到物理坐标系的转换。

六、支持将所画的内容保存为文件,格式为BMP格式。

在菜单【文件】中有“保存按钮”,点击此按钮,将所绘图形保存为.bmp文件。

MFC没有提供文件的保存函数,需要自己设计算法,以完成.bmp文件的保存。

首先当前显示的屏幕位图拷贝到BITMAP中,然后将BITMAP保存到内存中。

方案设计一、画图程序支持画直线、自由连线(随鼠标移动连线)、实体圆形、实体矩形、实体椭圆。

实现步骤:(1)在主窗口中添加工具条,工具条上有直线、自由连线、实体圆形、实体矩形、实体椭圆的的图标,命名为IDR_DRAWFRAME,在CmainFrame的OnCreat函数中将工具条加载上去,函数名为:LoadToolBar (2)直线图标ID号为:ID_SLINE;自由连线图标ID号为:ID_CLINE;实体圆形ID号为:ID_ROUND 实体椭圆图标ID号为:ID_ELLIPSE实体矩形ID号为:ID_RECTANGL(3)在CDrawView类中添加m_nDrawType变量控制画图类型,添加m-ptStart变量,保存鼠标起始点。

为以上ID号添加COMMAND函数,分别为:OnSline() 、OnCline() 、OnRound()、OnRectangle() 、OnEllipse()。

函数中控制m_nDrawType的值,以控制图形类型(4)在CDrawView类中添加成员函数OnLButtonDown、OnLButtonUp和OnMouseMove,OnLButtonUp中完成直线、实体圆形、实体矩形、实体椭圆的绘制;OnMouseMove中完成自由连线的绘制。

(5)为保证视图窗口刷新时,图形能够再现,添加类CGraph,此类中包含变量nFlags(控制OnMouseMove函数)、m_nDrawType(绘图类型)以及m-ptStart和m-ptEnd(鼠标起始点)(6)在CDrawView中添加CptrArray类型变量m_ptArray,在OnMouseMove,OnLButtonUp函数中将nFlags、m_nDrawType以及m-ptStart和m-ptEnd保存到中。

(7)在OnDraw函数中利用m_ptArray中的信息,将视图中的图形再现二、支持区域选中(通过鼠标拖拽方框选中),并删除选中区域内所画的形状。

实现步骤:(1)在工具条IDR_DRAWFRAME上添加区域选中图标,ID号为ID_SELECT。

当按下此图标时,在视图区拖拽,绘制线条为PS_DOT型的矩形框,填充色为透明色。

(透明色背景设置问题)(2)在编辑菜单中设置删除选项,ID号为ID_DELETE,在CdrawView中添加删除按钮对应的函数OnDelete,函数完成任务:在拖拽形成的矩形区内绘制白色背景、白色画笔的矩形,将此处绘制的图形变为白色。

此时注意:OnDraw函数中,重绘也要完成相同操作。

三、支持各种笔形画图时的前景色和背景色(1)MFC中有默认的颜色对话框,在菜单中设置一个颜色菜单,其ID号为:IDM_COLOR_SETTING,对此ID号设置函数,在此函数中控制颜色选择。

为CdrawView函数添加变量COLOREF型变量m_clr,用于存储获得的颜色,将次颜色赋给画笔。

(2)背景色设置:添加bitmap资源,将.bmp文件加载到资源中。

在菜单栏设置“背景设置”菜单选项,其ID号为:ID_BACKGROUND_SETTING,对此ID号设置函数,选择是否加载位图资源。

选择加载后,将上述图片加载为画图板背景四、支持图擦功能,选中图擦时,随着图擦的移动,根据图擦的大小,将图擦经过的区域中的形状相关部分清除。

在工具条中添加擦除按钮,其ID号设为ID_ERASE,在CdrawView中响应按钮。

在LbuttonUp函数中对此函数进行处理,选择宽度为5的区域,利用InvalidateRect函数对此区域进行处理,即完成了擦除的功能。

五、支持打印、打印预览功能,并保持图片所见即所得。

Cview类在进行显示和打印之前都会调用virtual void OnPrepareDC(CDC* pDC, CprintInfo * pInfo = NULL)这个虚函数准备设备上下文,可以在Cview类中重载OnPrepareDC进行坐标转换。

这样点击打印预览之后,图形就不在是原来那样小,而是和所绘图形大小相当。

六、支持将所画的内容保存为文件,格式为BMP格式。

响应菜单中的“保存”功能,在View类中创建OnFileSave函数,完成图形保存功能。

建立OnCopyScreen和OnSavePicture函数,OnCopyScreen函数将屏幕设备描述表拷贝到内存设备描述表中,并返回图片句柄;OnSavePicture将内存中的描述表示出来。

算法选择一、绘制直线、自由连线、实体圆形、实体矩形、实体椭圆(1)利用MFC的CClient类进行图形的绘制(2)几种不同的绘制方式,要求可以改变画笔颜色、线宽、画刷等元素,由于switch……case的case中不能设置变量,因此采用if语句进行不同绘图种类的判别(3)在OnLButtonUp中响应直线、实体圆形、实体矩形、实体椭圆以及区域选择的功能;在OnMouseMove中响应自由画线、擦除功能;(4)实体圆形绘制方法:记录鼠标的始点m_ptStart和终点m_ptEnd,计算半径R,得到外切正方形,以m_ptStart和m_ptEnd中点为圆心,以所得正方形为半径画圆形,如下图所示为所画原理图5,圆形的绘制原理二、擦除和选择区域删除功能(1)擦除:选择画笔宽度为5,随着鼠标移动,将经过区域用InvalidateRect 函数处理(2)区域选择:用透明、画笔为虚线绘制矩形(3)如果上一操作为区域选择,点击【编辑\删除选中区域】,将此区域用白色矩形填充,即删除了选中的区域三、背景色和前景色设置(1)前景色即为图形画笔、填充色的设置。

利用CcolorDialog获取COLORREF 型变量m_clr的值,用此值控制画笔和画图刷的颜色(2)背景色:在资源中添加位图资源,利用LoadBitmap加载位图资源,设置背景色四、支持打印、打印预览功能,并保持图片所见即所得。

支持将所画的内容保存为文件,格式为BMP格式。

(1)视图区绘制的图形是在逻辑坐标系下进行的,打印功能是在物理坐标系中进行的,如果不进行坐标系转换,所得图形将会比绘制图形小很多。

因此,在打印之前,需要进行逻辑坐标到物理坐标的转换,响应OnPrepareDC利用SetMapMode进行转换,并这只比例(2)文件保存功能:响应【文件\保存】的ID,完成文件的保存设置。

编程实现一、设置变量m_nDrawType,直线、自由连线、实体圆形、实体矩形、实体椭圆、选择区域、擦除分别对应m_nDrawType为整数1-7二、(1)画直线dc.MoveTo(m_ptStart);dc.LineTo(point);(2)画曲线dc.MoveTo(m_ptStart); //画曲线dc.LineTo(point);m_ptStart=point;(3)画实体圆形center.x=(m_ptStart.x+point.x)/2;center.y=(m_ptStart.y+point.y)/2;R=GetR(m_ptStart,point);dc.Ellipse((center.x-R),(center.y-R),(center.x+R),(center.y+R));获取半径函数int CDrawView::GetR(CPoint m_ptOrigin, CPoint m_ptEnd){int LineLength;int R;LineLength=(int)sqrt((m_ptEnd.x-m_ptOrigin.x)*(m_ptEnd.x-m_ptOrigin.x)+(m_ptEnd.y-m_ptOrigin.y)*(m_ptEnd.y-m_ptOrigin.y));R=LineLength/2;return R;}(4)实体矩形dc.Rectangle(CRect(m_ptStart,point));(5)实体椭圆dc.Ellipse(CRect(m_ptStart,point));(6)选择区域//选择透明画刷CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));dc.Rectangle(CRect(m_ptStart,point));(8)擦除操作CRect rect(point.x,point.y,point.x+5,point.y+5);InvalidateRect(&rect);三、删除操作if(6==m_nDrawType) //如果选中区域{//选择透明画笔CPen pen(m_nLineStyle,0,RGB(255,255,255));CPen *pOldPen=dc.SelectObject(&pen);dc.Rectangle(CRect(m_ptStart,ptEnd));dc.SelectObject(pOldPen);//保存画图信息CGraph *pGraph=new CGraph(m_clr,m_nLineStyle,0,0,m_nDrawType,m_ptStart,ptEnd);m_ptArray.Add(pGraph);}四、设置画笔void CDrawView::OnPenSetting(){// TODO: Add your command handler code hereCPenSettingDlg dlg;if(IDOK==dlg.DoModal()){m_nLineWidth=dlg.m_nLineWidth;m_nLineStyle=dlg.m_nLineStyle;}}五、颜色设置void CDrawView::OnColorSetting(){// TODO: Add your command handler code hereCColorDialog dlg;if(IDOK==dlg.DoModal()){m_clr=dlg.m_cc.rgbResult;}}六、设置背景色void CDrawView::OnBackgroundSetting(){// TODO: Add your command handler code hereif(IDYES==MessageBox("是否使用图片位图?",NULL,MB_YESNO)){m_nDrawType=8;CBitmap bitmap;//加载位图资源bitmap.LoadBitmap(IDB_BACK);//创建画刷CBrush brush(&bitmap);CRect rect(0,0,2000,2000);CClientDC dc(this);dc.FillRect(&rect,&brush);CGraph *pGraph=new CGraph(m_clr,m_nLineStyle,0,0,m_nDrawType,m_ptStart,ptEnd);m_ptArray.Add(pGraph);}}七、实现所见即所得功能void CDrawView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo){// TODO: Add your specialized code here and/or call the base classCView::OnPrepareDC(pDC, pInfo);pDC->SetMapMode(MM_ANISOTROPIC); //转换坐标映射方式CSize size = CSize(800, 560);pDC->SetWindowExt(size);int xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX);int yLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSY);long xExt=(long)size.cx*xLogPixPerInch/96 ;long yExt=(long)size.cy*yLogPixPerInch/96;pDC->SetViewportExt((int)xExt,(int)yExt);}八、文件保存功能//文件保存void CDrawView::OnFileSave(){// TODO: Add your command handler code hereCRect rect;GetWindowRect(&rect);HBITMAP hMap=OnCopyScreen(rect);OnSavePicture(hMap,"new.bmp");}。

相关文档
最新文档