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 这是什么?
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
MFC CStatic 透明重绘 使用双缓冲
在工作中经常需要使用CStatic  在该控件属性中设置透明 是无效的 需通过代码实现其透明 方法1  直接在父窗体的OnCtlColor中更改 HBRUSH CDlgStockPrice::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCt
MFC里在对话框下的Static text控件里画网格
1.新建一个MFC工程,在资源视图->Dialog下新建一个对话框ID为IDC_DIALOG1,在工具箱里为该对话框添加Static text ,并设置ID为IDC_TEXT,在类向导里添加一个类ControlDlg类继承于CDIALOGEX; 2.项目->添加类 添加一个Graph类继承于CStatic,并在里面实现画网格代码如下: #include "stdafx.h" #inc
VC中在对话框上的static控件中绘图
在MFC对话框上的static控件中绘制图形,发现的一些问题与解决方法
MFC实现绘图功能,绘图不会被擦除
MFC实现基本的绘图功能,点,线,矩形,绘出的图线条不会随屏幕改变而被擦除
MFC界面美化例程
本例程封装static控件,在美化mfc界面上做了优化,同时对于想美化mfc粗糙界面的朋友可以提供很好的思路
MFC最好不要在子线程中操控界面上的控件
今天遇到一个bug,烦了我大半天。最后在QQ群中有人给我指出来了。感觉白费了很多时间。 我在一个窗口的某条信息处理函数中new了一个进度条控件对象。然后创建一个子线程,然后在子线程中delete这个控件对象。没想到每到这个delete的地方,程序就会崩溃。 提示:Debug Assertion Failed! xxx.exe FIle:xxx.cpp LINE:1019   For i
mfc静态文本控件里实现画图
有时候,我们需要自绘一些图形,这时候就可以使用静态文本控件来实现绘图功能。 具体实现效果如上, 要实现以上功能,首先我们需要获取到控件窗口的句柄,并且设置绘制的范围 然后在实现画X,Y轴,刻度标尺等功能。 具体代码如下 void CMFCApplication5Dlg::OnBnClickedButton1() { // TODO:  在此添加控件通知
VC 在CStatic控件上绘图
方法一:使用CStatic的成员函数SetBitmap(); void fnDrawOnStatic1() { CStatic * pStatic = (CStatic *)GetDlgItem(IDC_STATIC_TEST); HBITMAP hBitmap; hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandl
CStatic派生类及MFC控件绘图类
自己找的几个例子,免费的,希望对绘图的亲们有帮助!
MFC 扩展CStatic类绘图-双缓冲区避免闪屏
[WM]用双缓冲在CStatic上面画Native编程,貌似除了画没有其他好的选择.其实在哪里画不是画,而我选择了Static控件,我不觉得在其他控件上面画和Static控件上面有什么本质区别.(我只是觉得Static控件够简单,而且还能达到我的目标) OK.先来说画.自己画的画,唯一需要注意的就是闪屏的问题,而双缓冲就是用来防止闪屏的,怎么来做呢? 1. 阻止画背景.背景我需要自己来画 2.