MFC绘图 实验报告

MFC绘图 实验报告
MFC绘图 实验报告

基于MFC的绘图软件

目录

基于MFC的绘图软件1

1 .引言 (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 中各图形对象及封装类如下:

windows 应用程序设备驱动设备

显示输出设备

?首先需要创建一个合法的对象,不同的对象创建方法不同。

?然后需要将该GUI对象选入DC中,同时保持DC中原来的GUI对象。如果选入的是非法的对象将会引起异常。

?在使用完成后应将恢复原来的对象。这点特别重要,否则选中给设备环境的资源不会释放掉,使得程序使用越来越多的GDI资源。

2.3 库存的GDI对象

Windows预定义了一些标准的GDI对象,提供给系统和程序使用,称为库存GDI对象,他们可以为多个程序使用。他包括最常用的字体,画刷,画笔

对象。

如下面代码:

CPen pen; //定义画笔

pen.CreatePen(this->m_nLineType,this->m_nLineWidth,this->m_cLin eColor);

// 选择新画笔,并保持旧画笔

CPen *pOldPen=this->m_pMemDC->SelectObject(&pen);

//选择库存空画刷

CBrush

*pOldBrush=(CBrush*)m_pMemDC->SelectStockObject(NULL_BRUSH);

2.4与绘图有关的简单数据类型

→CPoint类

CPoint类封装了一个点的坐标,它包含2个数据成员x,y。

CPoint::CPoint 的构造函数

CPoint( );

CPoint( int initX, int initY );

CPoint( POINT initPt );

CPoint( SIZE initSize );

CPoint( DWORD dwPoint );

当使用DWORD类型时,其低位字将赋值给CPoint的x成员,高位字将赋值给y。

→CSize类

如果表示距离和相关位置,可以使用CSize对象。MFC类中包含2个成员变量,cx,cy。CSize::CSize 类的构造函数

CSize();

CSize(int initCX,int initCY);

CSize(SIZE initSize);

CSize(POINT initPt);

CSize(DWORD dwSize);

当使用DWORD类型时,其低位字将赋值给CSize的Cx成员,高位字将赋值给cy。→CRect类

cRect类是最常用的简单数据结构之一,它一般表示一个矩形,有4个数据成员定义如下:

typedef struct tagRECT {

LONG left;

LONG top;

LONG right;

LONG bottom;

} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;

可以理解为左上角和右下角坐标。他还有一些成员函数,我就在这略去。

→RGB宏

宏RGB用于定义一个颜色值,其声明如下:

COLORREF RGB(

BYTE byRed, // red component of color

BYTE byGreen, // green component of color

BYTE byBlue// blue component of color

);

它需要定义颜色的三种基本色成分,各分量取值0-255之间。返回COLORREF值。如下:

COLORREF color=RGB(125,125,125);

2.5 MFC应用程序框架中的图形绘制和刷新

void CMyView::OnDraw(CDC* pDC);这个函数CView类的消息处理函数OnPaint 调用。从基类库MFC中可以找到OnPaint函数的实现代码:

void CView::OnPaint()

{

CPaintDC dc(this);

OnPrepareDC(&dc);

OnDrow(&dc);

}

OnPaint函数处理WM_PAINT消息,这个消息是当窗口的完整形受到破害是产生的一个消息,及当窗口产生WM_PAINT消息时,OnPaint函数执行并调用OnDrow(&dc);函数来完成绘图。当窗口刷新是会自动调用图形重绘操作。

图形的刷新是绘图过程中必须考虑的问题,如窗口的大小调整,窗口的移动,窗口被覆盖后恢复等都需要重新对窗口进行刷新。

3.设计的主体内容MFC设备描述表---CDC类

3.1 CDC类及其派生类

CDC类派生自CObject,他具有CObject类的特点,CDC类即包括了设备属性又包括了绘图方法,通过此方法可以实现GDI的所以图形输出。

CDC类包含了177种函数和很多的数据成员,可以用CWnd的成员函数GetDC 来获得设备环境,使用完后要ReleaseDC释放CDC对象。

CDC *pDC=GetDC();

…………………………….

这是CClientDC的截图

这是CWindowDC的截

3.2 文本输出

输出文本一般用CDC::TextOut()函数,他可以对单行文本进行输出,函数原型如下:

BOOL TextOut(int x,int y,const CString &str);

X,y为文本输出的位置坐标,参数STR为要输出的文本

CDC类还有在制定的矩形区域范围内显示格式话文本

CDC::DrawText(const CString &str,LPRECT lpect,UINT nFormat)

Str为要输出的文本,lpect为要输出的矩形区域,nFormat为设定的对齐方式和

3.3CDC常用的绘图函数

→绘制点

CDC::SetPixel()制定的颜色画个点

COLORREF SetPixel(int x,int y,COLORREF crColor);

COLORREF SetPixel(POINT point,COLORREF crColor);

X,y(piont)为制定的坐标,crColor为将要绘制的颜色

→绘制直线

CDC::MoveTo

CPoint MoveTo( int x , int y );

CDC::LineTo

BOOL LineTo( int x , int y );

这两个函数一般一起用,一般形式如:

dc.MoveTo(x1,y1);

dc.LineTO(x2,y2);

window 绘制从(x1,y1)到(x2,y2)所在的直线的所有像素,不包括(x2,y2);

→ 绘制弧线

CDC::Arc

BOOL Arc( int x1,int y1, // 边框矩形左上角的逻辑坐标

int x2, int y2, //边框矩形右下角的逻辑坐标

int x3, int y3, //圆弧起始坐标

CDC::Rectangle 可以绘制一个矩形区域原型如下

BOOL Rectangle( int x1, int y1, int x2, int y2 );

(x1,y1)(x2,y2)为矩形的左上角和右下角

CDC::RoundRect 可以绘制一个圆角矩形原型如下

BOOL RoundRect( int x1, int y1, int x2, int y2, int nWidth , int nHeight ); (x1,y1)(x2,y2)为矩形的左上角和右下角

int nWidth , int nHeight 为圆角宽和高

→ 绘制椭圆

CDC::Ellipse 可以绘制椭圆和园,原型如下:

BOOL Ellipse( int x1, int y1, int x2, int y2 );

(x1.y1)(x2,y2)分别是左上角和右下角坐标

3.4画笔和画刷

在windows中,画笔和画刷是使用最多的GUI对象,绘制图时,画笔负责绘制图形区域的边界,而画刷负责内部填充

◆画笔对象及其使用

1.画笔对象的创建

一般分为2部:

首先构造一个Cpen对象,然后在调用对象CreatePen()函数。CreatePen()函数按制定样式,宽度,等属性创建一个逻辑画笔,然后将画笔和Cpen对象关联原型如下

CPen::CreatePen

BOOL CreatePen(int nPenStyle,int nWidth,COLORREF crColor);

COLORREF crColor 使用RGB宏前面介绍了。

2.使用画笔对象进行输出

当画笔对象创建成功后,就可以使用CDC类的成员函数selectobject()将其选入设备描述表中进行各种输出。在完成后还原设备描述表中原有的GDI对象。

◆画刷对象及其使用

刷子对象用来在GDI输出时填充一个封闭图形的内部。

CBrush::CreateSolidBrush 函数原型为:

BOOL CreateSolidBrush(COLORREF crColor);

他用与创建一个固定颜色的刷子。使用如下

CBrush brush;

Brush. CreateSolidBrush(RGB(255,0,0));

4.软件主体设计

4.1 资源编辑

光标资源,填充IDC_CURSOR_FILL 和画笔IDC_CURSOR_PEN(图1)

位图资源填充和版权资源

图1

对话框资源关于IDD_ABOUTBOX 文本对话框资源IDD_DIALOG1(图2)

图2

工具栏图标资源分别是直线,矩形,圆形(椭圆),圆角矩形,

填充,铅笔,文字(图3)

图3

具体的ID资源号和对应的说明等见下图(图4)

在视图类中对应的变量和主要的函数

public:

int m_nScreenX; //视图最大x坐标

int m_nScreenY; //视图最大y坐标

int m_nDrawType; //所画的东西(线,矩形。。)

int m_nLineWidth; //线宽

int m_nLineType; //线型

COLORREF m_cLineColor; //线色

COLORREF m_cFillColor; //填充的颜色

bool m_bDrawing; //是否在画图否false 是true CPoint m_ptStart; //画图的起点坐标

CPoint m_ptold; //画图的前一个坐标

CDC *m_pMemDC; //兼容内存dc

CBitmap *m_pBitmap; //位图指针

CRect *textRect; //文本区域

CString str_Text; //文本内容

COLORREF m_cTextColor; //文字的颜色

LOGFONT m_font; //字体对象

int m_nRoundRecWidth; //圆角的宽

int m_nRoundRecHeight; //圆角的高

//创建我们需要的子窗口

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

//用于窗口的重绘相应WM_PAINT消息前面一介绍

virtual void OnDraw(CDC* pDC);

//用于填充和确定起始点

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 BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);

4.2 具体实现

构造函数:

由于构造函数的程序运行时就执行的,所以初始赋值就是最主要的:

CMyView::CMyView()

{

// TODO: add construction code here

this->m_nScreenX=1800; //最大x=1000

this->m_nScreenY=800; //最大y=800

this->m_nDrawType=-1;//初始不画图

this->m_nLineWidth=1;//线宽为1

this->m_nLineType=PS_SOLID;//线型为实线

this->m_cLineColor=RGB(0,0,0);//线色初始为黑

this->m_cFillColor=RGB(255,0,0);//填充初始为红

this->m_bDrawing=false;//初始为每画任何图形

this->m_ptStart=CPoint(0,0);//

this->m_ptold=CPoint(0,0);//

this->m_pMemDC=new CDC();//

this->m_pBitmap=new CBitmap();//

textRect=new CRect(); //文字的区域

this->str_Text=""; //文字内容

this->m_cTextColor=RGB(0,0,0); //文字颜色

memset(&m_font,0,sizeof(m_font));//d得到当前系统字体

this->m_nRoundRecWidth=40; //圆角宽

this->m_nRoundRecHeight=50; //圆角高

}

由于我们在构造函数中使用了new这个操作符所以在析构函数里有:CMyView::~CMyView()

{

delete this->m_pMemDC;

delete this->m_pBitmap;

delete this->textRect;

}

构造和析构完了,我就开始写函数了,当在作图之前还要在,还要初始化我们的画图“纸”,具体见代码注释

int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CView::OnCreate(lpCreateStruct) == -1)

