QQ登录

只需一步,快速开始

60上位机VC MFC实现电子定时器功能

[ 复制链接 ]

60上位机VC MFC实现电子定时器功能

60上位机VC MFC实现电子定时器功能

60上位机VC MFC实现电子定时器功能


功能展示

电子计时器在秒表,计算器等带七段码的电子设备上可以看到类似效果,我们当前例程通过一个CDC的BitBlt()函数来实现一个电子计时器,效果如图
要点提示
电子计时器,我们当前是通过显示一幅标准的位图局部位置来实现的。
首先这副位图画有0到9十个数字及两个默认效果图片,共十二个小位图,十二个位图长宽都相等;
其次显示这一幅大图中的十二个小位图,比如显示0还是5还是9,我们可以通过CDC的BitBlt()函数来实现;
我们当前例程是通过从Cstatic派生计时器类的,在计时时,由于要不停地在静态文本控件中绘制这些小位图,为了防止出现界面闪烁,我们定义一个内存画布,先在这画布中绘制各个小位图,然后将这整副画布加载到静态文本控件中显示;


实现功能
1.新建基于对话框的应用程序
2.从静态文本类派生自己的类class CCounter : public Cstatic;添加几个变量private:
CString m_sText;//文本 int m_nNumberWidth; //数字宽度 int m_nNumberHeight; //数字高度m_nNumberLen; //数字位数 CBitmap m_Bitmap;       //background bitmap of counter;
并在构造函数中初始化 m_sText = ""; m_nNumberWidth = 26;m_nNumberHeight = 34;
m_nNumberLen = 7;

3.添加三个函数对成员变量m_sText的操作
  1. <div>void CCounter::SetCurrentNum(int nNum)</div>{
  2.         m_sText.Format("%i", nNum);
  3.         RedrawWindow();
  4. }
  5. int CCounter::GetCurrentNum()
  6. {        
  7.         return atoi(m_sText.GetBuffer(0));
  8. }
  9. void CCounter::SetCurrentNum(int nNum)
  10. {
  11.         m_sText.Format("%i", nNum);
  12.         RedrawWindow();
  13. }
复制代码
  1. void CCounter::IncreaseNum()
  2. {
  3.         int nNumber = GetCurrentNum();
  4.         nNumber++;
  5.         SetCurrentNum(nNumber);
  6. }
  7. <div style="text-align: center;"><span style="font-size: large; line-height: 1.5;">4.添加我们这个派生类的初始化函数</span></div>void CCounter::CreateCounter(CWnd *pParent,UINT nSourceID,UINT nCtlID)
  8. {
  9.         SubclassDlgItem(nCtlID, pParent);
  10.         CRect winRC;
  11.         GetWindowRect(winRC);
  12.         ScreenToClient(winRC);
  13.         MapWindowPoints(pParent,winRC);
  14.         winRC.right = winRC.left+m_nNumberLen*m_nNumberWidth;
  15.         winRC.bottom = winRC.top+m_nNumberHeight;
  16.         MoveWindow(winRC);
  17. //><
  18.         m_Bitmap.LoadBitmap(nSourceID);//load bitmap
  19. }
  20. <div style="text-align: center;"><span style="line-height: 1.5;"><font size="4">5.最后是计时器的绘制实现,在Onpaint()函数中完成</font></span></div>void CCounter::OnPaint()
  21. {
  22.         CPaintDC dc(this);
  23.         SetRedraw(FALSE); //PAUSE redraw

  24.         CRect clientRC;
  25.         GetClientRect(clientRC);
  26.         CDC MemDC;
  27.         CBitmap MemBitmap;
  28.         CBitmap *OldBitmap;
  29.         MemDC.CreateCompatibleDC(&dc);
  30.         MemBitmap.CreateCompatibleBitmap(&dc,clientRC.Width(),clientRC.Height());
  31.         OldBitmap = MemDC.SelectObject(&MemBitmap);
  32. //><        
  33.         CDC tmpDC;
  34.         tmpDC.CreateCompatibleDC(&dc);
  35.         tmpDC.SelectObject(&m_Bitmap);
  36. //><
复制代码
  1. BITMAP bInfo;
  2.         m_Bitmap.GetBitmap(&bInfo);
  3.         int nbmpHeight = bInfo.bmHeight;
  4.         for (int i=0; i<m_nNumberLen; i++)//先用灰色数字绘制0,1,2,3,4,5,6,7
  5.         {
  6.                 MemDC.BitBlt((i)*m_nNumberWidth, 0, m_nNumberWidth, nbmpHeight, 60.上位机VC MFC实现电子定时器功能.rar (158.64 KB, 下载次数: 0, 售价: 10 金币)
  7.                         &tmpDC, 10*m_nNumberWidth, 0, SRCCOPY);
  8.         }
  9. //><
  10.     int nLen = m_sText.GetLength();//获取字节数,在这是数字的位数,当前我们仅用了m_nNumberLen位
  11.         if (nLen>0 && nLen<m_nNumberLen)//再绘制出m_csText的数字内容
  12.         {
  13.                 for (int n=0; n<nLen; n++)
  14.                 {
  15.                         char ch = m_sText[nLen-n-1];
  16.                         int nCh = atoi(&ch);
  17.                         MemDC.BitBlt((m_nNumberLen-n-1)*m_nNumberWidth, 0, m_nNumberWidth,
  18.                                         nbmpHeight, &tmpDC, (nCh)*m_nNumberWidth, 0, SRCCOPY);
  19.                 }
  20.         }
  21. //><
  22.         SetRedraw();//ALLOW DRAW;
  23.         dc.BitBlt(clientRC.left, clientRC.top, clientRC.Width(), clientRC.Height(),
  24.                                 &MemDC, clientRC.left, clientRC.top, SRCCOPY);
  25. //CLEAR
  26.         MemDC.DeleteDC();
  27.         tmpDC.DeleteDC();
  28.         MemBitmap.DeleteObject();
  29.         dc.SelectObject(OldBitmap);
  30. }
复制代码
6.最后是在主对话框中使用这个类
如我们当前工程m_Counter.CreateCounter(this,IDB_NUMBERBMP,IDC_COUNTER);//initializecounter; m_Counter.IncreaseNum();便可;

我们来演示下功能实现的整个过程

请点击此处下载

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

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

文件名称:60.上位机VC MFC实现电子定时器功能.rar 
文件大小:158.64 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!




回复

使用道具 举报

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