本节主要简单学习下绘制基本图形,并设置一个定时器,图形会随时间变化而变化。
效果就是上面这三个图形轮流变化。
首先新建一个MFC项目,选择单文档模式、
图像显示主要是在view类中操作的,所以下面所有的操作都是在view类中进行、
首先在view类中新建一个变量int m_PicChange;// 标识要绘制的图像编号。
并在构造函数中初始化。
因为要随时间变化,所以需要设置一个定时器。
在view类上右键添加windows消息事件处理函数或者在类向导中添加也可以。
添加WM_CREATE和WM_TIMER的消息处理函数。
WM_CREATE消息中我们要做的是 在程序运行时,就添加一个定时器。
WM_TIMER消息中我们要处理的时候定时器时间结束时改变要显示的图像编号的值。
int CP1_1View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// 添加定时器
SetTimer(1, 1000, 0);
return 0;
}
当定时结束时,会发送一个WM_TIMER消息供我们处理,
void CP1_1View::OnTimer(UINT nIDEvent)
{
//获取指针pdc
CDC *pDC=GetDC();
//调用OnDraw(pDC)重画
OnDraw(pDC);
//使m_PicChange循环
m_PicChange=(m_PicChange+1)%3;
CView::OnTimer(nIDEvent);
}
这个函数主要还是改变m_PicChange的值,并通知系统重绘界面。
所以主要还是OnDraw中处理的内容,是主要显示图像的函数。
void CP1_1View::OnDraw(CDC* pDC)
{
CP1_1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// 使用白色底边填充背景 做到删除上一个图形的效果
CBrush myBrush;
myBrush.CreateSolidBrush(RGB(255,255,255));
pDC->FillRect(CRect(0,0,1024,768), &myBrush);
if ( m_PicChange == 0 )
// 画方
pDC->Rectangle(10,10,50,50);
else if ( m_PicChange == 1 )
// 画圆
pDC->Ellipse(10,10,50,50);
else
{
// 画三角
pDC->MoveTo(30,10);
pDC->LineTo(10,50);
pDC->LineTo(50,50);
pDC->LineTo(30,10);
}
}
代码也比较简单。上面是清除上一个图像,下面是根据当前要显示的图像编号,进行绘图。
mfc可以绘制的图形很多,也可以使用画笔,笔刷进行上色填充等,后面会慢慢介绍。