MFC实现简单画图形程序.docx 您所在的位置:网站首页 改革开放后农村经济体制改革措施 MFC实现简单画图形程序.docx

MFC实现简单画图形程序.docx

2023-04-08 00:02| 来源: 网络整理| 查看: 265

MFC实现简单画图形程序.docx

《MFC实现简单画图形程序.docx》由会员分享,可在线阅读,更多相关《MFC实现简单画图形程序.docx(21页珍藏版)》请在冰豆网上搜索。

MFC实现简单画图形程序.docx

MFC实现简单画图形程序

《MFC编程及应用》课程设计报告

题目:

简单画图形程序

学号:

姓名:

指导老师:

时间:

 

评语:

 

程序设计步骤:

一、建立基于对话框的应用程序框架;

二、CMy0910200155Dlg类中关键新增变量的作用:

CPtrArraypta;//用于保存已绘图形的相关信息。

CMemoryNode*pmN;//指向CMemoryNode类的指针,程序运行过程中动态保存对象信息.

CMemoryNode*pmn;//指向CMemoryNode类的指针,从文件中读取信息时动态创建类的对象。

COLORREFm_CurrentBrushColor;//用于存放当前画刷的颜色。

COLORREFm_CurrentPenColor;//用于存放当前画笔的颜色.

intnum;//用于存放从"Index。

txt"文件中读取的数字。

intflag=0;//用于标识:

当为1时,表示按下了"画图”按钮;当为2时,表示按下了"撤消”按钮;当为3时,表示按下了"加载历史”按钮,则从文件中读取信息。

intmark;//用于标识:

当为0时,表示刚画过矩形;当为1时,表示刚画过圆角矩形;当为2时,表示刚画过椭圆.

intindex;//用于存放pta数组的容量。

intflag1=0;//用于标识,和flag搭配,用来处理多种情况下的窗口重绘问题。

intButtonState=0;//用于标识,是类CShow和类CMy0910200155Dlg的一个接口,通过其值在1和0之间转换,来处理弹出式对话框的初次绘制和移动时的重绘问题。

三、CMemoryNode类中变量的作用:

COLORREFBrushColor;

COLORREFPenColor;

intMark;//以上三者为类CMemoryNode的成员变量,分别用来保存

绘图时画刷颜色,画笔颜色和形状。

四、与控件相关联的变量:

CComboBoxm_BrushColor;//指示画刷颜色组合框.

CComboBoxm_PenColor;//指示画笔颜色组合框。

CListBoxm_Shape;//指示形状列表框.

五、应用程序功能的具体实现:

1)初始化过程:

this—〉m_Shape。

AddString(”矩形");//给形状列表框添加一个项目.

this—>m_PenColor.AddString("红色");//给画笔颜色框添加一个项目。

this-〉m_BrushColor.AddString(”白色”);//给画刷颜色框添加一个项目。

(剩余项目的添加方法完全相同,就不再赘述了)

m_PenColor。

SetCurSel(0);

m_BrushColor.SetCurSel(4);

m_Shape。

SetCurSel

(2);//设置光标初始定位.

m_CurrentBrushColor=RGB(0,0,255);//画刷颜色设置默认初值为蓝色。

m_CurrentPenColor=RGB(255,0,0);//画笔颜色设置默认初值为红色.

this->SetWindowText(”简单画图形程序”);//设置窗口标题。

RECTrect;

this—>GetWindowRect(&rect);//得到窗体的大小。

CRgnrgn;

rgn.CreateRoundRectRgn(

rect.left+3,rect.top+5,rect.right—2,rect.bottom—2,40,40);

this—〉SetWindowRgn((HRGN)rgn。

GetSafeHandle(),TRUE);

//按要求绘制圆角矩形的窗体。

ifstreaminfile1(”Index.txt",ios:

nocreate);

if(!

infile1)this->GetDlgItem(IDC_BUTTON_LOAD)-〉EnableWindow(FALSE);

//通过”Index。

txt”文件是否存在来决定”加载历史”按钮的状态,如果存在则可用,否则不可用。

2)窗口绘制过程:

此过程调用OnPaint()函数,涉及多种情况下的图形绘制和窗口重绘,是相对比较核心的部分,将在后面具体逐个分析.

六、从某一次程序运行的角度说明各个函数的功能:

首先打开应用程序,系统将自动创建窗体,在窗体弹出的一瞬间,你会发现窗体是圆角形的,其次感觉颜色比较柔和.这归功于初始化中的:

RECTrect;

this—〉GetWindowRect(&rect);

CRgnrgn;

rgn。

CreateRoundRectRgn(

rect.left+3,rect.top+5,rect。

right-2,rect。

bottom-2,40,40);

this-〉SetWindowRgn((HRGN)rgn.GetSafeHandle(),TRUE);

//绘制圆角矩形的窗体。

和应用类初始化中添加的:

SetDialogBkColor(RGB(80,80,180),RGB(0,0,0));//设置窗体颜色。

