C++实验报告(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)函数。

cpp报告实验七_MFC_控件编程实验

cpp报告实验七_MFC_控件编程实验

实验七 MFC 控件编程实验一、实验目的(1) 熟悉Visual Studio 开发环境;(2) 掌握类向导的使用方法,熟练使用类向导进行消息映射,添加类的数据成员;(3) 掌握MFC 环境下标准控件的使用方法。

二、实验内容创建基于对话框的应用程序,在图形显示区绘制一个矩形并用单色画刷填充矩形内部。

通过滚动条控件设置填充颜色,并在编辑框中显示颜色的RGB值,通过单选按钮可以设置矩形的边框线型,“显示图形”复选框可以控制是否显示矩形。

设置完成后,单击“显示”按钮在“图形显示区”显示新的绘图效果。

单击“退出”按钮退出程序。

三、实验结果1 列表说明各个控件的属性设置,列出控件功能的实现代码;程序代码:DemoDlg.cpp:#include "stdafx.h"#include "Demo.h"#include "DemoDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifclass CAboutDlg : public CDialog{public:CAboutDlg();enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV supportprotected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()CDemoDlg::CDemoDlg(CWnd* pParent /*=NULL*/): CDialog(CDemoDlg::IDD, pParent), m_nLineStyle(0), m_nShow(TRUE), m_szRGB(_T("")){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CDemoDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);DDX_Radio(pDX, IDC_SOLID, m_nLineStyle);DDX_Check(pDX, IDC_SHOW, m_nShow);DDX_Control(pDX, IDC_RED, m_Red);DDX_Control(pDX, IDC_GREEN, m_Green);DDX_Control(pDX, IDC_BLUE, m_Blue);DDX_Text(pDX, IDC_RGB, m_szRGB);}BEGIN_MESSAGE_MAP(CDemoDlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_START, OnStart)ON_BN_CLICKED(IDC_STOP, OnStop)ON_WM_TIMER()ON_WM_HSCROLL()ON_BN_CLICKED(IDC_DOT, &CDemoDlg::OnBnClickedDot)ON_BN_CLICKED(IDC_SHOW, &CDemoDlg::OnBnClickedShow)ON_BN_CLICKED(IDC_SOLID, &CDemoDlg::OnBnClickedSolid)ON_BN_CLICKED(IDC_DASH, &CDemoDlg::OnBnClickedDash)ON_NOTIFY(NM_THEMECHANGED, IDC_RED, &CDemoDlg::OnNMThemeChangedRed) END_MESSAGE_MAP()BOOL CDemoDlg::OnInitDialog(){CDialog::OnInitDialog();ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}SetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small iconm_Red.SetScrollRange(0, 255);m_Green.SetScrollRange(0, 255);m_Blue.SetScrollRange(0, 255);m_Red.SetScrollPos(100);m_Green.SetScrollPos(100);m_Blue.SetScrollPos(100);m_szRGB = _T("RGB(100,100,100)");UpdateData(FALSE);return TRUE;}void CDemoDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}void CDemoDlg::OnPaint(){CPaintDC dc(this);CPen Pen2,*pOldPen;CBrush Brush, *poldbrush;UpdateData(TRUE);switch (m_nLineStyle){case 0:Pen2.CreatePen(PS_SOLID, 3, RGB(255,0,0));Brush.CreateSolidBrush(RGB(m_Red.GetScrollPos(),m_Green.GetScrollPos(),m_Blue.GetScrollPos()));break;case 1:Pen2.CreatePen(PS_DASH, 1, RGB(255, 0, 0));Brush.CreateSolidBrush(RGB(m_Red.GetScrollPos(),m_Green.GetScrollPos(),m_Blue.GetScrollPos()));break;case 2:Pen2.CreatePen(PS_DASHDOT, 1, RGB(255, 0, 0));Brush.CreateSolidBrush(RGB(m_Red.GetScrollPos(),m_Green.GetScrollPos(),m_Blue.GetScrollPos()));break;case 3:Pen2.CreatePen(PS_DASHDOTDOT, 1, RGB( 255, 0, 0));Brush.CreateSolidBrush(RGB(m_Red.GetScrollPos(),m_Green.GetScrollPos(),m_Blue.GetScrollPos()));break;}if (m_nShow == true){dc.SelectObject(&Brush);poldbrush = dc.SelectObject(&Brush);dc.SelectObject(&Pen2);pOldPen = dc.SelectObject(&Pen2);dc.Rectangle(20, 30, 410, 210);dc.SelectObject(pOldPen);dc.SelectObject(poldbrush);}}HCURSOR CDemoDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CDemoDlg::OnStart(){SetTimer(1,500,NULL);}void CDemoDlg::OnStop(){KillTimer(1);exit(0);}void CDemoDlg::OnTimer(UINT nIDEvent){CRect rt(15, 20, 420, 220);InvalidateRect(&rt);CDialog::OnTimer(nIDEvent);}void CDemoDlg::OnHScroll(UINT nSBCode, UINT nPos,CScrollBar* pScrollBar){switch (nSBCode){case SB_THUMBTRACK:pScrollBar->SetScrollPos(nPos);break;case SB_LINELEFT:pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() - 5);break;case SB_LINERIGHT:pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() + 5);break;case SB_PAGELEFT:pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() - 20);break;case SB_PAGERIGHT:pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() + 20);break;}m_szRGB.Format("RGB(%d,%d,%d)",m_Red.GetScrollPos(),m_Green.GetScrollPos(),m_Blue.GetScrollPos());UpdateData(FALSE);CDialog::OnHScroll(nSBCode, nPos, pScrollBar);}void CDemoDlg::OnBnClickedDot(){}void CDemoDlg::OnBnClickedShow(){// TODO: 在此添加控件通知处理程序代码}void CDemoDlg::OnBnClickedSolid(){// TODO: 在此添加控件通知处理程序代码}void CDemoDlg::OnBnClickedDash(){// TODO: 在此添加控件通知处理程序代码}void CDemoDlg::OnNMThemeChangedRed(NMHDR *pNMHDR, LRESULT *pResult){*pResult = 0;}g::OnHScroll(nSBCode, nPos, pScrollBar);}DemoDlg.h:#include "afxwin.h"#if !defined(AFX_DEMODLG_H__C9F67558_0B42_4FF2_B643_A3FB1D923475__INCLUDED_) #define AFX_DEMODLG_H__C9F67558_0B42_4FF2_B643_A3FB1D923475__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000class CDemoDlg : public CDialog{public:CDemoDlg(CWnd* pParent = NULL); // standard constructorenum { IDD = IDD_DEMO_DIALOG };protected:virtual void DoDataExchange(CDataExchange* pDX);protected:HICON m_hIcon;virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnStart();afx_msg void OnStop();afx_msg void OnTimer(UINT nIDEvent);DECLARE_MESSAGE_MAP()public:int m_nLineStyle;BOOL m_nShow;CScrollBar m_Red;CScrollBar m_Green;CScrollBar m_Blue;afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);CString m_szRGB;afx_msg void OnBnClickedDot();afx_msg void OnBnClickedShow();afx_msg void OnBnClickedSolid();afx_msg void OnBnClickedDash();afx_msg void OnNMThemeChangedRed(NMHDR *pNMHDR, LRESULT *pResult); };#endif2 运行结果3 总结类向导的功能和使用方法;类向导功能:它为VC提供了一个管理类的一个快捷的界面和快捷的方式,使我们能方便的管理成员变量、成员函数、消息映射等,而不用手动修改单个的代码文件.使用方法:在类视图选中要操作的类(DemoDlg),点击右键弹出类向导,在类向导中选中要操作的命令、消息或成员变量,点击添加处理程序或添加变量,然后在代码中相应位置编辑所需代码。

