我定义了一个数组【200】,然后在OnPaint中利用该数组的数据画线,在DEBUG编译时没有问题,在Realease后中数据图形出现有几个数据变化,多次编译都在同一位置,(程序基于对话框)

解决方案 »

  1.   

    Ariesman(超然) 代码,整个程序怕不小于5000行了吧,教我怎么贴
     bluebohe(薄荷) 你把该数组的数据都正确赋值了?这个应该是赋值了的,不然怎么出来图形
      

  2.   

    头文件中
       BYTE rxdata[200];
    初始化   for(BYTE i=0; i<200; i++)
        {
            rxdata[i] = (BYTE)(i/2);
        }
    作图
    void CDljcDlg::ReDrawP(void)
    {
        CClientDC pDC(this);
        CRect rect;
        GetClientRect(&rect);
        CBrush bBrush;
        LOGBRUSH logb;
      
        lpLogPen.lopnWidth = CPoint(2,2);   //曲线
        lpLogPen.lopnColor = RGB(255, 0, 0);
        lpLogPen.lopnStyle = PS_SOLID;
        pPen.CreatePenIndirect(&lpLogPen);
        pDC.SelectObject(&pPen);
        WORD bY;
        if(rxdata[0] < 1)
            rxdata[0] = 1;
        if(rxdata[0] > 105)
            rxdata[0] = 105;
        pDC.MoveTo(3, rxdata[0]*3+36);
        for(int i=1; i<200; i++)
        {
            if(rxdata[i] < 1)
                rxdata[i] = 1;
            if(rxdata[i] > 105)
                rxdata[i] = 105;
            bY = (WORD)(rxdata[i]*3+36);
            pDC.LineTo(3+3*i, bY);
        }
        pPen.DeleteObject();
     }
    在Onpaint()中调用ReDrawP();
    rxdata在程序中有再次赋值的时候,但现在不赋值就出现如题的问题
      

  3.   

    很粗心地看了一下,
    感觉有几个地方做的不好1、
    lpLogPen.lopnWidth = CPoint(2,2);   //曲线
        lpLogPen.lopnColor = RGB(255, 0, 0);
        lpLogPen.lopnStyle = PS_SOLID;
        pPen.CreatePenIndirect(&lpLogPen);创建一个画笔不用如此麻烦2、
    pDC.SelectObject(&pPen);
    要注意保存以前的绘图环境3、
    pPen.DeleteObject();
    这个地方应该是恢复以前绘图环境。因为粗心,所以没看出问题的根本
    :)
      

  4.   

    ahphone(阿丰) 
    怎样实现啊。半年多没做VC了,现在又重做,找不到资料了
      

  5.   

    pDC.SelectObject(&pPen);
    pPen.DeleteObject();几乎没见过这种使用办法,
    一般都是 CPen *pOldPen =pDC.SelectObject(&pPen);
    pDC.SelectObject(pOldPen);
      

  6.   

    pDC.SelectObject(&pPen);
    pPen.DeleteObject();
    这种方法绝对不行,因为画笔已经被dc使用了,怎么能删除
      

  7.   

    kongyunzhongque(云雀) 
    假如要再一次创建,也是这样吗?我程序怎么老出问题
    我这样用的:
    Cpen pen;
    CPen *pOldPen;
    pen.create
    pOldPen = pDC.SelectObject(&pPen);
    .........
    pDC.SelectObject(pOldPen);
    pen.create
    pOldPen = pDC.SelectObject(&pPen);
    .........
    pDC.SelectObject(pOldPen);怎么不行啊
      

  8.   

    CPen *pOldPen = pDC.SelectObject(&pPen);//drawpDC.SelectObject(pOldPen); // 没有这行就pPen.DeleteObject();是不行的,因为pPen还在选
                               // 中状态pPen.DeleteObject();
      

  9.   

    Cpen pen;
    CPen *pOldPen;
    pen.create
    pOldPen = pDC.SelectObject(&pPen);
    .........
    pDC.SelectObject(pOldPen);pen.DeleteObject(); // **pen.create
    pOldPen = pDC.SelectObject(&pPen);
    .........
    pDC.SelectObject(pOldPen);
    pen.DeleteObject();// **
      

  10.   

    呵呵,还是不行啊,现在debug都出错了
      

  11.   

    不过这只是消耗GDI资源,不会有“数据变化”啊?我有一点怀疑是你别的一个指针变量没有初始化,而导致它在运行中覆盖你BYTE rxdata[200]一部分。
      

  12.   

    终于解决了!还是这样引起的
    头文件:char *x;InitDialog()
    {
    x = new char[20];
    sprintf(x, "", ......);//这里出问题
    }
      

  13.   

    改进:
    Cpen pen;
    CPen *pOldPen;
    pen.create
    pOldPen = pDC.SelectObject(&pPen);
    .........
    pDC.SelectObject(pOldPen)->DeleteObject;//可以不要pen.DeleteObject(); // **pen.create
    pDC.SelectObject(&pPen);
    .........
    pDC.SelectObject(pOldPen)->DeleteObject;
    //pen.DeleteObject();// **可以不要这样的错误我也见过一般原因如下:
    1 堆栈溢出 可能局部变量太多
    2 指针操作错误
    3 sprintf函数的使用一定要注意