模拟小时钟 以下是模拟小时钟的部分源代码,仅供参考。 头文件: // ClockDlg.h : header file // #if !defined(AFX_CLOCKDLG_H__266B5DA3_86D9_4ECD_A57A_DBED4E7D26CE__INCLUDED_) #define AFX_CLOCKDLG_H__266B5DA3_86D9_4ECD_A57A_DBED4E7D26CE__INCLUDED_ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 / // CClockDlg dialog class CClockDlg : public CDialog { // Construction public: CClockDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CClockDlg) enum { IDD = IDD_CLOCK_DIALOG }; // NOTE: the ClassWizard will add data members here //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CClockDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: HICON m_hIcon; // Generated message map functions //{{AFX_MSG(CClockDlg) virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg void OnTimer(UINT nIDEvent); afx_msg void OnDestroy(); afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: CBitmap m_bmpDial; void PaintBkgnd(CDC *pDC); }; //{{AFX_INSERT_LOCATION}} // Microsoft eMbedded Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_CLOCKDLG_H__266B5DA3_86D9_4ECD_A57A_DBED4E7D26CE__INCLUDED_) 源文件: // ClockDlg.cpp : implementation file // #include "stdafx.h" #include "Clock.h" #include "ClockDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #include <math.h> #define PI 3.1415926 #define DOT_X 400 //圆心X轴坐标 #define DOT_Y 240 //圆心Y轴坐标 #define LENGTH_HOUR 80 //时针的长度 #define LENGTH_MIN 100 //分针的长度 #define LENGTH_SEC 120 //秒针的长度 #define SCALE_HOUR 6 //时针的长度比例 #define SCALE_MIN 10 //分针的长度比例 #define SCALE_SEC 6 //秒针的长度比例 #define DEGREE_HOUR 30 //每小时旋转的角度 #define DEGREE_MIN 6 //每分钟旋转的角度 #define DEGREE_SEC 6 //每秒钟旋转的角度 #define COLOR_HOUR RGB(218,37,29) //时针的颜色 #define COLOR_MIN RGB(255,255,255) //分针的颜色 #define COLOR_SEC RGB(255,245,0) //秒针的颜色 #define COLOR_DOT RGB(0,0,0) //圆心的颜色 #define WINDOW_WIDTH 800 //窗口的宽度 #define WINDOW_HEIGHT 480 //窗口的高度 #define TIMER_TIME_CHECK 1 / // CClockDlg dialog CClockDlg::CClockDlg(CWnd* pParent /*=NULL*/) : CDialog(CClockDlg::IDD, pParent) { //{{AFX_DATA_INIT(CClockDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CClockDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CClockDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CClockDlg, CDialog) //{{AFX_MSG_MAP(CClockDlg) ON_WM_PAINT() ON_WM_TIMER() ON_WM_DESTROY() ON_WM_ERASEBKGND() ON_WM_LBUTTONDOWN() //}}AFX_MSG_MAP END_MESSAGE_MAP() / // CClockDlg message handlers BOOL CClockDlg::OnInitDialog() { CDialog::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon CenterWindow(GetDesktopWindow()); // center to the hpc screen // TODO: Add extra initialization here MoveWindow(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); m_bmpDial.LoadBitmap(IDB_BMP_DIAL); SetTimer(TIMER_TIME_CHECK, 1000, NULL); return TRUE; // return TRUE unless you set the focus to a control } // // 秒针的绘画函数 // CDC* pDC:内存设备环境 // int nLength:针的长度 // int nScale:针的长度比例 // int nDegrees:针的角度 // COLORREF clrColor:针的颜色 // void DrawSecondHand (CDC* pDC, int nLength, int nScale, int nDegrees, COLORREF clrColor) { CPoint point[2]; double nRadians = (nDegrees-90)*(PI/180); point[0].x = (int) (nLength * cos (nRadians)) + DOT_X; point[0].y = (int) (nLength * sin (nRadians)) + DOT_Y; point[1].x = -(int) (nLength * cos (nRadians) / nScale) + DOT_X; point[1].y = -(int) (nLength * sin (nRadians) / nScale) + DOT_Y; CPen pen (PS_SOLID, 5, clrColor); CPen* pOldPen = pDC->SelectObject (&pen); pDC->MoveTo (point[0]); pDC->LineTo (point[1]); pDC->SelectObject (pOldPen); } // // 时针、分针的绘画函数 // CDC* pDC:内存设备环境 // int nLength:针的长度 // int nScale:针的长度比例 // int nDegrees:针的角度 // COLORREF clrColor:针的颜色 // void DrawHand (CDC* pDC, int nLength, int nScale, int nDegrees, COLORREF clrColor) { CPoint point[4]; double nRadians = (nDegrees-90)*(PI/180); point[0].x = (int) (nLength * cos (nRadians)) + DOT_X; point[0].y = (int) (nLength * sin (nRadians)) + DOT_Y; point[2].x = -(int) (nLength * cos (nRadians) / nScale) + DOT_X; point[2].y = -(int) (nLength * sin (nRadians) / nScale) + DOT_Y; point[1].x = -(int) (nLength * cos (nDegrees*(PI/180)) / nScale) + DOT_X; point[1].y = -(int) (nLength * sin (nDegrees*(PI/180)) / nScale) + DOT_Y; point[3].x = -(int) (nLength * cos ((nDegrees-180)*(PI/180)) / nScale) + DOT_X; point[3].y = -(int) (nLength * sin ((nDegrees-180)*(PI/180)) / nScale) + DOT_Y; CPen pen (PS_SOLID, 0, clrColor); CPen* pOldPen = pDC->SelectObject(&pen); CBrush brush(clrColor); CBrush *pOldBrush = pDC->SelectObject(&brush); pDC->Polygon(point, 4); pDC->SelectObject(pOldPen); pDC->SelectObject(pOldBrush); } void CClockDlg::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here CDC MemDC; MemDC.CreateCompatibleDC(&dc); CBitmap MemBmp; MemBmp.CreateCompatibleBitmap( &dc, WINDOW_WIDTH, WINDOW_HEIGHT ); CBitmap *pOldBmp = MemDC.SelectObject( &MemBmp ); //绘画底图 PaintBkgnd(&MemDC); SYSTEMTIME LocalTime; GetLocalTime(&LocalTime); //绘画时针 DrawHand (&MemDC, LENGTH_HOUR, SCALE_HOUR, (LocalTime.wHour * DEGREE_HOUR) + (LocalTime.wMinute / 2), COLOR_HOUR); //绘画分针 DrawHand (&MemDC, LENGTH_MIN, SCALE_MIN, LocalTime.wMinute * DEGREE_MIN, COLOR_MIN); //绘画秒针 DrawSecondHand (&MemDC, LENGTH_SEC, SCALE_SEC, LocalTime.wSecond * DEGREE_SEC, COLOR_SEC); //绘画圆心点 CPen pen (PS_SOLID, 0, COLOR_DOT); CPen* pOldPen = MemDC.SelectObject(&pen); CBrush brush(COLOR_DOT); CBrush *pOldBrush = MemDC.SelectObject(&brush); MemDC.Ellipse(DOT_X-5, DOT_Y-5, DOT_X+5, DOT_Y+5); MemDC.SelectObject(pOldPen); MemDC.SelectObject(pOldBrush); dc.BitBlt(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, &MemDC, 0, 0, SRCCOPY); MemDC.SelectObject(pOldBmp); MemBmp.DeleteObject(); MemDC.DeleteDC(); // Do not call CDialog::OnPaint() for painting messages } void CClockDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default if (nIDEvent == TIMER_TIME_CHECK) { Invalidate(TRUE); UpdateWindow(); } CDialog::OnTimer(nIDEvent); } void CClockDlg::OnDestroy() { CDialog::OnDestroy(); // TODO: Add your message handler code here KillTimer(TIMER_TIME_CHECK); } BOOL CClockDlg::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default // return CDialog::OnEraseBkgnd(pDC); return FALSE; } void CClockDlg::PaintBkgnd(CDC *pDC) { CDC BkDC; BkDC.CreateCompatibleDC(pDC); CBitmap *pOldBmp = BkDC.SelectObject( &m_bmpDial ); pDC->BitBlt(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, &BkDC, 0, 0, SRCCOPY); BkDC.SelectObject(pOldBmp); BkDC.DeleteDC(); } void CClockDlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default PostMessage(WM_CLOSE, NULL, NULL); CDialog::OnLButtonDown(nFlags, point); }