return -1;

// TODO: Add your specialized creation code here

//以像素为单位计算屏幕尺寸

this->m_nScreenX=GetSystemMetrics(SM_CXSCREEN);

this->m_nScreenY=GetSystemMetrics(SM_CYSCREEN);

//获取显示dc的指针

CDC *pDC=GetDC();

//创建显示dc的兼容内存dc

this->m_pMemDC->CreateCompatibleDC(pDC);

//创建与显示dc的位图兼容的位图与屏幕一样大

this->m_pBitmap->CreateCompatibleBitmap(pDC,this->m_nScree nX,this->m_nScreenY);

//将兼容位图选进内存dc,指针poldbitmap用来跟踪原位图

CBitmap*

pOldBitmap=this->m_pMemDC->SelectObject(this->m_pBitmap);

//创建一个白色画刷

CBrush brush(RGB(255,255,255));

//将选进的内存dc位图填上白色

CRect rect(-1,-1,this->m_nScreenX,this->m_nScreenY);

this->m_pMemDC->FillRect(rect,&brush);

//恢复内存dc中的原位图

m_pMemDC->SelectObject(pOldBitmap);

this->ReleaseDC(pDC);

return 0;

}

还有就是最主要的相应WM_PAINT消息的OnDraw函数,具体前面有我就在重复下:就是在窗口拉动,缩小放大等情况下,对窗口进行重绘。

void CMyView::OnDraw(CDC* pDC)

