建立单文档框架,在view类头文件中添加如下代码: const double pi; //小时、分钟和秒的动态值 int m_nHour, m_nMinute, m_nSecond; //是否显示数字 BOOL bShow; //背景的颜色 COLORREF m_rgbBkGround; //指针的颜色 COLORREF m_rgbHands; //时钟刻度的颜色 COLORREF m_rgbPoints; //表盘中心点 CPoint m_ptMiddle; //时钟刻度的距离 int m_nPointWidth; //表盘半径 int m_nRidius; //三个指针 enum HANDTYPE{HOUR_HAND,MINUTE_HAND,SECOND_HAND}; //计算每个时钟刻度的位置 CPoint ComputerFacePoint(int nMinute, int nFaceLength)const; //绘制时钟刻度 void DrawFacePoint(CDC *pDC,const CPoint &ptFace, BOOL bMajor); //绘制钟面 void DrawFace(CDC *pDC); //获取指针的位置 void GetHandPoints(int nValue, HANDTYPE typeHand, CPoint *pptHand); //绘制指针 void DrawHand(CDC *pDC, int nValue, HANDTYPE typeHand); 在view类源文件中实现 //计算每个时钟刻度的位置 CPoint CClockView::ComputerFacePoint(int nMinute, int nFaceLength)const { CPoint ptCalc; //将分钟转换为角度数 double fDegrees = 180+((15+nMinute)%60)*6; //再转换为弧度数 double fAngle = fDegrees/180; //计算刻度点位置 ptCalc.x = m_ptMiddle.x + (int)(cos(fAngle*pi)*nFaceLength); ptCalc.y = m_ptMiddle.y + (int)(sin(fAngle*pi)*nFaceLength); //返回刻度点位置 return(ptCalc); } //绘制时钟刻度 void CClockView::DrawFacePoint(CDC *pDC,const CPoint &ptFace, BOOL bMajor) { //传度刻度点的位置参数 CRect rectPoint(ptFace.x,ptFace.y,ptFace.x,ptFace.y); //绘制小时刻度点 if (bMajor) { //增加高度和宽度,使单点变为小的矩形区 rectPoint.InflateRect((m_nPointWidth/2)+1,(m_nPointWidth/2)+1); pDC->Rectangle(&rectPoint); //增加刻度左上方的突显点和右下方的阴影 pDC->Draw3dRect(&rectPoint,GetSysColor(COLOR_BTNHIGHLIGHT),GetSysColor(COLOR_BTNSHADOW)); } //绘制分钟刻度点 else { //只有当刻度点之间的距离足够大时才绘制 if (m_nPointWidth > 2) { rectPoint.InflateRect(1,1); pDC->Draw3dRect(&rectPoint,GetSysColor(COLOR_BTNHIGHLIGHT),GetSysColor(COLOR_BTNSHADOW)); } } return; } //绘制钟面 void CClockView::DrawFace(CDC *pDC) { //得到客户区大小 CRect rectClient; GetClientRect(&rectClient); //计算钟面的中心位置 m_ptMiddle.x = rectClient.Width()/2; if (bShow) { m_ptMiddle.y = rectClient.Height()/2 - 15; } else { m_ptMiddle.y = rectClient.Height()/2; } if (m_ptMiddle.y < 0) { m_ptMiddle.y = 0; } //计算钟面的半径 m_nRidius = min(m_ptMiddle.x,m_ptMiddle.y); //计算两个刻度之间的距离 m_nPointWidth = (int)m_nRidius/20; if (m_nPointWidth < 2) { m_nPointWidth = 2; } //保存各个刻度点的位置 CPoint ptFace; //设置刻度点的颜色 CBrush brPoint(m_rgbPoints); CBrush* pbrOld = pDC->SelectObject(&brPoint); //刻度所在的圆半径为钟面半径的90% int nFaceLength = MulDiv(m_nRidius,9,10); //绘制各个刻度 for (int nMin=0; nMin<60; nMin++) { //bHour为假表示绘制的是分钟刻度 BOOL bHour = FALSE; //计算一个刻度点的位置 ptFace = ComputerFacePoint(nMin,nFaceLength); //当分钟数是5的倍数时,bHour为真表示绘制小时刻度 if (nMin%5==0) { bHour = true; } //绘制一个刻度点 DrawFacePoint(pDC,ptFace,bHour); } pDC->SelectObject(pbrOld); return; } //获取指针的位置 void CClockView::GetHandPoints(int nValue, HANDTYPE typeHand, CPoint *pptHand) { int nLength = 0; //根据指针的类型区分 switch(typeHand) { case HOUR_HAND: //时针长为钟面半径的一半 nLength = MulDiv(m_nRidius, 50, 100); //因为绘制时针按照分针进行,故需要一些变换 nValue *= 5; nValue += (m_nMinute/12); break; case MINUTE_HAND: nLength = MulDiv(m_nRidius, 70, 100); break; case SECOND_HAND: nLength = MulDiv(m_nRidius, 80, 100); break; default: ASSERT(false); } //得到时针和分针外形的四个点 if (typeHand == HOUR_HAND || typeHand == MINUTE_HAND) { pptHand[0] = ComputerFacePoint(nValue+30,m_nPointWidth*2); pptHand[1] = ComputerFacePoint(nValue+15,m_nPointWidth); pptHand[2] = ComputerFacePoint(nValue,nLength); pptHand[3] = ComputerFacePoint(nValue-15,m_nPointWidth); } //得到秒针的两个端点 else { pptHand[0] = m_ptMiddle; pptHand[1] = ComputerFacePoint(nValue,nLength); } } //绘制指针 void CClockView::DrawHand(CDC *pDC, int nValue, HANDTYPE typeHand) { CPoint ptHand[4]; //得到指针的位置 GetHandPoints(nValue,typeHand,ptHand); if (typeHand == HOUR_HAND || typeHand == MINUTE_HAND) { //设置画刷、画笔 CBrush brHand(m_rgbHands); CPen penHand(PS_SOLID,1,RGB(0,0,0)); CBrush *pbrOld = pDC->SelectObject(&brHand); CPen *ppenOld = pDC->SelectObject(&penHand); //绘制一个四边形 pDC->Polygon(ptHand,4); pDC->SelectObject(pbrOld); pDC->SelectObject(ppenOld); //绘制秒指针 DrawHand(pDC,m_nSecond,SECOND_HAND); } else { pDC->MoveTo(ptHand[0]); pDC->LineTo(ptHand[1]); } }