更新时间:2016-04-21 23:36:38浏览次数:1+次
void Ct1Dlg::OnBnClickedOk()
{
SetTimer(1,10,0);
}
我们这里就是简单的创建一个计时器,设置第二个参数即计时器执行的间隔时间为10ms。第一个参数为计时器ID,随便设置一个就可以。第三个参数填0或者NULL,表示我们不单独提供计时器处理函数,使用标准的计时器消息。然后我们给窗口添加一个计时器消息处理函数。这个可以使用向导轻松完成,在向导的消息栏中找到WM_TIMER,然后双击WM_TIMER即可添加响应消息。具体的过程我就不在这里说了,熟悉的一看就知道,不熟悉的就多熟悉一下。void Ct1Dlg::OnTimer(UINT_PTR nIDEvent)
{
static int i=0;
CDC * pDC = GetDC();
//设置字体和大小
CFont font;
font.CreatePointFont(300,_T("黑体"));
pDC->SelectObject(font.m_hObject);
CString str;
str.Format(_T("C++技术网www.cjjjs.com:%d"),i++);
pDC->TextOut(0,0,str);
pDC->DeleteDC();
}
计时器中就是简单的输出【C++技术网www.cjjjs.com:数字】,数字不断的增加。而这个计时器执行的时间间隔非常小,所以执行频率非常高。下面是执行的效果:
void Ct1Dlg::OnTimer(UINT_PTR nIDEvent)
{
static int i=0;
CDC * pDC = GetDC();
//设置字体和大小
CFont font;
font.CreatePointFont(300,_T("黑体"));
pDC->SelectObject(font.m_hObject);
CString str;
str.Format(_T("C++技术网www.cjjjs.com:%d"),i++);
pDC->TextOut(0,0,str);
pDC->TextOut(0,60,str);
pDC->TextOut(0,120,str);
pDC->TextOut(0,180,str);
pDC->TextOut(0,240,str);
pDC->TextOut(0,300,str);
pDC->TextOut(0,360,str);
pDC->DeleteDC();
}
此时我将计时器间隔设置为100ms,单行文字输出几乎不怎么闪烁了。然而输出了7行之后,发现有了明显的闪烁。当刷新频率不变,输出的内容越多的时候,闪烁也就越明显。这里我们又可以得到一个结论:闪烁的几率和输出的内容成正比,内容越多,闪烁几率越大。void Ct1Dlg::OnTimer(UINT_PTR nIDEvent)
{
static int i=0;
CDC * pDC = GetDC();
//设置字体和大小
CFont font;
font.CreatePointFont(300,_T("黑体"));
pDC->SelectObject(font.m_hObject);
CString str;
//修改其他属性
pDC->SetBkMode(TRANSPARENT);
str.Format(_T("C++技术网www.cjjjs.com:%d"),i++);
pDC->TextOut(0,0,str);
pDC->TextOut(0,60,str);
pDC->TextOut(0,120,str);
pDC->TextOut(0,180,str);
pDC->TextOut(0,240,str);
pDC->TextOut(0,300,str);
pDC->TextOut(0,360,str);
pDC->DeleteDC();
}
通过试验发现,确实不闪烁了。效果图如下:
我们到这里,就知道了闪烁的一个必要条件,即多次连续绘制的颜色反差。我想这个是稍微有些研究的人知道的答案,很多人就此止步,以为就仅此而已了。然而,这个和双缓冲绘图有毛线关系?网上很多文章也就到此为止了。实际上,只了解到这个程度,有一定的进步,然而却模模糊糊的,实际上还没有搞懂。使用双缓冲技术也只是知道这个技术可以避免闪烁,然而为什么,实际上还是不知道。你要问如何避免闪烁,他会用双缓冲来处理。为什么呢,他不知道。
限于篇幅,我将在下一篇文章详细讲解更多闪烁的深入原因细节。精彩不可错过哦。不过在看下一篇文章前,请消化本文的问题。
相关资讯