{

CMyDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

//兼容位图选入内存同时保存旧的

CBitmap*

pOldBitmap=this->m_pMemDC->SelectObject(this->m_pBitmap);

//将兼容位图从内存dc拷贝到dc

pDC->BitBlt(0,0,this->m_nScreenX,this->m_nScreenY,this->m_p MemDC,0,0,SRCCOPY);

//恢复原位图

m_pMemDC->SelectObject(pOldBitmap);

memset(&m_font,0,sizeof(m_font));//d得到当前系统字体}

对IDR_MAINFRAME菜单进行如下设计(图5)

图5 然后新建个菜单IDR_MENU1用来做右键弹出菜单(图6)

(图6)

添加消息相应ON_WM_CONTEXTMENU对于代码如下

void CMyView::OnContextMenu(CWnd* pWnd, CPoint point)

{

// TODO: Add your message handler code here

CMenu menu;

menu.LoadMenu(IDR_MENU1); //加载IDR_MENU1

CMenu *popMenu=menu.GetSubMenu(0);

popMenu->TrackPopupMenu(TPM_RIGHTBUTTON,point.x,point.y,this);//弹出}

现在可以相应右键了就会有个弹出菜单。

现在我来相应鼠标左键按下,移动和鼠标左键抬起,这些是核心代码

左键按下有2个作用

●一个是以鼠标左键按下为起始坐标点。

●二是判断这是按下是绘图还是填充颜色

具体实现见代码注释

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

{

// TODO: Add your message handler code here and/or call default

//如果正在画图则不在执行以下代码

if(this->m_bDrawing==true)

return;

//捕获鼠标输入

this->SetCapture();

this->m_bDrawing=true;

this->m_ptStart=this->m_ptold=point;

//填充菜单响应

if(this->m_nDrawType==ID_DRAW_FILL)

{

CBrush *pOldBrush;

CBitmap *pOldBitmap;

CBrush brush;

brush.CreateSolidBrush(this->m_cFillColor);//实心画刷

//将创建的画刷选入内存dc中,并保存原画刷到pOldBrush

pOldBrush=this->m_pMemDC->SelectObject(&brush);

pOldBitmap=this->m_pMemDC->SelectObject(this->m_pBitmap);

//调用dcd的ExtFloodFill()函数在内存的填充一个封闭区域this->m_pMemDC->ExtFloodFill(point.x,point.y,this->m_pMemDC->GetPi xel(point),FLOODFILLSURFACE);

//使窗口内容无效并重画,即调用OnDrow()函数

Invalidate(false);

//恢复原画刷和原位图

this->m_pMemDC->SelectObject(pOldBrush);

this->m_pMemDC->SelectObject(pOldBitmap);

// 不在画图

this->m_bDrawing=false;

}

CView::OnLButtonDown(nFlags, point);

}

当左键确定了起点坐标以后我们就拖动鼠标当我们的左键抬起的时候就开始画图,如果这时是在画图则,设置相应的画笔和空画刷,具体代码见下:具体的画线,圆等图形的函数说明前面以给出这就不在给注释

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

{

// TODO: Add your message handler code here and/or call default CFont newfont,*oldfont;

if(this->m_bDrawing==true)

{

CBitmap*

pOldBitmap=this->m_pMemDC->SelectObject(this->m_pBitmap);

CPen pen;

pen.CreatePen(this->m_nLineType,this->m_nLineWidth,this->m_cLineColor);

CPen *pOldPen=this->m_pMemDC->SelectObject(&pen);

CBrush *pOldBrush=(CBrush*)m_pMemDC->SelectStockObject(NULL_BRUSH);

CRect(this->m_ptStart.x,this->m_ptStart.y,point.x,point.y);

switch(this->m_nDrawType)

{

case ID_DRAW_LINE:

m_pMemDC->MoveTo(this->m_ptStart);

m_pMemDC->LineTo(point); break;

case ID_DRAW_RECTANGLE:

m_pMemDC->Rectangle(this->m_ptStart.x,this->m_ptStart.y,point.x,point.y);

break;

case ID_ROUNDREC:

m_pMemDC->RoundRect(m_ptStart.x,m_ptStart.y,point.x,point.y,m_nRou ndRecWidth,m_nRoundRecHeight); break;

case ID_DRAW_ELLIPSE:

m_pMemDC->Ellipse(this->m_ptStart.x,this->m_ptStart.y,point.x,point.y);

break;

case ID_DRAW_PEN:

m_pMemDC->MoveTo(this->m_ptStart);

m_pMemDC->LineTo(point); break;

case ID_WORD:

newfont.CreateFontIndirect(&m_font);//创建字体

oldfont=m_pMemDC->SelectObject(&newfont);

textRect=new CRect(this->m_ptStart.x,this->m_ptStart.y,point.x,point.y);

this->m_pMemDC->SetTextColor(this->m_cTextColor);

m_pMemDC->DrawText(str_Text,textRect,DT_LEFT|DT_WORDBREAK);

this->m_pMemDC->SelectObject(oldfont);

this->m_nDrawType=-1; break;

default:break;

}

Invalidate(false);

//还原原有的设备接口

m_pMemDC->SelectObject(pOldBitmap);

m_pMemDC->SelectObject(pOldPen);

m_pMemDC->SelectObject(pOldBitmap);

this->m_bDrawing=false;

}

ReleaseCapture();

CView::OnLButtonUp(nFlags, point);

}

现在运行程序现在能画图但是出不来橡皮劲那中效果我们还有添OnMove函数这个函数的作用就是出现橡皮筋效果,其实这个函数就是在不停的重绘图像,给我们的感觉就是画橡皮筋的感觉,具体代码和OnLButtonUp基本相同:

void CMyView::OnMouseMove(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

// 获取状态条的指针

CStatusBar *pStatusBar = (CStatusBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR) ;

CString str ;

str.Format(_T("x=%d,y=%d"), point.x, point.y) ;

pStatusBar->SetPaneText(pStatusBar->CommandToIndex(ID_INDICATOR_PO INT), str) ; //上面是状态条的一些代码,因为不是最要的我略去了//就是代码显示鼠标当前的坐标

if(this->m_bDrawing==true)

{

CDC* pDC=GetDC();

CBitmap*

pOldBitmap=this->m_pMemDC->SelectObject(this->m_pBitmap);

CPen pen;

pen.CreatePen(this->m_nLineType,this->m_nLineWidth,this->m_cLineColor);

CPen *pOldPen=pDC->SelectObject(&pen);

CBrush *pOldBrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);

CRect rectOld(this->m_ptStart,this->m_ptold);

rectOld.NormalizeRect();

rectOld.InflateRect(this->m_nLineWidth,this->m_nLineWidth);

pDC->BitBlt(rectOld.left,rectOld.top,rectOld.Width(),rectOld.Height(),this->m_ pMemDC,rectOld.left,rectOld.top,SRCCOPY);

switch(this->m_nDrawType)

{

case ID_DRAW_LINE:

pDC->MoveTo(this->m_ptStart);

pDC->LineTo(point);

break;

case ID_DRAW_RECTANGLE:

pDC->Rectangle(this->m_ptStart.x,this->m_ptStart.y,point.x,point.y);

break;

case ID_ROUNDREC:

pDC->RoundRect(m_ptStart.x,m_ptStart.y,point.x,point.y,m_nRoundRecW idth,m_nRoundRecHeight);

break;

case ID_DRAW_ELLIPSE:

pDC->Ellipse(this->m_ptStart.x,this->m_ptStart.y,point.x,point.y);

break;

case ID_DRAW_PEN:

m_pMemDC->MoveTo(this->m_ptStart);

m_pMemDC->LineTo(point);

this->m_ptStart=point;

break;

case ID_WORD:

CRect(this->m_ptStart.x,this->m_ptStart.y,point.x,point.y);

pDC->Rectangle(this->m_ptStart.x,this->m_ptStart.y,point.x,point.y);

break;

default:break;

}

this->m_pMemDC->SelectObject(pOldBitmap);

pDC->SelectObject(pOldPen);

pDC->SelectObject(pOldBrush);

this->m_ptold=point;///%%%%%%%%%%

this->ReleaseDC(pDC);

}

CView::OnMouseMove(nFlags, point);

}

这下运行程序就可以了可,是我们的画图全是一个光标不好看所以当画图的时候用“十字”光标,当填充的时候用填充光标,当用铅笔工具的时候就用铅笔光标相应消息为ON_WM_SETCURSOR消息,具体程序代码见下:

BOOL CMyView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) {

// TODO: Add your message handler code here and/or call default

switch(this->m_nDrawType)

{

case ID_DRAW_LINE: //画直线

case ID_DRAW_RECTANGLE://画矩

case ID_DRAW_ELLIPSE://画园

case ID_ROUNDREC://画圆角矩形时

::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_CROSS));

