实验环境:Windows XP,Visual Studio 2010 Ultimate
1 创建项目
1.1 文件>>新建>>项目,选择“其他语言”>>Visual C++,选中“MFC应用程序”。项目名改为“First”。如下图所示:
1.2 在上图中,单击确认后,将会弹出”MFC应用向导“,在其中的”应用程序类型“界面中,设置如下图所示。
1.3 直接点击”完成“,其他的保存默认设置即可。
2 点击菜单栏的“视图”,依次找到“解决方案资源管理器”,“工具箱”,“类视图”,“资源视图”和“属性窗口”,分别单击它们。菜单如下图所示。
创建好工程后,效果图如下图所示
3.1 在“类视图”中找到CFirstView(视图类),右键单击,将会弹出一个向导,通过这个向导可以向这个类中添加变量和函数。如下图所示。
3.2 为CFirstView添加一个变量,如下图所示意。
3.3 为CFirstView添加一个函数,如下图所示。
3.4 添加定时器。
在“类视图”中右键单击,在弹出来的对话框中选择“属性”,在“属性”的上方,选择“消息”,在消息列表中找到WM_TIMER,在其右侧的下拉选项中选中OnTimer。如下图所示。
3.5 添加启动和停止按钮
3.5.1 双击“资源视图”中的Menu下的IDR_MAINFRAME,如下图所示。
3.5.2 在打开的主菜单中添加“设置”菜单,为“设置”添加“启动”和“停止”两个下拉菜单,他们的ID分别为ID_START和ID_STOP。
通过右击菜单,选择“属性”去设置。如下图所示。
3.5.3 为“启动”和“停止”添加事件处理函数。
右击“启动”,在弹出来的对话框中选择“添加事件处理程序”。如下图所示。
在弹出来的“事件处理程序向导”中,消息类型选择“COMMAND”,类列表选择CFirstView,然后单击“添加编辑”,即可在CFirstView类中
添加了一个OnStart()函数。
用同样的方法为“停止”添加事件处理函数。
4 添加代码
4.1 在CFirstView类的构造函数中,将m_nCurColor变量赋值为-1.如下所示。
CFirstView::CFirstView()
: m_nCurColor(0)
{
// TODO: 在此处添加构造代码
m_nCurColor=-1;//m_nCurColor表示当前需要让哪种颜色的灯闪烁。
}
4.2 完善刚才添加的DrawCircle函数,如下所示。
int CFirstView::DrawCircle(int CurColor, CDC* pDC)
{
pDC->Rectangle(80,80,220,440);
CRect rRect(100,100,200,200);
CRect gRect(100,210,200,310);
CRect yRect(100,320,200,420);
CBrush rBrush(RGB(255,0,0));
CBrush gBrush(RGB(0,0,255));
CBrush yBrush(RGB(255,255,0));
CBrush wBrush(RGB(255,255,255));
CBrush *pOldBrush;
if(CurColor==0)//CurColor表示当前红绿灯的颜色
{
pDC->Ellipse(&gRect);
pDC->Ellipse(&yRect);
pOldBrush=pDC->SelectObject(&rBrush);
pDC->Ellipse(&rRect);
}
else if(CurColor==1)
{
pDC->Ellipse(&rRect);
pDC->Ellipse(&yRect);
pOldBrush=pDC->SelectObject(&gBrush);
pDC->Ellipse(&gRect);
}
else if(CurColor==2)
{
pDC->Ellipse(&rRect);
pDC->Ellipse(&gRect);
pOldBrush=pDC->SelectObject(&yBrush);
pDC->Ellipse(&yRect);
}
else
{
pOldBrush=pDC->SelectObject(&wBrush);
pDC->Ellipse(&rRect);
pDC->Ellipse(&gRect);
pDC->Ellipse(&yRect);
}
pDC->SelectObject(pOldBrush);
return 0;
}
4.3 完善定时器函数OnTimer(),如下所示。
void CFirstView::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_nCurColor=(++m_nCurColor)%3;
Invalidate();
CView::OnTimer(nIDEvent);
}
4.4 为“启动”和“停止”添加事件处理响应。
void CFirstView::OnStart()
{
// TODO: 在此添加命令处理程序代码
SetTimer(1,1000,NULL);
}
void CFirstView::OnStop()
{
// TODO: 在此添加命令处理程序代码
KillTimer(1);
m_nCurColor=-1;
Invalidate();
}
4.5 修改OnDraw函数
OnDraw函数是创建工程的时候就已经自动生成的了。由于他的pDC参数被注释了,因此要去掉其注释。并且在//TODO下方添加代码。如下所示。
void CFirstView::OnDraw(CDC* pDC)
{
CFirstDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
DrawCircle(m_nCurColor,pDC);
}
在Visual Studio 2010 主菜单中单击“启动”|“启动调试”,生成可执行文件后,在程序的运行界面上,单击我们创建的“设置”|"启动"菜单,即可看到
红绿蓝三种颜色的“灯”循环点亮/熄灭。如下图所示。
6 工程源码。http://download.csdn.net/detail/q1302182594/5213571。
7 本项目的运行流程分析,请看《Visual Studio 2010——MFC应用程序调用顺序分析》。
8 参考文献
荣钦科技:李淑馨,陈伟 编著.Viusal C++ 2008程序设计完全自学教程.北京:清华大学出版社,2009
吕智,马瑞力等编著.Visual C++.NET精彩编程百例.北京:中国水利水电出版社,2004
梁兴柱主编.Visual C++.NET程序设计.北京:清华大学出版社,2010