mfc 卡死_MFC 程序一定时间内自动卡死变白后重启,该如何解决

MFC 程序一定时间内自动卡死变白后重启

本帖最后由 VisualEleven 于 2014-05-09 18:28:31 编辑

我做的是一个光谱仪的显示界面,为了防止界面闪烁,使用了双缓存技术。因为每隔固定时间(例如10ms要求数据刷新),所以主要程序是在定时器中完成的,主要就是使用了位图CBitmap,创建与显示的编辑框相兼容的Dc,并在位图中绘图,绘图完成后将位图显示在编辑框中。定时器的函数如下;

void CMy427eveningDlg::OnTimer(UINT_PTR nIDEvent)

{

//******************************************************************************//

if(true==m_Isthefirsttime)//第一次执行计数器的时候将data中添加MAXPOINT个数,防止后面访问data时溢出

{

for(int i=0;i

{

data.push_back(f_cos(m_Count+data.size()));  //f_cos()是要绘制的函数曲线

}

m_Isthefirsttime=false;     //data是一个deque的数组,存储将被显示的数据点坐标y轴

}

if (true==m_stoportiming)

{

if (m_Xnunbers==m_NewXnum)//默认m_NewXnum等于100

{

data.pop_front();

++m_Count;

data.push_back(f_cos(m_Count+data.size()));

}

else if(m_NewXnum > m_Xnunbers)

{

for (int i=0;i

data.push_back(f_cos(m_Count+data.size()));

}

else if (m_NewXnum

{

for (int i=0;i

{    data.pop_front();

++m_Count;

}

}

}

m_Xnunbers=m_NewXnum;

//********************************************************************************//以上程序段主要实现显示界面的横轴分辨率可调

//**********************************************************************************m_NewXnum是整个界面这一次会绘制的点数///**********************************************************************************m_Xnunbers是整个界面上一次会绘制的点数

if(1== nIDEvent )   定时器的标志为1

{

CRect rc;

CClientDC *pDC=(CClientDC *)GetDlgItem(IDC_drawplace)->GetDC(); //获取绘图框的设备上下文dc

GetDlgItem(IDC_drawplace)-> GetClientRect(rc); //获取绘图框的大小

CRect m_rec(rc);

双缓冲技术中的两个重要变量

CDC pMemDC;   //在内存画图的DC和存在内存中的位图

pMemDC.CreateCompatibleDC(pDC);

CBitmap membitmap;

membitmap.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());  //将此Dc和内存中的位图相关联

pMemDC.SelectObject(&membitmap);

//  CBrush *pbrush=pDC->GetCurrentBrush(); //将位图的背景设为白色

CBrush pbrush(RGB(0,100,100));

pMemDC.FillRect(rc,&pbrush);  //改变位图背景颜色,如果不变的话显示的背景将为黑色,极其难看

************************************************

rc.DeflateRect(rc.Width()/20,rc.Height()/20); //矩形内缩函数

int gridXnums=20,gridYnums=5;

int dx=rc.Width()/gridXnums;

int dy=rc.Height()/gridYnums;

CPen gridPen(0,0,RGB(0,0,0));

//绘制网格线

//所有一切跟绘图有关的句柄,在内存位图中实施进行的都应该是用pMemDC来完成,而不是使用编辑框的pDC

CRect gridRect(rc.left,rc.top,rc.left+dx*gridXnums,rc.top+dy*gridYnums);

CPen *oldPen=pDC->SelectObject(&gridPen);

for(int i=0;i<=gridXnums;i++) //画网格线条X轴

{

pMemDC.MoveTo(gridRect.left+i*dx,gridRect.bottom);

pMemDC.LineTo(gridRect.left+i*dx,gridRect.top);

}

for(int i=0;i<=gridYnums;i++)  //画网格线条Y轴

{

pMemDC.MoveTo(gridRect.left,gridRect.top+i*dy);

pMemDC.LineTo(gridRect.right,gridRect.top+i*dy);

}

pMemDC.SelectObject(oldPen);

gridPen.Detach();

gridPen.CreatePen(PS_SOLID,3,RGB(255,255,255));

pMemDC.SelectObject(&gridPen);

//绘制坐标轴和刻度线

// 绘制坐标轴

pMemDC.MoveTo(gridRect.left,gridRect.top-20);

// 垂直轴

pMemDC.LineTo(gridRect.left,gridRect.bottom);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值