break;//调用系统的十字光标

case ID_DRAW_FILL://填充时候

::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_FILL));

break;//加载填充光标具体见图1

case ID_DRAW_PEN://使用铅笔工具时

::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_PEN));

break;//加载铅笔光标

default:

::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));

break;//一般情况加载正常光标

}

return true;

}

到这为止程序就基本完成了,下面是对参数细节的设定,下面主要说调用通用对话框如,字体,和颜色和自定义对话框的参数传递说明:

就以文本的颜色和字体来说明,并在代码中我给出相应的注释void CMyView::OnTextColor() //这是颜色的通用对话框

{

// TODO: Add your command handler code here

CColorDialog dlg;

//对话框中显示当前的颜色

if(dlg.DoModal()==IDOK)//模态对话框返回int

{

m_cTextColor=dlg.GetColor();//获取颜色

}

}//效果见下

下面来说自定义的,效果见图2,过程简单就不说了,看调用:那个自定义的类名是Text,

void Text::OnOK()

{

// TODO: Add extra validation here

this->UpdateData(true);//将上面数据传给关联的变量m_nWord CDialog::OnOK();

}

在视图类中创建上面实例并将关联数据传给str_Text

void CMyView::OnWord()

{

// TODO: Add your command handler code here

this->m_nDrawType=ID_WORD;

Text dg;

if(dg.DoModal()==IDOK)

与该文本对应的关联的变量为m_nWord

{

this->str_Text=dg.m_nWord; //关联数据传视图类的str_Text }

}

通用类的字体对话框LOGFONT m_font; //字体对象

void CMyView::OnTextSize()

{

// TODO: Add your command handler code here

CFontDialog font; //创建字体对话框

if(font.DoModal()==IDOK)

{

font.GetCurrentFont(&this->m_font);//将所选的字体存入m_font中}

}//效果见下

5.结果分析与讨论

由于时间仓促,查了很多的资料,我唯一的缺憾是没有橡皮擦这个软件,我也想好了该怎么做每次擦除,就是画一个小的背景色的正方形或者小圆!

以MouseDown 为开始(设置Flag为TRUE)

MouseMove 时触发擦除方法(Flag为TRUE时)

以MouseUp 为结束(设置Flag为FALSE)

6.总结

通过这次的类似课程设计我学到了很多也掌握了很多的东西关于WINDOWS的特别是对他的运行机制已经有了更深入的了解,这让我在以后的学习中受益匪浅,也通过这次的学习,我又从头看了我的MFC感觉在学一次原来看不懂的东西,突然就看懂了,看来学习要温故而知新。

俄罗斯方块mfc实验报告

程序设计实践 设 计 报 告 课题名称:俄罗斯方块(MFC版)学生姓名:黄嘉慧 班级:2012211113 班内序号:27 学号:2012210389 日期:2014.6.1

1. 实验概述 1.1 课题目标和主要内容。 本课题的主要内容是用MFC 实现经典游戏俄罗斯方块的编写。目标是能够正常运行,并且无过于严重的问题。使用的平台为MFC (基于对话框)。 1.2 采用计分升级制来进行游戏。当一次消去一行时,得一分,一次两行得 4分,一次3行,得9分,一次4行,得16 分。每 50分为一个等 级,得分足够则升级并重新开始游戏。 2. 程序设计 2.1 系统总体框架 用一个4维数组DiamondStruct[7][4][4][4]来表示所有的方块,用一个POINT 类型的DiamondPos 来表示方块当前的位置,然后通过一个二维数组BlockPanel[][],来表示整个游戏界面,同时进行障碍的添加。游戏过程中,通过改变DiamondPos 来进行方块的下降以及

左右移动,通过DiamondStruct[7][4][4][4]中第二个参数的改变来进行方块的变换。 2.2系统详细设计 【1】模块划分图及描述 【2】类关系图及描述 CWinApp 与CDialog 为基类。其它为添加的类。 【3】程序流程图及描述

【4】存储结构,内存分配 主要存储结构为数组。同时分配内存的有,画笔,Diamond类的指针,Panel类的指针,Block类的指针,Mill类的指针,Manager类的指

针。 2.3 关键算法分析 【1】 bool Diamond::FullLine() { bool IsFull,Full=false; pManager->SeriesLine=0; for(int iy=0;iy<=pPanel->nVGridNum;iy++) { IsFull=true; for(int ix=0;ix<=pPanel->nHGridNum;ix++) { if(!pBlock->BlockPanel[ix][iy]) IsFull=false; } if(IsFull) { Full=true; pManager->SeriesLine++; for(int jy=iy;jy>0;jy--) { Sleep(10); for(int jx=0;jx<=pPanel->nHGridNum;jx++) { pBlock->BlockPanel[jx][jy]=pBlock->BlockPanel[jx][jy-1]; } } } } pManager->LineNumber+=pManager->SeriesLine; pManager->Result+=pManager->SeriesLine*pManager->SeriesLine; if(Full) return true; else return false; } 该算法实现的功能为,判断是否已经满行,并且若是满行,进行消行,加分的操作。该算法的时间复杂度为O(n)=【(nVGridNum)^2*nHGridNum.】/2

mfc绘图程序上机步骤

首先生成MFC程序空框架 空框架中的每个类的职责是什么要自己理解清楚 第一次课: 1.定义自己的数据类CLine直线类,用于绘图 点击菜单:插入—类 选择Generic class,输入类名,每个类都是分成两个文件.h 中只有类体,包含类的数据成员定义和成员函数声明,.cpp中就是成员函数的类体外实现 classCLine { int x1,y1,x2,y2; public: CLine(int a=0,int b=0,int c=0,int d=0); virtual ~CLine(); int Getx1(); int Gety1(); int Getx2(); int Gety2(); void SetPoint1(intx,int y);很多函数是在后面使用中发现问题逐渐添加的 void SetPoint2(intx,int y); }; 2.自定义的类要作为数据成员出现在Doc类中 classCSmallCADDoc : public CDocument { protected: // create from serialization only CSmallCADDoc(); DECLARE_DYNCREATE(CSmallCADDoc) // Attributes public: CLine line1; //数据成员应该是私有,但是由于文档类与视图类交换频繁,为了访问方便,直接定义成公有了。你也可以定义成私有,再定义一个Get函数间接访问,取他的值3.注意:添加了这个数据成员后,需要增加几个#include “Line.h”语句 添加的原则是,每个cpp文件都单独编译,哪里用到新的类,相应的cpp前就要增加#include “。。。”语句 此处是在CSmallCADDoc类中添加了一个CLine line1;类对象,在SmallCADDoc.h文件中。所以,凡是包含了#include “SmallCADDoc.h”的地方都要在前面添加#include “Line.h” 语句。共3处:app doc view 这3个类的cpp文件前 4.注意:初始化 CLine line1; //数据成员是文档类的,它不像dos下程序,明确能看到定义,调用构造

mfc简单绘图程序

M F C 简 单 的 绘 图 程 序 ——王帅

目录 摘要 (2) 关键字 (2) 1 引言 (2) 设计目的 ............................................................................................................ 错误!未定义书签。 2 功能说明 (2) 2.1菜单栏....................................................................................................... 错误!未定义书签。 2.1.1图形 (3) 2.1.2画笔 (4) 2.1.3画硬币 (4) 2.2工具栏 (5) 2.3状态栏 (5) 3 功能的实现 (5) 3.1 视图设计 (5) 3.2 编辑资源 (6) 3.3 编程思路及各个函数的实现 (7) (1)思路 (7) (2)代码的实现 (7)

1.为基本形状创建一个基类 (8) 2.基本形状类的创建 (8) 2.1矩形类的创建及定义 (8) 2.2圆形类的创建及定义 (10) 2.3正五边形类的创建及定义 (11) 2.4正三角形类的创建及定义 (14) 2.5椭圆类的创建及定义 (16) 2.6正四边形类的创建及的定义 (17) 2.7正六边形类的创建及定义 (18) 2.8直线类的创建及定义 (19) 3.各基本形状类在CMyDraw2_0类中的调用和绘图的实现 (20) 3.1矩形类的调用与与绘图的实现 (20) 3.2圆形类的调用 (24) 3.3正三角形类的调用 (25) 3.4基本类型调用的剩余代码 (26) 4.画笔的使用、颜色及大小的调整 (29) 5.画硬币 (35) 6.工具栏中的自定义控件 (38) 7.状态栏中的显示 (39) 4程序功能的测试 (41) 5最后总结 (42)

(整理)基于vcmfc的科学计算器程序实验报告

实验报告 课程名称:windows软件开发实习实验项目:科学计算器

沈阳工业大学实验报告 (适用计算机程序设计类) 专业班级:软件1006 学号:101201622 姓名:张鑫可 实验名称: 1.实验目的: 本程序设计实践是采用C++语言,在VC平台下设计。本课程设 计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的能力。程序设计实践主要是培养学生利用系统综合C++语言进行程序设计的能力。 1.进一步巩固和复习C++程序设计的基础知识。 2.培养学生结构化程序、模块化程序设计的方法和能力。 3.了解软件的编制过程及各环节的具体内容。 4.提高学生程序调试技巧、软件设计能力和代码规范化等素质。 5.提高学生分析问题、解决问题以及实际运用能力。 2.实验内容: 设计一个简单的计算器。要求能实现整数、小数算数运算。程序带 清零按钮。 3. 实验方案(程序设计说明) 见附件 4. 实验步骤或程序(经调试后正确的源程序) (填写主要步骤与程序代码等。见附件A) 5.出现的问题及解决方法

附件A 沈阳工业大学实验报告 (适用计算机程序设计类) 专业班级:软件1006 学号:101201622 姓名:张鑫可 实验步骤或程序: 一、关于Visual C++: Visual C++6.0由Microsoft开发, 它不仅是一个C++ 编译器,而且是一个基于Windows 操作系统的可视化集成开发环境(integrated development environment,IDE)。Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。这些组件通过过一个名为Developer Studio的组件集成为和谐的开发环境。Microsoft 的主力软件产品。Visual C++是一个功能强大的可视化软件开发工具。自1993年Microsoft 公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的 首选工具。虽然微软公司推出了Visual C++.NET(Visual C++7.0),但它的应用的很大的局限性,只适用于Windows 2000,Windows XP和Windows NT4.0。所以实际中,更多的是以Visual C++6.0为6平台。 Visual C++6.0以拥有“语法高亮”,自动编译功能以及高级除错功能而著称。比如,它允许用户进行远程调试,单步执行等。还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。其编译及创建预编译头文件(stdafx.h)、最小重建功能及累加连结(link)著称。这些特征明显缩短程序编辑、编译及连结的时间花费,在大型软件计划上尤其显著。 二、设计要点 1、基本要求:设计的系统界面要美观大方,操作合理,有必要的 提示。 2、创新要求:在基本要求达到后,进行创新设计。

飞机大战MFC实验报告

实训报告 飞机大战游戏设计与开发

目录 1. 概述 (4) 2. 相关技术 (4) 2.1 透明贴图技术 (4) 2.2 CObList链表 (4) 2.3获取矩形区域函数 (4) 2.4弹出对话框函数 (5) 2.5字体的个性化输出函数 (5) 2.6设置定时器 (5) 2.7双缓冲技术 (5) 2.8 内存释放技术 (6) 2.9对话框中添加动态按钮 (6) 2.10检测方向键按下 (6) 3. 需求分析(用结构化方法或面向对象方法给出系统的主要需求模型) (6) 3.1功能需求分析 (6) 3.2 数据需求分析 (7) 3.3 行为需求分析 (7) 3.4 其他需求 (8) 4. 总体设计与详细设计 (8) 4.1 系统模块划分 (9) 4.2 主要功能模块 (10) 4.3 扩展功能设计思路 (10) 5. 编码实现 (11) 5.1游戏初始创建 (11) 5.2定时器 (11) 5.3背景及游戏开始、结束界面绘制函数 (11) 5.4键盘控制函数 (12) 5.5游戏对象进行碰撞测试和碰撞销毁 (13) 5.6创建动态按钮(开始游戏、游戏规则) (13) 5.6重新开始游戏代码 (14) 5.7设置游戏难度代码 (14) 5.8游戏结束时释放资源函数 (15) 5.9调整对话框大小函数 (15) 5.10开始界面背景绘制函数 (15) 5.11选择下一关卡以及选择完成后的执行代码 (16) 6.测试情况说明。 (17) 6.1主要模块测试情况(白盒) (17) 6.11各游戏对象碰撞检测爆炸模块测试 (17) 6.12战机导弹的方向速度模块测试 (17) 6.13文字显示,游戏结束和关卡进入模块测试 (18) 6.14设置游戏难度和重新开始模块测试 (18) 6.2 主要功能测试情况(黑盒) (18)

简单的绘图程序实验报告

面向对象程序设计实训(基于MFC程序设计) 题目: 简单的绘图程序 院系专业: 姓名: 学号: 同组其他学生(学号):

简单绘图程序说明 1、功能分析 目前这个软件的主要功能有如下: 1、画直线:通过OnLine()函数实现。 2、画矩形:通过OnRectangle()函数实现。 3、画圆角矩形:通过OnRoundrect()函数实现。 4、画椭圆:通过OnEllipse()函数实现。 5、铅笔工具:可以画任意线条。通过直接在OnMouseMove(UINT nFlags, CPoint point)函数里面添加代码实现。 6、右键弹出菜单:可以在客户中点击鼠标右键,快速选择常用菜单。通过 OnContextMenu函数实现。 7、状态栏显示鼠标移动的坐标:在程序的右下角显示,通过调用setWidnowText 和GetParent()实现。 8、画图颜色选择:可以画任何颜色的线条,通过OnColor()函数实现。 9、线条类型及线宽的设置:可以将画出的线条设置成实线、虚线、点线、点划 线,双点划线,还可以设置线条的粗细,,通过实例这一功能立刻显示所选择线条的粗细及线型。通过新建CLineSettingDlg类,其中OnSelchangeLineStyle()函数实现线型的改变,OnChangeEditLineWidth()函数实现线宽的改变。再在CDrawView类中调用OnLineSetting()函数实现画笔的对话框, CLineSettingDlg类中的OnPaint()函数是实现示例功能的。 10、窗口的重绘时不擦除原来的内容:新建CShape类用来保存线条的颜色,线 宽,填充色等属性,在窗口大小发生变化时有OnDraw(CDC* pDC)函数进行重绘工作,重绘中调用了各个绘图函数的Draw(CDC *pDC)函数。 11、所绘图形的保存于读取,通过Serialize(CArchive &ar)函数进行序列化操作, 将所绘图形的信息通过文件的形式保存起来。

c计算器实验报告

简单计算器 姓名: 周吉祥 实验目的:模仿日常生活中所用的计算器,自行设计一个简单的计算器程序,实现简单的计算功能。 实验内容: (1)体系设计: 程序是一个简单的计算器,能正确输入数据,能实现加、减、乘、除等算术运算,运算结果能正确显示,可以清楚数据等。 (2)设计思路: 1)先在Visual C++ 6.0中建立一个MFC工程文件,名为calculator. 2)在对话框中添加适当的编辑框、按钮、静态文件、复选框和单选框 3)设计按钮,并修改其相应的ID与Caption. 4)选择和设置各控件的单击鼠标事件。 5)为编辑框添加double类型的关联变量m_edit1. 6)在calculatorDlg.h中添加math.h头文件,然后添加public成员。 7)打开calculatorDlg.cpp文件,在构造函数中,进行成员初始化和完善各控件 的响应函数代码。

