2 jujiawu1024 jujiawu1024 于 2016.03.28 15:41 提问

MFC对于static控件在界面上的绘图操作,绘图的擦除操作

在MFC中画波纹图,需要先事先擦除旧的数据,具体的函数调用是什么?

3个回答

caozhy
caozhy   Ds   Rxr 2016.04.06 03:42
已采纳
 在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,便可以完成这项工作. 
lx624909677
lx624909677   Ds   Rxr 2016.03.28 16:53
    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];
        }

    }

上面的代码可以拿去参考,大体思路就是先存储要画的点,之后除了第一次画,之后每次都先按照之前的坐标画一次,只不过颜色是背景色然后再画新的线条

lx624909677
lx624909677   Ds   Rxr 2016.03.28 16:52
::SelectObject(dc, wPen);
            ::MoveToEx(dc,i+BEGIN_W,m_TMPY[i], NULL);
            ::LineTo(dc,i+BEGIN_W,m_TMPY[i+1]);
            其中wPen是一个和之前波纹像素一样,颜色和背景色一样的HPEN对象
jujiawu1024
jujiawu1024 这是什么?
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!