zoukankan      html  css  js  c++  java
  • [游戏学习28] MFC 时钟

    >_<:这是一个时钟小程序

    >_<:通过调用获得系统时间然后经过计算得出当前时间,然后再以3个圆环表示时分秒。

    >_<:TAO_CLOCK.h

     1 class CMyApp : public CWinApp
     2 {
     3 public:
     4     virtual BOOL InitInstance ();
     5 };
     6 
     7 class CMainWindow : public CFrameWnd
     8 {
     9 protected:
    10  
    11 
    12     int m_nPrevSecond;        
    13     int m_nPrevMinute;
    14     int m_nPrevHour;
    15 
    16     void Draw(CDC* pDC, int nLength, int nDegrees,
    17         COLORREF clrColor);//绘制针
    18     void DrawQ(CDC* pDC, int nLength, COLORREF clrColor);//圈遮盖
    19 
    20 public:
    21     CMainWindow ();
    22 
    23 protected:
    24     afx_msg int OnCreate (LPCREATESTRUCT lpcs);       //设置计时器
    25     afx_msg void OnTimer (UINT nTimerID);              //当WM_TIMER消息到达后就得到当前时间....
    26     afx_msg void OnPaint ();
    27     afx_msg void OnClose ();                           //清楚计时器
    28 
    29     DECLARE_MESSAGE_MAP ()
    30 };

    >_<:TAO_CLOCK.cpp

      1 #include <afxwin.h>
      2 #include <math.h>
      3 #include "TAO_CLOCK.h"
      4 
      5 #define SQUARESIZE 20
      6 #define ID_TIMER_CLOCK 1
      7 #define kuan  60
      8 #define miaoL 200
      9 #define fenL  miaoL-kuan
     10 #define shiL  fenL-kuan
     11 
     12 CMyApp myApp;
     13 
     14 /////////////////////////////////////////////////////////////////////////
     15 // CMyApp member functions
     16 
     17 BOOL CMyApp::InitInstance ()
     18 {
     19     SetRegistryKey (_T ("Programming Windows with MFC"));
     20     m_pMainWnd = new CMainWindow;
     21     m_pMainWnd->ShowWindow (m_nCmdShow);
     22     m_pMainWnd->UpdateWindow ();
     23     return TRUE;
     24 }
     25 
     26 /////////////////////////////////////////////////////////////////////////
     27 // CMainWindow message map and member functions
     28 
     29 BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd)
     30     ON_WM_CREATE ()
     31     ON_WM_PAINT ()
     32     ON_WM_TIMER ()
     33     ON_WM_CLOSE ()
     34 END_MESSAGE_MAP ()
     35 
     36 CMainWindow::CMainWindow ()
     37 {
     38   
     39     //得到系统时间,然后初始化时分秒
     40     CTime time = CTime::GetCurrentTime ();
     41     m_nPrevSecond = time.GetSecond ();
     42     m_nPrevMinute = time.GetMinute ();
     43     m_nPrevHour = time.GetHour () % 12;
     44 
     45     CString strWndClass = AfxRegisterWndClass (
     46         CS_HREDRAW | CS_VREDRAW,
     47         myApp.LoadStandardCursor (IDC_ARROW),
     48         (HBRUSH) (COLOR_3DFACE + 1),
     49         NULL
     50     );
     51 
     52     Create (strWndClass, _T ("Life_leving"));
     53 }
     54 
     55 
     56 int CMainWindow::OnCreate (LPCREATESTRUCT lpcs)
     57 {
     58     if (CFrameWnd::OnCreate (lpcs) == -1)
     59         return -1;
     60 
     61     //
     62     // Set a timer to fire at 1-second intervals.
     63     //
     64     if (!SetTimer (ID_TIMER_CLOCK, 1000, NULL)) {
     65         MessageBox (_T ("SetTimer failed"), _T ("Error"),
     66             MB_ICONSTOP | MB_OK);
     67         return -1;
     68     }
     69 
     70     return 0;
     71 }
     72 
     73 void CMainWindow::OnClose ()
     74 {
     75     KillTimer (ID_TIMER_CLOCK);
     76     CFrameWnd::OnClose ();
     77 }
     78 
     79 
     80 //当WM_TIMER消息到达后,它就得到当前时间,
     81 //他将时分秒分别与成员变量记录的时分秒比较
     82 //如果相同不会执行任何操作,否则将记录新时间
     83 //并移动Clock的指针
     84 void CMainWindow::OnTimer (UINT nTimerID)
     85 {
     86     /*判断窗口当前是否最小化,最小化返回非0
     87     可以减小CPU负担isZoomed()判断最大化
     88     但是在任务栏鼠标靠近时不显示时钟走动效果
     89     if (IsIconic ())
     90         return;
     91     */
     92 
     93     //获取当前时间并与记录时间比较,一样不做任何处理
     94     CTime time = CTime::GetCurrentTime ();
     95     int nSecond = time.GetSecond ();
     96     int nMinute = time.GetMinute ();
     97     int nHour = time.GetHour () % 12;
     98 
     99     if ((nSecond == m_nPrevSecond) &&
    100         (nMinute == m_nPrevMinute) &&
    101         (nHour == m_nPrevHour))
    102         return;
    103     
    104     //最小化时显示数字时钟
    105     if(IsIconic()){
    106         CString time;
    107         time.Format(_T("%0.2d: %0.2d: %0.2d"),nHour,nMinute,nSecond);
    108         SetWindowText(time);
    109         return;
    110     }
    111     SetWindowText(_T("Life_leving"));
    112 
    113     //MM_ISOTROPIC:X轴和Y轴具有相同的逻辑单位(映射)
    114     //设置每个方向上设置具有1000个单位
    115     //把原点移至中心
    116     CRect rect;
    117     GetClientRect (&rect);
    118 
    119     CClientDC dc (this);
    120     dc.SetMapMode (MM_ISOTROPIC);
    121     dc.SetWindowExt (1000, 1000);
    122     dc.SetViewportExt (rect.Width (), -rect.Height ());
    123     dc.SetViewportOrg (rect.Width () / 2, rect.Height () / 2);
    124 
    125     //
    126     // If minutes have changed, erase the hour and minute hands.
    127     //
    128     COLORREF clrColor = ::GetSysColor (COLOR_3DFACE);
    129 
    130     
    131 
    132     if (nMinute != m_nPrevMinute) {
    133         m_nPrevMinute = nMinute;//更新时分
    134         m_nPrevHour = nHour;
    135     }
    136 
    137     //
    138     // If seconds have changed, erase the second hand and redraw all hands.
    139     //
    140     if (nSecond != m_nPrevSecond) {
    141         CRect rect(-5000,5000,5000,-5000);
    142         CBrush brush(clrColor);
    143         CBrush* pOldBrush=dc.SelectObject(&brush);
    144         dc.Rectangle(rect);
    145         dc.SelectObject(pOldBrush);
    146         Draw(&dc,miaoL, nSecond * 6, RGB (255, 0, 0));//每秒走6度
    147         Draw(&dc,shiL, (nHour * 30) + (nMinute / 2),//每小时30度+每分钟0.5度
    148             RGB (0, 0, 255));
    149         Draw(&dc, fenL,  nMinute * 6, RGB (0, 255, 0));//每分钟6度
    150         m_nPrevSecond = nSecond;//更新秒
    151     }
    152 
    153     //if(nSecond==0)DrawQ(&dc,miaoL,clrColor);
    154     //if(nMinute==0)DrawQ(&dc,fenL,clrColor);
    155     //if(nHour==0)DrawQ(&dc,shiL,clrColor);
    156     
    157 }
    158 
    159 void CMainWindow::OnPaint ()
    160 {
    161     //重绘的时候也要重新设定窗口映射
    162     CRect rect;
    163     GetClientRect (&rect);
    164 
    165     CPaintDC dc (this);
    166     dc.SetMapMode (MM_ISOTROPIC);
    167     dc.SetWindowExt (1000, 1000);
    168     dc.SetViewportExt (rect.Width (), -rect.Height ());
    169     dc.SetViewportOrg (rect.Width () / 2, rect.Height () / 2);
    170     
    171     //画上钟面+时分秒针
    172     Draw(&dc,shiL, (m_nPrevHour * 30) +
    173         (m_nPrevMinute / 2), RGB (0, 0, 255));
    174     Draw(&dc,fenL, m_nPrevMinute * 6, RGB (0, 255, 0));
    175     Draw(&dc,miaoL, m_nPrevSecond * 6, RGB (255, 0, 0));
    176 
    177     COLORREF clrColor = ::GetSysColor (COLOR_3DFACE);
    178 
    179 }
    180 
    181 
    182 
    183 //画秒针
    184 void CMainWindow::Draw (CDC* pDC, int nLength ,
    185     int nDegrees, COLORREF clrColor)
    186 {
    187     CPoint point[2];
    188     CRect rect(-(nLength+kuan),(nLength+kuan),(nLength+kuan),-(nLength+kuan));
    189 
    190     double nRadians = (double) nDegrees * 0.017453292;//转化为弧度制
    191     
    192     point[0].x = 0;
    193     point[0].y = 900;
    194     point[1].x = (int) ((nLength+600) * sin (nRadians));//注意转换(坐标系变换)
    195     point[1].y = (int) ((nLength+600) * cos (nRadians));
    196 
    197     CPen pen (PS_SOLID,kuan, clrColor);
    198     CPen* pOldPen = pDC->SelectObject (&pen);
    199 
    200     pDC->Arc(rect,point[1],point[0]);
    201 
    202     pDC->SelectObject (pOldPen);
    203 }
    204 
    205 //画圈
    206 void CMainWindow::DrawQ (CDC* pDC, int nLength, COLORREF clrColor){
    207 
    208     CRect rect(-(nLength+kuan),(nLength+kuan),(nLength+kuan),-(nLength+kuan));
    209     CPen pen (PS_SOLID,kuan, clrColor);
    210     CBrush brush(clrColor);
    211     CPen* pOldPen = pDC->SelectObject (&pen);
    212     CBrush* pOldBrush = pDC->SelectObject (&brush);
    213     pDC->Ellipse(rect);
    214     Draw(pDC,shiL, (m_nPrevHour * 30) + (m_nPrevMinute / 2),//每小时30度+每分钟0.5度
    215             RGB (0, 0, 255));
    216     Draw(pDC, fenL,  m_nPrevMinute * 6, RGB (0, 255, 0));//每分钟6度
    217     pDC->SelectObject (pOldPen);
    218     pDC->SelectObject (pOldBrush);
    219 }
  • 相关阅读:
    SQL Server 2005: About login password hashes
    record drop database in sql log
    一些锁的示例
    find the physical location for specified data row
    运行sp_xp_cmdshell_proxy_account 出现的错误
    删除用户出现的错误
    conversion to dalvik format failed with error 1
    文章标题 标签提取
    in order to continue installation,please close the following application;
    提示找不到 C:\Program Files\VMware\dndlogs\dndlog.conf
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/3735436.html
Copyright © 2011-2022 走看看