(3)程序清单: 添加的public成员: double tempvalue; //存储中间变量 double result; //存储显示结果的值 int sort; //判断后面是何种运算:1.加法 2.减法 3.乘法 4.除法 int append; //判断后面是否添加数字 成员初始化: CCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=NULL*/) : CDialog(CCalculatorDlg::IDD, pParent) { //{{AFX_DATA_INIT(CCalculatorDlg) m_edit1 = 0.0; //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); tempvalue=0;

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 创建单文档

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

计算机与信息工程学院 《程序设计基础》课程设计报告 题目名称:60.编写一个能实现简单功能的计算器学生姓名:刘沛东 学生学号:2011508154 专业班级:电子信息工程(1)班 指导教师:高攀

1 课程设计的题目 编写一个能实现简单功能的计算器 2 题目要求 1. 有一个计算器图形。 2. 能实现加、减、乘、除及乘方的运算。 3. 当输入题目时,屏幕上要在指定位置上显示出相应的题目内容,且相应的数字键要改变颜色 例如:输入数字1 时,在计算器图形上的1键变为红色。 4. 屏幕、图形颜色、形状自定 3 总体设计 3.1 总体框架 图1 系统框架

3.2 系统功能说明 在VC++6.0中绘制计算器界面,各控件的设置 对0~9控件设定相应的ID和其他属性: 图2 “1”控件设置 对“+、-、*、\”控件设定相应的ID和其他属性: 图2 “+”控件设置 对其它控件设定相应的ID和其他属性: 图3 其它控件设置

