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: 在此添加消息处理程序代码和/或调用默认值