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的操作 - <div>void CCounter::SetCurrentNum(int nNum)</div>{
- m_sText.Format("%i", nNum);
- RedrawWindow();
- }
- int CCounter::GetCurrentNum()
- {
- return atoi(m_sText.GetBuffer(0));
- }
- void CCounter::SetCurrentNum(int nNum)
- {
- m_sText.Format("%i", nNum);
- RedrawWindow();
- }
复制代码- void CCounter::IncreaseNum()
- {
- int nNumber = GetCurrentNum();
- nNumber++;
- SetCurrentNum(nNumber);
- }
- <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)
- {
- SubclassDlgItem(nCtlID, pParent);
- CRect winRC;
- GetWindowRect(winRC);
- ScreenToClient(winRC);
- MapWindowPoints(pParent,winRC);
- winRC.right = winRC.left+m_nNumberLen*m_nNumberWidth;
- winRC.bottom = winRC.top+m_nNumberHeight;
- MoveWindow(winRC);
- //><
- m_Bitmap.LoadBitmap(nSourceID);//load bitmap
- }
- <div style="text-align: center;"><span style="line-height: 1.5;"><font size="4">5.最后是计时器的绘制实现,在Onpaint()函数中完成</font></span></div>void CCounter::OnPaint()
- {
- CPaintDC dc(this);
- SetRedraw(FALSE); //PAUSE redraw
- CRect clientRC;
- GetClientRect(clientRC);
- CDC MemDC;
- CBitmap MemBitmap;
- CBitmap *OldBitmap;
- MemDC.CreateCompatibleDC(&dc);
- MemBitmap.CreateCompatibleBitmap(&dc,clientRC.Width(),clientRC.Height());
- OldBitmap = MemDC.SelectObject(&MemBitmap);
- //><
- CDC tmpDC;
- tmpDC.CreateCompatibleDC(&dc);
- tmpDC.SelectObject(&m_Bitmap);
- //><
复制代码- BITMAP bInfo;
- m_Bitmap.GetBitmap(&bInfo);
- int nbmpHeight = bInfo.bmHeight;
- for (int i=0; i<m_nNumberLen; i++)//先用灰色数字绘制0,1,2,3,4,5,6,7
- {
- MemDC.BitBlt((i)*m_nNumberWidth, 0, m_nNumberWidth, nbmpHeight,
60.上位机VC MFC实现电子定时器功能.rar
(158.64 KB, 下载次数: 0, 售价: 10 金币)
6.最后是在主对话框中使用这个类 如我们当前工程m_Counter.CreateCounter(this,IDB_NUMBERBMP,IDC_COUNTER);//initializecounter; m_Counter.IncreaseNum();便可;
我们来演示下功能实现的整个过程
|