主要使用到Layout菜单中的Align功能对各个按钮进行对其,使界面更加整洁。拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息。 4 程序详细设计 4.1系统主调模块 图5 程序流程图

4.2各模块详细设计 4.2.1 建立的变量,控件的命名,对应的消息处理函数对应表 double poz; //保存小数点的位置,初始化为1,表示poz-1个小数点。 double m_Dis; //Edit控件上需要显示的数字 BOOL point_flag; //小数点表示位,判定是否是小数,是小数为1,不是小数为0。 double numfirst; //保存计算过程中的前一个数字, double numsecond;//保存计算过程中的第二个数字 char op;//记录当前的计算符号,可以为’+’,’-’,’*’,’/’,’=’,’c’,’n’ 变量初始化: poz=1; m_Dis = 0.0; numfirst=0; numsecond=0; op=0;

《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生成单文档工程Plot 2.在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简单绘图程序报告

简单绘图程序 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中的R int G RGB中的G int B RGB中的B CGraph类中 int m_nType:保存后重绘时用户的选择int qdx; 重绘起点x int qdy; 重绘起点y int zdx; 重绘终点x int zdy; 重绘终点y CLine类中 int cx; 重绘线宽 int sx; 重绘起点x int sy; 重绘起点y int zx; 重绘终点x int zy; 重绘终点y int w; 重绘线宽 自定义颜色对话框关联变量: IDC_EDIT_RED int m_Red IDC_EDIT_GREEN int m_Green IDC_EDIT_BLUE int m_Blue IDC_SCROLL_RED CScrollBar m_Sred IDC_SLIDER_GREEN CSliderCtrl m_Sgreen IDC_SPIN_BLUE CSpinButtonCtrl m_Sblue 2 分析、设计与实现 2.1 主要功能设计与实现

c计算器实验报告

c计算器实验报告集团标准化工作小组 #Q8QGGQT-GX8G08Q8-GNQGJ8-MHHGN#

简单计算器 姓名: 周吉祥 实验目的:模仿日常生活中所用的计算器,自行设计一个简单的计算器程序,实现简单的计算功能。 实验内容: (1)体系设计: 程序是一个简单的计算器,能正确输入数据,能实现加、减、 乘、除等算术运算,运算结果能正确显示,可以清楚数据等。 (2)设计思路: 1)先在Visual C++ 中建立一个MFC工程文件,名为calculator. 2)在对话框中添加适当的编辑框、按钮、静态文件、复选框和 单选框 3)设计按钮,并修改其相应的ID与Caption. 4)选择和设置各控件的单击鼠标事件。 5)为编辑框添加double类型的关联变量m_edit1. 6)在中添加头文件,然后添加public成员。 7)打开文件,在构造函数中,进行成员初始化和完善各控件的 响应函数代码。 (3)程序清单: 添加的public成员: double tempvalue; 法 2.减法 3.乘法 4.除法

int append; //判断后面是否添加数字 ●成员初始化: CCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=NULL*/) : CDialog(CCalculatorDlg::IDD, pParent) { //{{AFX_DATA_INIT(CCalculatorDlg) m_edit1 = ; //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); tempvalue=0; result=0; sort=0; append=0; } ●各控件响应函数代码: void CCalculatorDlg::OnButton1() //按钮“1” { // TODO: Add your control notification handler code here if(append==1)result=0;

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之间转换,来处理弹出式对 话框的初次绘制和移动时的重绘问题。

MFC计算器程序报告

C++课程设计实验报告 学号姓名 院系专业

