谢谢吧主,共同进步。
因为水平有限,请大家指正。我加了点注释,这是OnPaint中的代码:
#define angtoarc 0.017453292
void CMainFrame::OnPaint() {
static CPoint pt[]={CPoint(0,445),CPoint(222,385),CPoint(385,222),CPoint(445,0)
,CPoint(385,-222),CPoint(222,-385),CPoint(0,-445),CPoint(-222,-385),CPoint(-385,-222),CPoint(-445,0),
CPoint(-385,222),CPoint(-222,385),CPoint(0,0)};//定义时钟中心和12个小时点
//定义12个数组来绘制三角形
static CPoint pt1[]={CPoint(0,415),CPoint(9,430),CPoint(-9,430)};
static CPoint pt5[]={CPoint(207,360),CPoint(208,375),CPoint(219,365)};
static CPoint pt6[]={CPoint(360,207),CPoint(375,208),CPoint(365,219)};
static CPoint pt7[]={CPoint(207,-360),CPoint(208,-375),CPoint(219,-365)};
static CPoint pt8[]={CPoint(360,-207),CPoint(375,-208),CPoint(365,-219)};
static CPoint pt9[]={CPoint(-207,-360),CPoint(-208,-375),CPoint(-219,-365)};
static CPoint pt2[]={CPoint(415,0),CPoint(430,9),CPoint(430,-9)};
static CPoint pt3[]={CPoint(0,-415),CPoint(9,-430),CPoint(-9,-430)};
static CPoint pt4[]={CPoint(-415,0),CPoint(-430,9),CPoint(-430,-9)};
static CPoint pt10[]={CPoint(-360,-207),CPoint(-375,-208),CPoint(-365,-219)};
static CPoint pt11[]={CPoint(-207,360),CPoint(-208,375),CPoint(-219,365)};
static CPoint pt12[]={CPoint(-360,207),CPoint(-375,208),CPoint(-365,219)};
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
//设置映射模式,窗口大小及方向,确定坐标系
dc.SetMapMode(MM_ISOTROPIC);
dc.SetWindowExt(1000,1000);
dc.SetViewportExt(rect.Width(),-rect.Height());
dc.SetViewportOrg(rect.Width()/2,rect.Height()/2);
CBrush *poldbrush=(CBrush*)dc.SelectStockObject(NULL_BRUSH);
CPen pen(PS_SOLID,10,RGB(255,0,255));
CPen *poldpen=dc.SelectObject(&pen);
//绘制外圆和内圆
dc.Ellipse(-466,466,466,-466);
dc.Ellipse(-410,410,410,-410);
dc.SelectObject(poldbrush);
//选择白色画刷绘制12个白色小圆
poldbrush=(CBrush*)dc.SelectStockObject(WHITE_BRUSH);
for (int i=0;i<13;i++)
{
dc.Ellipse(pt[i].x-SMALLCIRCEL,pt[i].y+SMALLCIRCEL,pt[i].x+SMALLCIRCEL,pt[i].y-SMALLCIRCEL);
}
//绘制三角形
dc.Polygon(pt1,3);
dc.Polygon(pt2,3);
dc.Polygon(pt3,3);
dc.Polygon(pt4,3);
dc.Polygon(pt5,3);
dc.Polygon(pt6,3);
dc.Polygon(pt7,3);
dc.Polygon(pt8,3);
dc.Polygon(pt9,3);
dc.Polygon(pt10,3);
dc.Polygon(pt11,3);
dc.Polygon(pt12,3);
dc.SelectObject(poldbrush);
dc.SelectObject(poldpen);
dc.SetTextAlign(TA_CENTER);
//因为原来窗口有标题栏,所以在去掉标题栏后,调整视口原点
dc.OffsetViewportOrg(3,-9);
CFont font;
//绘制时钟表面上的12-6点字符
for (double k=0.0;k<3.1415;k+=0.524)
{
int x=(int)(sin(k)*360);
int y=(int)(cos(k)*360);
dc.SetBkMode(TRANSPARENT);
CString str;
if (k!=0.0)
str.Format("%d",(int)(k/0.5));
else
str.Format("%d",(int)(k/0.5)+12);
dc.TextOut(x,y,str);
}
//绘制时钟表面上的7-11点字符
for (double kk=3.1415;kk<6.284;kk+=0.524)
{
int x=(int)(sin(kk)*390);
int y=(int)(cos(kk)*360);
CString str;
str.Format("%d",(int)(kk/0.5));
dc.TextOut(x,y,str);
}
//调整视口原点
dc.OffsetViewportOrg(-3,9);
dc.SelectObject(poldbrush);
//根据当时时间绘制指针
CPen pen2(PS_SOLID,16,RGB(255,255,0));
CPen* poldpen=dc.SelectObject(&pen2);
CTime time=CTime::GetCurrentTime();
m_prehour=time.GetHour()%12;
m_premintes=time.GetMinute();
m_seconds=time.GetSecond();
CPoint hpt;
hpt.x=(long)(sin(double((m_prehour*30+m_premintes/2)*angtoarc))*250);
hpt.y=(long)(cos(double((m_prehour*30+m_premintes/2)*angtoarc))*250);
dc.MoveTo(0,0);
dc.LineTo(hpt);
hpt1=hpt;
CPoint mpt;
mpt.x=(long)(sin(double((m_premintes*6)*angtoarc))*350);
mpt.y=(long)(cos(double((m_premintes*6)*angtoarc))*350);
dc.MoveTo(0,0);
dc.LineTo(mpt);
hpt2=mpt;
dc.SelectObject(poldpen);
CPen pen3(PS_SOLID,11,RGB(255,0,255));
poldpen=dc.SelectObject(&pen3);
CPoint spt;
spt.x=(long)(sin(double((m_seconds*6)*angtoarc))*380);
spt.y=(long)(cos(double((m_seconds*6)*angtoarc))*380);
dc.MoveTo(0,0);
dc.LineTo(spt);
hpt3=spt;
dc.SelectObject(poldpen);
}