MFC绘图程序实验报告

  • 格式:doc
  • 大小:4.16 MB
  • 文档页数:16

《面向对象课程设计》实验报告

题 目

学生姓名

学 号

专业班级

指导老师

20 年1月

画图软件

一. 实验要求

该程序设计是用MFC开发绘图软件。此绘图软件可进行自由绘图和画规定图形,并能对图形进行颜色笔宽的编辑。同时增加了添加背景与打开绘图文件的功能。

这个程序除了一般的绘制图形功能外还增加了自定义背景功能,使得用户可以简单便捷的进行切换背景操作,以达到美观的效果。在背景上画图更加直接与便捷。

二、实验程序设计及结构

1、需求分析(功能、类、成员)

这个程序需要实现自由绘图的功能,并能绘制规定图形且能为图形变换颜色与笔宽。其中主要在Cview类下进行操作。

其中成员函数有:

afx_msg void Onfromfile(); //打开视图文件

afx_msg void Onwidth2(); //设置笔宽2

afx_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(); //设置笔宽3

afx_msg void Onwidth4(); //设置笔宽10

afx_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) 总体结构

程序有五个菜单项,选择颜色、选择笔宽、画规定图形、自由绘图、插入背景。还包含一个颜色选择对话框。

ii)数据结构

本设计的设计结构比较简单,就一个操作界面,在视图类Cview中进行操作,主要是开发鼠标操作的响应函数。

三、设计过程

1、首先建立一个MFC开发对话框,命名为“huatu1”。

2、添加菜单资源,选择颜色、选择笔宽、画规定图形、自由绘图、插入背景。

(1)选择颜色.

在选择颜色菜单下添加颜色菜单选项

(2)选择笔宽

在选择笔宽菜单下添加2、3、10号笔宽选项

(3)规定图形

在图形选项下添加矩形、圆选项

(4)自由绘图

在自由绘图选项下添加开始绘图选项

(5)插入背景

在视图选项下添加插入背景选项

3. 在类ChuatuiView中增加变量并初始化m_show_type(0)。

当m_show_type为1时,自由绘图项为选中状态,允许自由画图。

当m_show_type为4时,图形选项为选中状态,允许画规定图形。

在允许画规定图形中添加变量m_draw_type

当m_draw_type为1时,画矩形项为选中状态,允许画矩形。

当m_draw_type为4时,画圆项为选中状态,允许画圆。

4.添加事件处理程序

(1)载入背景

在onDraw函数中添加如下代码

Chuatu1Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if (!pDoc)

return;

CImage img;

HRESULT hr = img.Load(filename);

ASSERT(SUCCEEDED(hr));

;CRect r(CPoint(0,0),CPoint(img.GetWidth(),img.GetHeight())); 得到大小尺寸

img.StretchBlt (*pDC,r,r,SRCCOPY); //调整宽度适应窗口

并在构造函数出进行变量初始化

filename(_T("..\\123.jpg"))

(2)打开绘图文件插入背景

void Chuatu1View::Onfromfile()

{

CFileDialog fileDlg(TRUE);

fileDlg.m_ofn.lpstrFilter=L"jpg Documents"

L"(*.jpg)\0*.jpg\0\0";

if(fileDlg.DoModal( )==IDOK)

{

filename=fileDlg.GetPathName ( );

}

InvalidateRect(NULL);// TODO: 在此添加命令处理程序代码

}

(3)添加笔宽响应函数

void Chuatu1View::Onwidth2()

{

m_penwidth=5;

Invalidate();// TODO: 在此添加命令处理程序代码

}

(4)添加选择颜色响应函数

void Chuatu1View::Oncolour()

{

CColorDialog colordlg;

if(colordlg.DoModal()==IDOK)

m_color=colordlg.GetColor();

//Invalidate();// TODO: 在此添加命令处理程序代码

}

(5)添加鼠标按下响应函数

void Chuatu1View::OnLButtonDown(UINT nFlags, CPoint point)

{

m_isbuttondown=true;

if (1==m_show_type)

{

m_isbuttondown=true;

SetCapture();

CDC *pDC=GetDC();

CPen newpen(PS_SOLID,m_penwidth,m_color);

CPen *pOldpen=pDC->SelectObject(&newpen);

pDC->MoveTo(point);

pDC->SelectObject(pOldpen);

m_oldpoint=point;

}

else if(4==m_show_type)

{

m_draw_originpt=point;

m_draw_oldpt=point;

}

CView::OnLButtonDown(nFlags, point);

}

(6)添加鼠标弹起响应函数

void Chuatu1View::OnLButtonUp(UINT nFlags, CPoint point)

{

if(4==m_show_type)

{

CClientDC dc(this);

CPen pen(PS_SOLID,m_penwidth,m_color);

dc.SelectObject(&pen);

CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));

dc.SelectObject(pBrush);

int len=sqrt(double((m_draw_originpt.x-point.x)*(m_draw_originpt.x-point.x)+

(m_draw_originpt.y-point.y)*(m_draw_originpt.y-point.y)));

switch(m_draw_type)

{

case 0:

//dc.SetPixel(point,m_clr);

break;

case 1:

dc.Rectangle(CRect(m_draw_originpt,point));//画矩形

break;

case 2:

dc.Ellipse(m_draw_originpt.x-len,m_draw_originpt.y+len,m_draw_originpt.x+len,

m_draw_originpt.y-len);//画圆

break;

}

}

else if (1==m_show_type)

{

CDC* pDC=GetDC();

CPen newpen(PS_SOLID,m_penwidth,m_color);

CPen *pOldpen=pDC->SelectObject(&newpen);

pDC->MoveTo(m_oldpoint); //起始点

pDC->LineTo(point); //指向新点

pDC->SelectObject(pOldpen);

m_isbuttondown=false; //松开鼠标停止绘图

ReleaseCapture();

}

m_isbuttondown=false;

CView::OnLButtonUp(nFlags, point);// TODO: 在此添加消息处理程序代码和/或调用默认值