一、课题名称 简易的计算器设计。 二、问题陈述 编写一个计算器程序,能够进行四则运算、取模等运算 要求: 1、个人完成; 2、运用对话框编写,界面上只能有一个输出框,数据通过按钮输入到程序,并显 示在输出框中;当按下运算符后再输入数据,输出框中应显示新数据;运算结果也显示在输出框中。 3、四则运算、取模运算是最低要求,程序能正确执行; 4、界面设计美观、合理; 5、独立完成; 三、设计目标和设计任务 编写一个计算器程序,能够进行四则运算、取模、乘方、立方,并且给计算器程序添加背景。 四、解题算法思想 1.创建一个基于对话框的项目 2. 给对话框加入相应的操作按钮 3. 给按钮加上代码,设置属性 4. 为实现四则运算、取模等操作添加必要函数 五、程序算法过程 ①选择File→New菜单命令,选择Project选项卡,并选择MFC AppWizard(exe), name 命名为calculator;选择应用程序基于对话框,即Dialog based。多次单击next,最后单击Finish后,系统弹出一对话框,如下图:

②使用按钮控件、文本编辑框控件和组控件,将他们加入到对话框中,并通过更改按钮控件的属性中的标题部分。选中所有按钮,在属性中的Extended Style中选中Modal frame,使其达到下图效果:(注意,在布局按钮时,为了使按钮总体整齐美观,可以先创建一行或一列按钮,使他们保持整齐后,按住Ctrl键,选中这一行或一列按钮,再移动鼠标,即可生成另一行或一列按钮;也可以通过Layout菜单中的指令对其进行布局) ③鼠标右击按钮控件,选择属性,即可对其ID进行更改,各ID与标题内容对应如下: ID 标题ID 标题IDC_BUTTON0 0 IDC_BUTTONCLS 清零 IDC_BUTTON1 1 IDC_ADD + IDC_BUTTON2 2 IDC_PLUS -

MFC计算器实验报告

实验报告一——计算器 一实验名称 简易计算器 二实验目的 在Visual C++.EXE开发环境中,通过编写计算器程序,掌握创建对话框的方法,并向其中添加控件,并设置属性,使之满足程序的要求。 三编程思路 计算器要实现各种运算,在编写中主要分为两大块的编写,一是对1、2、3等数字按钮的响应函数编写,二是对加减乘除等运算符按钮的响应函数的编写。 给Dlg添加变量int m_operator; //运算符 double m_result; //结果(含中间变量) 另外添加编辑框的变量m_res 1.对数字按钮的响应函数的编写 1)由于每个按钮的响应函数相差不大,故用一个函数将其封装 在每次输入时要先判断数据开头是否为0 void CMy0710210202CalculateDlg::button(CString c) { UpdateData(TRUE); m_res+=c; if(m_res.GetAt(0)=='0'&&m_res.Find(".")==-1){ m_res.Empty(); m_res+=c; } UpdateData(FALSE); } 2)小数点按钮的响应函数。 首先要判断输入数据中是否已有小数点,数据是否为0,以及是否还没输入数据。 void CMy0710210202CalculateDlg::OnDian() { // TODO: Add your control notification handler code here UpdateData(TRUE); int n=m_res.Find("."); if(n==-1&&m_res.GetLength()!=0) m_res+="."; else if(m_res.GetLength()==0)m_res+="0."; UpdateData(FALSE); } 2.运算符按钮的响应函数的编写 用m_operator指代要进行的运算,由于每次的运算结果m_result 都传入了编辑框的变量m_res里,故此程序可以实现连续运算。 代码为 void CMy0710210202CalculateDlg::Result() { UpdateData(TRUE);

简易画图板设计报告

设计报告:Graphic简易画 图板 -----韩伟谢程焜肖越周峰 电科二班

1设计目的 设计一个单文档类型的MFC AppWizard (exe)工程,工程取名为:Graphic。此程序将实现简单的绘图功能,包括点、直线、矩形、椭圆、扇形和连续线的绘制。并且能实现绘图的控制,包括线宽、线型和颜色的设置,图形的保存和打开以及笔刷的使用。 2 总体设计 设计图如图6

图6 3详细设计 首先,新建一个单文档类型的MFC AppWizard (exe)工程,工程取名为:Graphic。为此程序添加一个子菜单,菜单名称为“绘图”,并为其添加六个菜单项,分别用来控制不同图形的绘制。当用户选择其中的一个菜单项后,程序将按照当前的选择进行相应图形的绘制。添加的六个菜单项的ID及名称如表1所示。然后分别为这六个菜单项添加命令响应,本程序让视类(CGraphicView)对这些菜单命令进行响应,这六个响应函数的名称分别如表1所示。

