QQ登录

只需一步,快速开始

上位机MFC数字时针实例

[ 复制链接 ]
效果演示

上位机MFC数字时针实例

上位机MFC数字时针实例

当前程序从CStatic派生CXJWDigitClock类,用于实现数字时钟。效果如上图。
例程中使用到的两文件源代码可以在下面复制使用。

实现过程:
1.新建立对话框工程,如上图界面,添加两编辑框和一按钮。
2.将例程两文件EDCLOCK.CPP,EDCLOCK.H复制到自己工程目录导入到项目中使用。
这样操作后项目中会多出一个集成类CXJWDigitClock。
两文件的源代码可以在后面复制使用。

3.下面就是对这个类的使用。
在主对话框类中包含头文件,并添加类的实例。
例程中以三种方式创建类实例,
动态创建,数据交互函数,子类化函数三种方式。
可以选择自己熟悉的方式使用集成类。
  1. #include "EDClock.h"
  2.         CXJWDigitClock        m_clock2;
  3.         CXJWDigitClock        m_clock3;
  4.         //{{AFX_DATA(CCTestDlg)
  5.         enum { IDD = IDD_CTEST_DIALOG };
  6.         CXJWDigitClock        m_clock1;
  7. void CCTestDlg::DoDataExchange(CDataExchange* pDX)
  8. {
  9.         CDialog::DoDataExchange(pDX);
  10.         //{{AFX_DATA_MAP(CCTestDlg)
  11.                 // NOTE: the ClassWizard will add DDX and DDV calls here
  12.         DDX_Control(pDX, IDC_STATIC1, m_clock1);
  13.         //}}AFX_DATA_MAP
  14. }
复制代码
初始化变量
  1. m_clock1.SetStyle(CXJWDigitClock::XDC_SECOND);
  2.         m_clock2.SubclassDlgItem(IDC_STATIC2, this);
  3.         m_clock2.SetColor(RGB(0, 255, 0));
  4.         m_clock3.Create(NULL, SS_SUNKEN | WS_CHILD | WS_VISIBLE, CRect(5, 5, 170, 35), this, 1001);
  5.         m_clock3.SetStyle(CXJWDigitClock::XDC_SECOND);
  6.         m_clock3.SetAlarm();
复制代码
按钮的点击函数

  1. void CCTestDlg::OnButton1()
  2. {
  3.         m_clock1.SetStyle(CXJWDigitClock::XDC_NOSECOND);
  4.         m_clock2.SetColor(RGB(0, 128, 128));
  5.         m_clock3.SetAlarm(FALSE);
  6. }
复制代码
4.这样就可以编译了,编译会提示资源ID未找到,这些资源为时钟用的位置。
可以自己绘制,或直接使用例程资源。
下面是两文件的源代码:可直接复制使用,或直接下载例程使用:
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:CTest.rar 
文件大小:36.78 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我



  1. #ifndef __MFC_EXT_DIGITCLOCK_H__
  2. #define __MFC_EXT_DIGITCLOCK_H__
  3. // EDClock.h : header file
  4. //

  5. /////////////////////////////////////////////////////////////////////////////
  6. // CXJWDigitClock window

  7. class CXJWDigitClock : public CStatic
  8. {
  9. // Construction
  10. public:
  11.         CXJWDigitClock();
  12.         virtual ~CXJWDigitClock();

  13. // Attributes
  14. public:
  15.         enum CClockStyle { XDC_SECOND, XDC_NOSECOND };
  16.         static COLORREF origin;

  17. // Operations
  18. public:
  19.         CClockStyle GetStyle() const { return m_style;}
  20.         CClockStyle SetStyle(CClockStyle style);
  21.         COLORREF GetColor() const { return m_color;}
  22.         COLORREF SetColor(COLORREF color);
  23.         BOOL GetAlarm() const { return m_bAlarm;}
  24.         BOOL SetAlarm(BOOL bAlarm = TRUE);

  25. // Overrides
  26.         // ClassWizard generated virtual function overrides
  27.         //{{AFX_VIRTUAL(CXJWDigitClock)
  28.         protected:
  29.         virtual void PreSubclassWindow();
  30.         //}}AFX_VIRTUAL

  31. // Implementation
  32. public:

  33.         // Generated message map functions
  34. protected:
  35.         //{{AFX_MSG(CXJWDigitClock)
  36.         afx_msg void OnTimer(UINT nIDEvent);
  37.         afx_msg void OnDestroy();
  38.         afx_msg BOOL OnEraseBkgnd(CDC* pDC);
  39.         afx_msg void OnPaint();
  40.         //}}AFX_MSG
  41. private:

  42.         BOOL                m_bAlarm;
  43.         COLORREF    m_color;

  44.         UINT                m_w;
  45.         UINT                m_h;
  46.         CClockStyle m_style;
  47.         BITMAP                m_bm;
  48.         UINT                m_nCount;
  49.         HBITMAP                m_hBitmap[12];
  50.         UINT                m_nTimer;

  51.         void                Output(UINT digit, UINT pos);

  52.         DECLARE_MESSAGE_MAP()
  53. };

  54. /////////////////////////////////////////////////////////////////////////////

  55. //{{AFX_INSERT_LOCATION}}
  56. // Microsoft Developer Studio will insert additional declarations immediately before the previous line.

  57. #endif // __MFC_EXT_DIGITCLOCK_H__
