jujiawu1024
jujiawu1024
采纳率97.3%
2016-03-28 07:41 阅读 1.8k
已采纳

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

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

3条回答 默认 最新

  • 已采纳
    caozhy 从今以后生命中的每一秒都属于我爱的人 2016-04-05 19: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,便可以完成这项工作. 
    
    点赞 1 评论 复制链接分享
  • lx624909677 lx624909677 2016-03-28 08:52
    ::SelectObject(dc, wPen);
                ::MoveToEx(dc,i+BEGIN_W,m_TMPY[i], NULL);
                ::LineTo(dc,i+BEGIN_W,m_TMPY[i+1]);
                其中wPen是一个和之前波纹像素一样,颜色和背景色一样的HPEN对象
    
    点赞 评论 复制链接分享
  • lx624909677 lx624909677 2016-03-28 08: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];
            }
    
        }
    
    

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

    点赞 评论 复制链接分享

相关推荐