如果是第一次使用该程序,那么你将看到"加载历史”按钮是灰化的,不能使用,这是因为初始化中使用了该语句,

ifstreaminfile1(”Index。

txt",ios:

:

nocreate);

if(!

infile1)this—〉GetDlgItem(IDC_BUTTON_LOAD)—〉EnableWindow(FALSE);

没有创建过”Index.txt”文件,当然无法读取!

将已有的"Index。

txt"文件删除,然后重新启动系统,会有相同的效果.

你会看到窗口中”形状",”画笔颜色”,”填充颜色"分别默认为”圆角矩形","红色”,"蓝色”,这是因为在初始化过程中,已经对相应的变量赋值,而且设置了光标选择:

m_PenColor。

SetCurSel(0);

m_BrushColor。

SetCurSel(4);

m_Shape。

SetCurSel

(2);//设置光标初始定位。

m_CurrentBrushColor=RGB(0,0,255);//画刷颜色设置默认初值为蓝色.

m_CurrentPenColor=RGB(255,0,0);//画笔颜色设置默认初值为红色。

如果我们想画一个边框为洋红色,填充色为青色的圆角矩形,那么当鼠标点击”画笔颜色”下的"洋红”时,将触发组合框IDC_COMBO_PEN_COLOR的CBN_SELENDOK消息,将调用,

voidCMy0910200155Dlg:

:

OnSelendokComboPenColor()

intn=m_PenColor。

GetCurSel();

switch(n)

case0:

m_CurrentPenColor=RGB(255,0,0);break;

case1:

m_CurrentPenColor=RGB(0,255,0);break;

case2:

m_CurrentPenColor=RGB(0,0,255);break;

case3:

m_CurrentPenColor=RGB(255,255,0);break;

case4:

m_CurrentPenColor=RGB(255,0,255);break;

case5:

m_CurrentPenColor=RGB(0,255,255);break;

default:

m_CurrentPenColor=RGB(0,0,0);break;

}

}

同理可知,当鼠标点击”填充颜色"下的”青色”时,将触发组合框IDC_COMBO_BRUSH_COLOR的CBN_SELENDOK消息,将调用,

voidCMy0910200155Dlg:

OnSelendokComboBrushColor()

intn=m_BrushColor。

GetCurSel();

switch(n)

case6:

m_CurrentBrushColor=RGB(255,0,0);break;

case5:

m_CurrentBrushColor=RGB(0,255,0);break;

case4:

m_CurrentBrushColor=RGB(0,0,255);break;

case3:

m_CurrentBrushColor=RGB(255,255,0);break;

case2:

m_CurrentBrushColor=RGB(255,0,255);break;

case1:

m_CurrentBrushColor=RGB(0,255,255);break;

default:

m_CurrentBrushColor=RGB(255,255,255);break;

}

这两个函数能将光标的选择转换为画笔或画刷的颜色。

不过,当然必须先给组合框添加过一个CBN_SELENDOK消息!

然后点击”形状”下的”圆角矩形”,这时this-〉m_Shape。

GetSel

(1)其值为TRUE,表明”圆角矩形”被选中了,当然,其它两个m_Shape.GetSel(0)和m_Shape.GetSel

(2)都为FALSE.

在画图前,如果你足够细心,你会注意到刚才在选颜色时,如果颜色还没有选定,它周围就会有一个当前颜色的色圈,而当颜色已选定时,色圈就会变为彩色背景,这是因为之前给类CMy0910200155Dlg添加了WM_CTLCOLOR消息,因此当触发该消息时,会调用,

HBRUSHCMy0910200155Dlg:

:

OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor)

{

HBRUSHhbr=CDialog:

:

OnCtlColor(pDC,pWnd,nCtlColor);

if(pWnd—>GetDlgCtrlID()==IDC_COMBO_PEN_COLOR)

hbr=:

:

CreateSolidBrush(this—>m_CurrentPenColor);

pDC->SetBkColor(this-〉m_CurrentPenColor);

if(pWnd-〉GetDlgCtrlID()==IDC_COMBO_BRUSH_COLOR)

hbr=:

CreateSolidBrush(this—〉m_CurrentBrushColor);

pDC—>SetBkColor(this—>m_CurrentBrushColor);

}

returnhbr;

该方法可以实现控件颜色的改变,考虑到界面的简洁(不是简单)和色彩协调,其它控件的颜色就不必改变了。

做好了这些准备工作,现在我们开始绘图,点击”绘图”按钮,就触发了IDC_BUTTON_DRAW的BN_CLICKED消息,会调用,

voidCMy0910200155Dlg:

:

OnButtonDraw()

{

flag=1;

flag1=1;

OnPaint();

this-〉GetDlgItem(IDC_BUTTON_LOAD)->EnableWindow(FALSE);

}

在这里,我们只将flag=1和flag1=1条件下的OnPaint()函数展开(系统自己生成的代码我们略去)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有