工控编程吧
标题:
60上位机VC MFC实现电子定时器功能
[打印本页]
作者:
qq263946146
时间:
2015-12-5 22:29
标题:
60上位机VC MFC实现电子定时器功能
(, 下载次数: 2)
上传
点击文件名下载附件
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,
(, 下载次数: 0)
上传
点击文件名下载附件
&tmpDC, 10*m_nNumberWidth, 0, SRCCOPY);
}
//><
int nLen = m_sText.GetLength();//获取字节数,在这是数字的位数,当前我们仅用了m_nNumberLen位
if (nLen>0 && nLen<m_nNumberLen)//再绘制出m_csText的数字内容
{
for (int n=0; n<nLen; n++)
{
char ch = m_sText[nLen-n-1];
int nCh = atoi(&ch);
MemDC.BitBlt((m_nNumberLen-n-1)*m_nNumberWidth, 0, m_nNumberWidth,
nbmpHeight, &tmpDC, (nCh)*m_nNumberWidth, 0, SRCCOPY);
}
}
//><
SetRedraw();//ALLOW DRAW;
dc.BitBlt(clientRC.left, clientRC.top, clientRC.Width(), clientRC.Height(),
&MemDC, clientRC.left, clientRC.top, SRCCOPY);
//CLEAR
MemDC.DeleteDC();
tmpDC.DeleteDC();
MemBitmap.DeleteObject();
dc.SelectObject(OldBitmap);
}
复制代码
6.最后是在主对话框中使用这个类
如我们当前工程m_Counter.CreateCounter(this,IDB_NUMBERBMP,IDC_COUNTER);//initializecounter; m_Counter.IncreaseNum();便可;
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/ba1a351b00fa84ba13a8a7af3e896c40/0/0/w_19rt631765.swf-albumId=4982915809-tvId=4982915809-isPurchase=0-cnId=12[/iqiyi]
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4