c面向对象程序设计MFC简单计算器实验报告

c面向对象程序设计MFC简单计算器实验报告

c面向对象程序设计M F C简单计算器实验报告Standardization of sany group #QS8QHH-HHGX8Q8-GNHHJ8-HHMHGN#计算机与信息工程学院《程序设计基础》课程设计报告题目名称:60.编写一个能实现简单功能的计算器学生姓名:刘沛东学生学号:专业班级:电子信息工程(1)班指导教师:高攀1 课程设计的题目编写一个能实现简单功能的计算器2 题目要求1. 有一个计算器图形。

2. 能实现加、减、乘、除及乘方的运算。

3. 当输入题目时,屏幕上要在指定位置上显示出相应的题目内容,且相应的数字键要改变颜色例如:输入数字1 时,在计算器图形上的1键变为红色。

4. 屏幕、图形颜色、形状自定3 总体设计总体框架图1 系统框架系统功能说明在VC++中绘制计算器界面,各控件的设置对0~9控件设定相应的ID和其他属性:图2 “1”控件设置对“+、-、*、\”控件设定相应的ID和其他属性:图2 “+”控件设置对其它控件设定相应的ID和其他属性:图3 其它控件设置主要使用到Layout菜单中的Align功能对各个按钮进行对其,使界面更加整洁。

拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息。

