自制一个小巧的时钟(部分源代码)---VC

       这是本人正式参加工作以后(三个月前)接到的第一个编程任务,只是用来测试我的编程能力,完整的是编写一个月历配上时钟,这边只是提供了时钟的程序,虽然有些简陋但是已经有时钟的样子!其实程序本身也没有什么技术含量,不过对于我的意义挺大,故写入我的博客,与大家分享一下!我当时大概用了一个小时吧,编出来挺有成就感的,程序员最大的乐趣也就这么多了!
    时钟的关键其实不足获得时间,而在于怎么画那个钟面!还是能小小的考察一下逻辑能力的!


以下为主要代码:

void CTimeDlg::OnTimer(UINT nIDEvent)
{
    // TODO: Add your message handler code here and/or call default

    CTime time;
    time=time.GetCurrentTime();
    m_iHour=time.GetHour();
    m_iMinute=time.GetMinute();
    m_iSecond=time.GetSecond();

    InvalidateRect(m_rtClockRect,FALSE);
    CDialog::OnTimer(nIDEvent);
}


void CTimeDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting

        SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CPaintDC dc(this);

       
        m_rtClockRect.top=150;
        m_rtClockRect.left=430;
        m_rtClockRect.right=530;
        m_rtClockRect.bottom=250;
        POINT ptCenter,ptSecond,ptMunite,ptHour;
       
        ptCenter.x=m_rtClockRect.left+(m_rtClockRect.right-m_rtClockRect.left)/2;
        ptCenter.y=m_rtClockRect.top+(m_rtClockRect.bottom-m_rtClockRect.top)/2;
       
        dc.Ellipse(&m_rtClockRect);
       
        ptSecond.x=ptCenter.x+50*sin(m_iSecond*pi/30);
        ptSecond.y=ptCenter.y-50*cos(m_iSecond*pi/30);
       
        ptMunite.x=(ptCenter.x+50*sin(m_iMinute*pi/30)*0.8);//*0.8;
        ptMunite.y=(ptCenter.y-50*cos(m_iMinute*pi/30)*0.8);//*0.8;
       
       
        ptHour.x=(ptCenter.x+50*sin(m_iHour*pi/6+m_iMinute*pi/360)*0.6);//*0.6;
        ptHour.y=(ptCenter.y-50*cos(m_iHour*pi/6+m_iMinute*pi/360)*0.6);//*0.6;
       
   
        CPen pen,*oldpen;
        pen.CreatePen(PS_SOLID,2,RGB(100,100,100));
        oldpen=dc.SelectObject(&pen);
        dc.MoveTo(ptCenter);
        dc.LineTo(ptSecond);
        dc.MoveTo(ptCenter);
        dc.LineTo(ptMunite);
        dc.MoveTo(ptCenter);
        dc.LineTo(ptHour);
        dc.SelectObject(oldpen);


        POINT ptPos1[12],ptPos2[12],ptPos3[12];
        for(int iPos=0;iPos<12;iPos++)
        {
            ptPos1[iPos].x=ptCenter.x+50*sin(iPos*pi/6);
            ptPos1[iPos].y=ptCenter.y-50*cos(iPos*pi/6);

            ptPos2[iPos].x=ptCenter.x+50*sin(iPos*pi/6)*0.87;
            ptPos2[iPos].y=ptCenter.y-50*cos(iPos*pi/6)*0.87;

            ptPos3[iPos].x=ptCenter.x+50*sin(iPos*pi/6)*1.2-8;
            ptPos3[iPos].y=ptCenter.y-50*cos(iPos*pi/6)*1.2-8;

           
            dc.MoveTo(ptPos2[iPos]);
            dc.LineTo(ptPos1[iPos]);
       

            CString str;
            if(iPos==0)
            {
                str.Format("%d",12);
            }
            else
            {
            str.Format("%d",iPos);
            }
            dc.SetBkMode(TRANSPARENT);
            dc.TextOut(ptPos3[iPos].x,ptPos3[iPos].y,str);
        }


        POINT ptPos4[60],ptPos5[60];
        for(iPos=0;iPos<60;iPos++)
        {
            ptPos4[iPos].x=ptCenter.x+50*sin(iPos*pi/30);
            ptPos4[iPos].y=ptCenter.y-50*cos(iPos*pi/30);

            ptPos5[iPos].x=ptCenter.x+50*sin(iPos*pi/30)*0.93;
            ptPos5[iPos].y=ptCenter.y-50*cos(iPos*pi/30)*0.93;


            dc.MoveTo(ptPos4[iPos]);
            dc.LineTo(ptPos5[iPos]);

        }

        CDialog::OnPaint();
        ShowDate();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值