VC 制作标准圆盘时钟实例
时间:2010-10-22 来源:耿郎
第一步:新建一个MFC单文档的应用程序,工程名称为Clock.
第二步:在生成的CClockView类添加OnInitialUpdate()虚函数;并于函数内设置定时器;具体代码如下:
void CClockView::OnInitialUpdate() //添加虚函数
{
CView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
SetTimer( 1, 1000, NULL );
}
第三步:设置定时器响应函数。为CClockView类添加WM_TIMER消息及OnTime()的消息响应函数,函数体代码为:
void CClockView::OnTimer(UINT nIDEvent) //添加定时器响应消息
{
// TODO: Add your message handler code here and/or call default
Invalidate(TRUE); //使窗口无效
UpdateWindow(); //使窗口立即重绘,刷新窗口
CView::OnTimer(nIDEvent);
}
第四步:在OnDraw()函数中添加如下代码:
RECT Rect; GetClientRect( &Rect ); //得到客户区矩形 // 得到圆心坐标 int nCenterX = Rect.right / 2; int nCenterY = Rect.bottom / 2; // 获取当前时间 CTime Time = CTime::GetCurrentTime(); CString strDigits; int i, x, y; CSize size; pWnd->GetMenuID() =ID_TYPE_ANALOG; // 设置圆盘钟的外圈为黄色 CPen Pen( PS_SOLID, 5, RGB( 255, 255, 0 ) ); CPen *pOldPen = pDC->SelectObject( &Pen ); pDC->Ellipse(nCenterX+5-nCenterY,5,nCenterX+nCenterY-5,Rect.bottom - 5); //画圆 double Radians; // 时间数字为红色 pDC->SetTextColor( RGB( 255, 0, 0 ) ); for(i=1; i<=12; i++ ){ // 格式化时钟对象 strDigits.Format( "%d", i ); size =pDC->GetTextExtent( strDigits, //获得所选字体中指定字符串的高度和宽度 strDigits.GetLength() ); Radians = (double) i * 6.28 / 12.0; //表示角度 6.28=2*PAI x=nCenterX-( size.cx / 2 )+(int)((double)(nCenterY-5)*sin(Radians) ); y=nCenterY-( size.cy / 2 )-(int)((double)(nCenterY-5)*cos(Radians) ); pDC->TextOut( x, y, strDigits ); } // Calculate the radians for the hour hand. Radians =(double) Time.GetHour() + (double) Time.GetMinute() / 60.0 + (double) Time.GetSecond() / 3600.0; Radians *= 6.28 / 12.0; // 时针为绿色 CPen HourPen( PS_SOLID, 5, RGB( 0, 255, 0 ) ); // Select the newly-created CPen object into the DC. pDC->SelectObject( &HourPen ); // Move to the center of the clock, then draw the hour hand line. pDC->MoveTo( nCenterX, nCenterY ); pDC->LineTo( nCenterX + (int) ( (double) ( nCenterY / 3 ) *sin( Radians ) ), nCenterY - (int) ( (double) ( nCenterY / 3 ) *cos( Radians ) ) ); // Calculate the radians for the minute hand. Radians = (double) Time.GetMinute() + (double) Time.GetSecond() / 60.0; Radians *= 6.28 / 60.0; // 分针为蓝色 CPen MinutePen( PS_SOLID, 3, RGB( 0, 0, 255 ) ); // Select the newly-created CPen object into the DC. pDC->SelectObject( &MinutePen ); // Move the to center of the clock, then draw the minute hand line. pDC->MoveTo( nCenterX, nCenterY ); pDC->LineTo( nCenterX + (int) ( (double) ( ( nCenterY * 2 ) / 3 ) * sin( Radians ) ), nCenterY - (int) ( (double) ( ( nCenterY * 2 ) / 3 ) * cos( Radians ) ) ); // Calculate the radians for the second hand. Radians = (double) Time.GetSecond(); Radians *= 6.28 / 60.0; // 秒针为黑色 CPen SecondPen( PS_SOLID, 1, RGB( 0, 0, 0 ) ); // Select the newly-created CPen object into the DC. pDC->SelectObject( &SecondPen ); // Move the to center of the clock, then draw the second hand line. pDC->MoveTo( nCenterX, nCenterY ); pDC->LineTo( nCenterX + (int) ( (double) ( ( nCenterY * 4 ) / 5 ) * sin( Radians ) ), nCenterY - (int) ( (double) ( ( nCenterY * 4 ) / 5 ) * cos( Radians ) ) ); // Select the old CPen object back into the DC. pDC->SelectObject( pOldPen );
第五步:运行即可得到如下界面:
当框拉的较大时,线条的锯齿较明显,不知有什么好方法 可 消除 ?