我想在窗口客户区显示当前时钟,在一秒定时器OnTimer()中处理:
void CClockDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
switch(nIDEvent)
{
case 1:
//定义DC
CClientDC ClientDC(this);
SYSTEMTIME curtime;
//获取本地时间
::GetLocalTime (&curtime);
CString TimeStr;
//格式化时间
TimeStr.Format ("%02d:%02d:%02d",curtime.wHour ,
curtime.wMinute ,curtime.wSecond );
//创建新字体
CFont NewFont;
CFont *pOldFont;
int pointsize=12;
int logicalinch=ClientDC.GetDeviceCaps (LOGPIXELSY);
int fontheight=::MulDiv (pointsize,logicalinch,72);
NewFont.CreateFont (fontheight,0,0,0,FW_BOLD,FALSE,
FALSE,FALSE,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,
CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,
DEFAULT_PITCH| FF_DONTCARE,"宋体");
pOldFont=ClientDC.SelectObject (&NewFont);
//显示时间,日期
ClientDC.SetBkMode (TRANSPARENT);
ClientDC.SetTextColor (RGB(0,0,0));
ClientDC.TextOut (0,0,TimeStr);
//选入旧字体
ClientDC.SelectObject (pOldFont);
break;
}
CDialog::OnTimer(nIDEvent);
}
程序运行后,为何随着秒的变化,显示的变化文本都叠加在一起,比如:上一秒显示“21:30:11”,本次显示“21:30:12”,本次的12显示出来了,可上次11没有擦除。
我在开头加入两句:
Invalidate();
UpdateWindow();
虽然显示正常了,但会有闪烁,请问如何解决?
InvalidataRect(CRect &)
//创建新字体
CFont NewFont;
CFont *pOldFont;
int pointsize=12;
int logicalinch=ClientDC.GetDeviceCaps (LOGPIXELSY);
int fontheight=::MulDiv (pointsize,logicalinch,72);
NewFont.CreateFont (fontheight,0,0,0,FW_BOLD,FALSE,
FALSE,FALSE,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,
CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,
DEFAULT_PITCH| FF_DONTCARE,"宋体");
pOldFont=ClientDC.SelectObject (&NewFont);
//显示时间,日期
ClientDC.SetBkMode (TRANSPARENT);
ClientDC.SetTextColor (RGB(0,0,0));
ClientDC.TextOut (0,0,TimeStr);
//选入旧字体
ClientDC.SelectObject (pOldFont);
-----------------------
1)在外部声明字体,然后在这里引用就行了,不用每次都设置
2)画一个矩形擦除原先的文字。
重载 WM_ERASEBKGND , 直接返回, 防止窗体重绘背景