首页 > 代码库 > [游戏学习28] MFC 时钟
[游戏学习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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。