在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以便随后的绘图操作使用。因此在CGraphicView类中添加一个私有变量m_nDrawType;用来保存用户的选择,该变量的定义如下所述: private: UINT m_nDrawType; 接着,在视类的构造函数中将此变量初始化为0,程序代码如下: CGraphicView::CGraphicView() { // TODO: add construction code here m_nDrawType=0; } 利用switch/case语句,来分别完成相应图形的绘制。当用户选择【绘图】菜单下的不同子菜单项时,将变量m_nDrawType设置为不同的值。程序代码如下:void CGraphicView::OnDot() { // TODO: Add your command handler code here m_nDrawType=1; } void CGraphicView::OnLine() { // TODO: Add your command handler code here m_nDrawType=2; } void CGraphicView::OnRectangle() { // TODO: Add your command handler code here m_nDrawType=3; } void CGraphicView::OnEllipse() { // TODO: Add your command handler code here m_nDrawType=4;

MFC贪吃蛇实验报告

贪吃蛇实验报告201221143049 信计1212 许圣

1.概述 此次课程设计我利用MFC制作了一个贪吃蛇游戏,用户可以通过上下左右控制蛇的移动方向,游戏会根据贪吃蛇身体的长度自动增加难度。在游戏过程中,会记录运行时间和所得分数,我还添加了bmp格式的图片作为游戏背景。 2.功能描述 2.1设计思路 本软件主要由三个模块构成,它们分别是蛇运行模块,初始化处理模块和显示模块。它们的作用分别是,初始化处理:初始化蛇头位置与第一个点位置;蛇运行模块:控制蛇的上下左右运行,并对蛇的运行状态进行判断,根据(吃点、未吃点、死亡等)状态进行不同的子程序模块处理以及游戏者是否能晋级的判断;显示模块:根据对蛇和点子的当前状态进行动画显示。主要有以下步骤: 1.定义蛇类和食物类,初始化贪吃蛇各项成员变量,包括图像的出现在屏幕的 初始位置,长度,以及蛇的行走方向。食物类的定义包括出现的初始位置,以及食物是否被吃掉的判断。 2.用数组初始化长度为4的贪吃蛇,并且默认出现一个食物。 3.在CView类上运用MFC提供的Windows消息中WM_TIMER消息,运用OnTimer() 函数让系统提供一个时钟节拍,更新游戏 4.具体游戏实现,包括蛇撞到自己和围墙都将使游戏结束,判断吃豆等,其中 还包括根据蛇的长度来进行游戏难度的改变。 5.具体键盘游戏操作运用到Windows消息响应中的WM_KEYDOWN,用OnKeyDown() 来响应玩家的实际操作。 6.添加了bmp格式的图片作为游戏背景。 整体流程图如下图1。

图1:系统流程图

2.2功能介绍 ⑴运行程序,出现围墙界面,一条蛇在密闭的围墙内,在围墙内随机出现一个食 物,出现bmp格式图片的背景。 ⑵点击“游戏->游戏开始”,游戏开始。还可暂停游戏继续 ⑶游戏开始后,界面右下角会同步游戏得分。 ⑷通过四个方向键控制蛇的运动方向,吃掉随机出现的豆子,若不小心碰到墙 壁或者与自身相交,则该轮游戏结束。 ⑸游戏会根据蛇身的长度自动调节难易程度。 3.详细设计 3.1主要函数 ●void CSnakeView::OnDraw(CDC* pDC)//显示背景图片 ●void CSnakeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)//按照用户的按键来控制蛇的移动 ●void CSnakeView::OnTimer(UINT nIDEvent)//根据蛇的长度来进行 SetTimer()函数的定义,可以根据长度来进行游戏难度的设定。//撞 界判断//蛇身相撞判断//抹掉蛇行走的痕迹//判断吃豆的条件,撞到就 吃//如果食物被吃了就生成 ●void CSnakeView::oninit()//进行贪吃蛇外观的初始化 ●void CSnakeView:: OnGameStart ()//开始游戏 ●void CSnakeView:: IniAim ()//初始化目标的位置 ●void CSnakeView::IniGame()//初始化游戏 ●void CSnakeView::ReDisplay(CPoint pPoint) ●bool CSnakeView::ReadBmp(char *bmpName)

基于MFC的OpenGL绘图

基于MFC的OpenGL绘图 本文更新版本请点击 [置顶]《基于MFC的OpenGL编程》系列文章 一、简介 GDI是通过设备句柄(Device Context以下简称"DC")来绘图,而OpenGL则需要绘制环境(Rendering Context,以下简称"RC")。每一个GDI命令需要传给它一个DC,但与GDI不同,OpenGL使用当前绘制环境(RC)。一旦在一个线程中指定了一个当前RC,在此线程中其后所有的OpenGL命令都使用相同的当前RC。虽然在单一窗口中可以使用多个RC,但在单一线程中只有一个当前RC。下面我将首先产生一个OpenGL RC并使之成为当前RC,这将分为三个步骤:设置窗口像素格式;产生RC;设置为当前RC。 二、MFC中的OpenGL基本框架 1、首先创建工程 用AppWizard产生一个MFC EXE项目,其他默认即可。 2、将此工程所需的OpenGL文件和库加入到工程中 在工程菜单中,选择"Build"下的"Settings"项。单击"Link"标签,选择"General"目录,在Object/Library Modules的编辑框中输入"opengl32.lib glu32.lib glut.lib glaux.lib"(注意,输入双引号中的内容,各个库用空格分开;否则会出现链接错误),选择"OK"结束。然后打开文件"stdafx.h",加入下列头文件: #include #include 3、改写OnPreCreate函数并给视图类添加成员函数和成员变量

OpenGL需要窗口加上WS_CLIPCHILDREN(创建父窗口使用的Windows风格,用于重绘时裁剪子窗口所覆盖的区域)和WS_CLIPSIBLINGS(创建子窗口使用的Windows风格,用于重绘时剪裁其他子窗口所覆盖的区域)风格。把OnPreCreate改写成如下所示:BOOL COpenGLDemoView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS); return CView::PreCreateWindow(cs); } 产生一个RC的第一步是定义窗口的像素格式。像素格式决定窗口着所显示的图形在内存中是如何表示的。由像素格式控制的参数包括:颜色深度、缓冲模式和所支持的绘画接口。在下面将有对这些参数的设置。我们先在COpenGLDemoView的类中添加一个保护型的成员函数BOOL SetWindowPixelFormat(HDC hDC)(用鼠标右键添加)和保护型的成员变量:int m_GLPixelIndex;并编辑其中的代码如下: BOOL COpenGLDemoView::SetWindowPixelFormat(HDC hDC) {//定义窗口的像素格式 PIXELFORMATDESCRIPTOR pixelDesc= { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL| PFD_DOUBLEBUFFER|PFD_SUPPORT_GDI, PFD_TYPE_RGBA, 24, 0,0,0,0,0,0, 0, 0,

MFC基本应用程序的建立实验报告

计算机与信息技术学院综合性、设计性实验报告 专业:计算机科学与技术年级/班级:10计科一班 一、实验目的: (1)了解Windows的基本编程特点 (2)会使用MFC AppWinzard(exe)创建单文档应用程序 (3)学会添加消息映射等简单功能 (4)掌握用项目工作区的ClassView页面添加数据成员的方法 (5)学会和掌握调试的一般步骤和过程 二、实验内容: (1)在一个默认的单文档应用程序Ex_SDI中通过映射计时器消息实现这样的功能:无论在Ex_SDI应用程序窗口的客户区中单击鼠标左键或右键,都会弹出“消息”对话框,显示左键或右键的单击次数。 (2)使用调试器对上述程序的流程和鼠标单击次数进行调试。 三、实验步骤: 1、创建工作文件夹 打开计算机,在“G:\Visual C++程序\实验”文件夹中创建一个新的子文件夹“实验8”。 2、创建单文档应用程序Ex_SDI 创建单文档应用程序Ex_SDI的具体步骤如下: (1)启动Visual C++ (2)选择“文件”→“新建”菜单命令,显示“新建”对话框。从列表中选中MFC AppWinzard(exe)的项目类型项。 (3)在“工程”编辑框中输入应用程序项目名称Ex_SDI,并将项目文件夹定位到“D:\Visual C++程序\实验\实验8”。 (4)单击“确定”按钮,显示“应用程序向导”对话框。选中单个文档(Single Document,简称SDI)应用程序类型。单击“完成”按钮,系统将显示向导创 建的信息,单击“确定”按钮将自动创建此应用程序。 (5)编译运行。 具体操作如下:

运行结果如下: 3、添加数据成员: 添加数据成员的的具体步骤如下: (1)展开项目工作区窗口ClassView中的所有类结点。 (2)用鼠标右键单击CEx_SDIView类结点,从弹出的快捷菜单中选择“Add Member Variable(添加成员变量)”,弹出如图所示的“Add Member Variable” 对话框。 (3)在Variable Type框中输入成员变量类型int,在Variable Name框中输入变量名称m_nLButton。保留默认的访问方式(Acess)为Public。单击“确定”按钮, 这样,就会在CEx_SDIView中添加一个公有型成员变量m_nLButton,变量类 型为int。

相关文档
最新文档