在MFC中画波纹图,需要先事先擦除旧的数据,具体的函数调用是什么?
在Static控件上画图的方法..
声明两个变量在view或Dialog的头文件中.
CWnd* pWnd; //表示控件窗口的变量
CDC* pControlDC; //表示控件窗口的设备描述表.DC
在OnInitialUpdate()函数中进行赋值(View)
pWnd=GetDlgItem(IDC_STATICRCT);
pControlDC=pWnd->GetDC();
重载OnPaint()函数.
在函数中
void CMy****View::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
pWnd=GetDlgItem(IDC_PAINT_STATIC);
pControlDC=pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
CRect rct;
pWnd->GetClientRect(rct);
CPen RectPen(PS_DASH,1,0x0000FF);
pControlDC->SelectObject(&RectPen);
//-----------------------------------------------
//-- Draw
//-----------------------------------------------
pControlDC->Rectangle(rct.left+10,rct.top+10,rct.right-10,rct.bottom-10);
pControlDC->MoveTo(0,0);
pControlDC->LineTo(0,100);
pControlDC->LineTo(100,100);
pControlDC->LineTo(100,0);
pControlDC->LineTo(0,0);
RectPen.DeleteObject();
pWnd->ReleaseDC(pControlDC);
}
这里有一个技巧应该注意,即在控件窗口内绘图的同时,还要防止Windows对它重复绘制.依次调用Invalidate/UpdateWindow,便可以完成这项工作.
::SelectObject(dc, wPen);
::MoveToEx(dc,i+BEGIN_W,m_TMPY[i], NULL);
::LineTo(dc,i+BEGIN_W,m_TMPY[i+1]);
其中wPen是一个和之前波纹像素一样,颜色和背景色一样的HPEN对象
CClientDC dc(this);
HPEN hPen = CreatePen(PS_SOLID, 2, RGB(0,0,255));
HPEN wPen = CreatePen(PS_SOLID,2,RGB(255,255,255));
if(nIDEvent == 0)
{
// 如果后面还有数据,那么把真个数据向左移动
if(m_nCount<data1.size()-1)
{
for(int i = 0; i<MAX_X_NUM-ADD_NUM;i++)
{
m_Y[i] = m_Y[i+ADD_NUM];
}
for(int i = 0; i<ADD_NUM; i++)
{
if(m_nCount>data1.size()-1)
{
KillTimer(0);
break;
}
m_Y[MAX_X_NUM-(ADD_NUM-i)] = MAX_HEIGTH*5+BEGIN_H-data1[m_nCount]/hPix; //新的数据添加了进来
m_nCount++;
}
}
int oldRop;
// 只要不是第一次绘制,就先吧上次的绘图清除
if(!bIsFirst)
{
for(int i = 0; i<MAX_X_NUM-1;i++)
{
::SelectObject(dc, wPen);
::MoveToEx(dc,i+BEGIN_W,m_TMPY[i], NULL);
::LineTo(dc,i+BEGIN_W,m_TMPY[i+1]);
}
}
// 绘制最新的曲线
for(int i = 0; i<MAX_X_NUM-1;i++)
{
bIsFirst = FALSE;
::SelectObject(dc, hPen);
::MoveToEx(dc,i+BEGIN_W,m_Y[i], NULL);
::LineTo(dc,i+BEGIN_W,m_Y[i+1]);
}
//画完之后记录本次的坐标
for(int i = 0; i<MAX_X_NUM;i++)
{
m_TMPY[i] = m_Y[i];
}
}
上面的代码可以拿去参考,大体思路就是先存储要画的点,之后除了第一次画,之后每次都先按照之前的坐标画一次,只不过颜色是背景色然后再画新的线条