4 程序详细设计系统主调模块图5 程序流程图各模块详细设计建立的变量,控件的命名,对应的消息处理函数对应表double poz; 按钮的处理函数void CCalcDlg::OnPt(){point_flag=TRUE; && buffer[i+1]==0)之前那位}m_Dis=strtod(buffer,NULL);整个大的程序的实现分8个功能,每个功能都通过一个相应的函数来实现.在调试时分别进行调试,使得调试更方便些.在编写各个函数只是按着题目要求的去完成,后来经指导老师指导后,发现了很多自己欠缺的地方,又一次将程序整体进行调试.最后把程序完善了许多。

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实现简单画图形程序

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画简单点线面界面实验报告

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

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所示(其中线宽菜单为弹出菜单,只需在菜单项目属性中的弹出选项前打勾即可,分隔线亦只需在菜单项目属性中选中分隔符选项即可)。

图4 添加菜单项图5 设置菜单ID表1 菜单项对应ID 建立类向导,在视图类CDrawView 中,对各菜单项添加对应的COMMAND 消息处理函数,部分菜单项还添加对应的UPDATE_COMMAND_UI 消息函数,如图6所示。

菜单名ID 菜单名 ID 菜单名 ID直线ID_LINE 线宽1 ID_W1 实线 ID_SOLID 矩形ID_RECT 线宽2 ID_W2 虚线 ID_DASH 椭圆ID_ELLIPS E 线宽3 ID_W3 点线 ID_DOT 颜色ID_COLOR 线宽4 ID_W4 点段线 ID_DASHDOT 填充色ID_FILLCO LOR 线宽5 ID_W5图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; //把鼠标所在坐标赋给起点坐标opointReleaseCapture(); //释放坐标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; //把鼠标所在点坐标赋给终点坐标cpointCClientDC 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 paintingCPen 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.LineTo(cpoint.x,cpoint.y); //绘制直线,从opoint到cpoint连线}if(2==shape)///画矩形{dc.Rectangle(opoint.x,opoint.y,cpoint.x,cpoint.y); //绘制矩形}if(3==shape)//画椭圆{dc.Ellipse(opoint.x,opoint.y,cpoint.x,cpoint.y);//绘制椭圆}}8.菜单勾选函数void CDrawView::OnUpdateLine(CCmdUI* pCmdUI){pCmdUI->SetCheck(shape==1); //shape为1时,直线选项前打上勾}void CDrawView::OnUpdateRect(CCmdUI* pCmdUI){pCmdUI->SetCheck(shape==2); //shape为2时,直线选项前打上勾}void CDrawView::OnUpdateEllipse(CCmdUI* pCmdUI){pCmdUI->SetCheck(shape==3); //shape为3时,直线选项前打上勾}void CDrawView::OnUpdateW1(CCmdUI* pCmdUI){pCmdUI->SetRadio(w==1); //当线宽为1时,此选项前标有圆点}void CDrawView::OnUpdateW2(CCmdUI* pCmdUI){pCmdUI->SetRadio(w==2); //当线宽为2时,此选项前标有圆点}void CDrawView::OnUpdateW3(CCmdUI* pCmdUI){pCmdUI->SetRadio(w==3); //当线宽为3时,此选项前标有圆点}void CDrawView::OnUpdateW4(CCmdUI* pCmdUI){pCmdUI->SetRadio(w==4); //当线宽为4时,此选项前标有圆点}void CDrawView::OnUpdateW5(CCmdUI* pCmdUI){pCmdUI->SetRadio(w==5); //当线宽为5时,此选项前标有圆点}void CDrawView::OnUpdateW6(CCmdUI* pCmdUI){pCmdUI->SetRadio(w==6); //当线宽为6时,此选项前标有圆点}void CDrawView::OnUpdateSolid(CCmdUI* pCmdUI){pCmdUI->SetRadio(penstyle==PS_SOLID); //当线型为实线时,此选项前标有圆点}void CDrawView::OnUpdateDash(CCmdUI* pCmdUI){pCmdUI->SetRadio(penstyle==PS_DASH); //当线型为虚线时,此选项前标有圆点}void CDrawView::OnUpdateDot(CCmdUI* pCmdUI){pCmdUI->SetRadio(penstyle==PS_DOT); //当线型为点线时,此选项前标有圆点}void CDrawView::OnUpdateDashdot(CCmdUI* pCmdUI){pCmdUI->SetRadio(penstyle==PS_DASHDOT); //当线型为点段线时,此选项前标有圆点}如有侵权请联系告知删除,感谢你们的配合!。

相关文档
最新文档