复制代码
  1. // A digital clock control, :-)
  2. //

  3. //
  4. // Usage: See the header, just simple
  5. // Please Note: Make sure ADD the 12 bitmaps to your project, and
  6. // sort the ID to correct order. I used IDB_BITMAP1 to IDB_BITMAP12
  7. // side by side. See following:
  8. //
  9. // Digit:     ID                                VALUE
  10. //   0        IDB_BITMAP1                 100
  11. //   1        IDB_BITMAP2                 101        
  12. //   2        IDB_BITMAP3                 102        
  13. //   3        IDB_BITMAP4                 103        
  14. //   4        IDB_BITMAP5                 104
  15. //   5        IDB_BITMAP6                 105        
  16. //   6        IDB_BITMAP7                 106        
  17. //   7        IDB_BITMAP8                 107
  18. //   8        IDB_BITMAP9                 108
  19. //   9        IDB_BITMAP10                 109        
  20. //   :        IDB_BITMAP11                 110
  21. //            IDB_BITMAP12                 111        
  22. //

  23. // There are three properties.
  24. // face color <-----> SetColor();
  25. // style <-----> SetStyle();
  26. // alarm mode <----> SetAlarm();


  27. #include "stdafx.h"

  28. #include "resource.h"
  29. #include "EDClock.h"

  30. #ifdef _DEBUG
  31. #define new DEBUG_NEW
  32. #undef THIS_FILE
  33. static char THIS_FILE[] = __FILE__;
  34. #endif

  35. // The resource bitmap face color
  36. //static COLORREF origin;
  37. COLORREF CXJWDigitClock::origin = RGB(255, 0, 0);

  38. /////////////////////////////////////////////////////////////////////////////
  39. // CXJWDigitClock

  40. CXJWDigitClock::CXJWDigitClock()
  41. {
  42.         m_bAlarm = FALSE;
  43.         m_style = XDC_NOSECOND;
  44.         m_color = origin;
  45.         for(int i = 0; i< 12; i++) {
  46.                 HBITMAP temp = (HBITMAP)::CreateMappedBitmap(AfxGetApp()->m_hInstance, i+IDB_BITMAP1, 0, NULL, 0);
  47.                 m_hBitmap[i] = (HBITMAP)::CopyImage( temp, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG | LR_COPYDELETEORG);
  48.         }
  49. }

  50. CXJWDigitClock::~CXJWDigitClock()
  51. {
  52.         for(int i = 0; i< 12; i++) {
  53.                 if(m_hBitmap[i])
  54.                         ::DeleteObject(m_hBitmap[i]);
  55.         }
  56. }


  57. BEGIN_MESSAGE_MAP(CXJWDigitClock, CStatic)
  58.         //{{AFX_MSG_MAP(CXJWDigitClock)
  59.         ON_WM_TIMER()
  60.         ON_WM_DESTROY()
  61.         ON_WM_ERASEBKGND()
  62.         ON_WM_PAINT()
  63.         //}}AFX_MSG_MAP
  64. END_MESSAGE_MAP()

  65. /////////////////////////////////////////////////////////////////////////////
  66. // CXJWDigitClock message handlers

  67. void CXJWDigitClock::PreSubclassWindow()
  68. {
  69.         // TODO: Add your specialized code here and/or call the base class
  70.         //
  71.         // Note: Set the Timer here Pls.
  72.         // Dont set timer in OnCreate(), you cant recieve WM_CREATE
  73.         // when control construted in Dialog template. Say: OnCreate not called.
  74.         //
  75.         m_nTimer = SetTimer(1, 1000, NULL);
  76.         ::GetObject(m_hBitmap[0], sizeof BITMAP, &m_bm);
  77.         
  78.         CStatic::PreSubclassWindow();
  79. }

  80. void CXJWDigitClock::OnDestroy()
  81. {
  82.         CStatic::OnDestroy();
  83.         
  84.         // TODO: Add your message handler code here
  85.         KillTimer(m_nTimer);        
  86. }

  87. void CXJWDigitClock::OnPaint()
  88. {
  89.         CPaintDC dc(this); // device context for painting
  90.         
  91.         // TODO: Add your message handler code here
  92.         
  93.         // Do not call CStatic::OnPaint() for painting messages
  94. }

  95. BOOL CXJWDigitClock::OnEraseBkgnd(CDC* pDC)
  96. {
  97.         // TODO: Add your message handler code here and/or call default
  98.         CBrush brush;
  99.         brush.CreateSolidBrush( ::GetSysColor(COLOR_WINDOWTEXT) );
  100.         CBrush* pOldBrush = pDC->SelectObject(&brush);

  101.         CRect rectClient;
  102.         GetClientRect(&rectClient);
  103.         pDC->PatBlt(0, 0, rectClient.Width(), rectClient.Height(), PATCOPY);
  104.         pDC->SelectObject(pOldBrush);
  105.         
  106.         return CStatic::OnEraseBkgnd(pDC);
  107. }

  108. void CXJWDigitClock::OnTimer(UINT nIDEvent)
  109. {
  110.         // TODO: Add your message handler code here and/or call default
  111.         if(nIDEvent == m_nTimer) {
  112.                 m_nCount++;
  113.                 CRect rectClient;
  114.                 GetClientRect(&rectClient);
  115.                 m_h = rectClient.Height();
  116.                 if(m_style == XDC_SECOND) {
  117.                         m_w = rectClient.Width()/8;
  118.                 } else {
  119.                         m_w = rectClient.Width()/5;
  120.                 }

  121.                 CTime time = CTime::GetCurrentTime();
  122.                 int nh1 = time.GetHour()/10;
  123.                 if(nh1)
  124.                         Output(nh1, 0);
  125.                 else
  126.                         Output(11, 0);
  127.                 int nh2 = time.GetHour()%10;
  128.                 Output(nh2, 1);
  129.                 int nm1 = time.GetMinute()/10;
  130.                 Output(nm1, 3);
  131.                 int nm2 = time.GetMinute()%10;
  132.                 Output(nm2, 4);

  133.                 switch(m_style) {
  134.                         case XDC_SECOND:
  135.                         {
  136.                                 int ns1 = time.GetSecond()/10;
  137.                                    Output(ns1, 6);
  138.                                 int s2 = time.GetSecond()%10;
  139.                                 Output(s2, 7);
  140.                                 Output(10, 2); // double points
  141.                                 Output(10, 5); // double points
  142.                         }
  143.                         break;
  144.                         case XDC_NOSECOND:
  145.                         default:
  146.                                 if(m_bAlarm)
  147.                                         Output(10, 2);
  148.                                 else
  149.                                         if(m_nCount%2)
  150.                                                 Output(10, 2); // double points
  151.                                         else
  152.                                                 Output(11, 2); //
  153.                                 break;
  154.                 }
  155.                 if(m_bAlarm)
  156.                         MessageBeep(-1);
  157.         }
  158.         CStatic::OnTimer(nIDEvent);
  159. }

  160. void CXJWDigitClock::Output(UINT digit, UINT pos)
  161. {
  162.     // draw the bitmap
  163.         CClientDC dc(this);
  164.         CDC dcMem;
  165.         dcMem.CreateCompatibleDC(&dc);
  166.         //
  167.         // Alarm mode
  168.         //
  169.         if(m_bAlarm && m_nCount%2)
  170.                 digit = 11;
  171.         CBitmap* pBitmap = CBitmap::FromHandle( m_hBitmap[digit] );
  172.         CBitmap* pOldBitmap = dcMem.SelectObject(pBitmap);
  173.     dc.StretchBlt(m_w*pos, 0, m_w, m_h,
  174.                         &dcMem, 0, 0, m_bm.bmWidth, m_bm.bmHeight, SRCCOPY);
  175.          dcMem.SelectObject(pOldBitmap);
  176.         dcMem.DeleteDC();
  177. }


  178. CXJWDigitClock::CClockStyle CXJWDigitClock::SetStyle(CClockStyle style)
  179. {
  180.         CClockStyle temp = m_style;
  181.         m_style = style;
  182. //        if(::IsWindow(m_hWnd))
  183. //                Invalidate();
  184.         return temp;
  185. }

  186. COLORREF CXJWDigitClock::SetColor(COLORREF color)
  187. {
  188.         if(m_color == color)
  189.                 return color;
  190.         COLORREF temp = m_color;
  191.         m_color = color;
  192.         for(int i = 0; i< 12; i++) {
  193.                 if(m_hBitmap[i])
  194.                         ::DeleteObject(m_hBitmap[i]);
  195.                 COLORMAP        mapColor;
  196.                 mapColor.from = origin;
  197.                 mapColor.to  = color;
  198.                 HBITMAP temp = (HBITMAP)::CreateMappedBitmap(AfxGetApp()->m_hInstance, i+IDB_BITMAP1, 0, &mapColor, 1);
  199.                 m_hBitmap[i] = (HBITMAP)::CopyImage( temp, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG | LR_COPYDELETEORG);
  200.         }
  201.         return temp;
  202. }

  203. BOOL CXJWDigitClock::SetAlarm(BOOL bAlarm /*= TRUE*/)
  204. {
  205.         BOOL temp = m_bAlarm;
  206.         m_bAlarm = bAlarm;
  207.         return temp;
  208. }


复制代码






回复

使用道具 举报

快速回复 返回列表 客服中心 搜索