窗口重绘出现抖动,另外抖动一段时间后就挂掉了(窗口一片白的)是什么问题请高手指点!

解决方案 »

  1.   

    就用InValidate()进行窗口重绘,刚开始抖动过一段时间就(窗口一片白的)
      

  2.   

    你不会把InValidate()放在OnPaint()里吧
      

  3.   

    抖动就是闪烁意思,我把InValidate()放在串口接收事件OnOMM里,串口接收等全部接收到预定的报文后进行处进理再用窗口重绘
      

  4.   

    把你OnPaint里写的代码放出来 look一下
      

  5.   

    OnPaint 就是获得设备上下文,再创建一个画笔画几条线呀!
      

  6.   

    void CRndBtnDlg::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting
    // TODO: Add your message handler code here 
        CPen pen(PS_SOLID,1,RGB(255,255,255));  //创建新画笔
        CPen* pOldPen = dc.SelectObject(&pen); //将画笔选入设备描述表,并将就画笔返回
        dc.MoveTo(11,18);   //画方框
        dc.LineTo(970,18);
    dc.MoveTo(11,17);
    dc.LineTo(11,578);
    dc.MoveTo(11,578);
    dc.LineTo(970,578);
    dc.MoveTo(970,578);
    dc.LineTo(970,0);
    //dc.SelectObject(pOldPen);
    //delete pen;
        //pen(PS_SOLID,1,RGB(255,255,255));  //创建新画笔
        //CPen* pOldPen = dc.SelectObject(&pen); //将画笔选入设备描述表,并将就画笔返回
        for(int i=1;i<20;i++)
    {
            dc.MoveTo(11,18+28*i);
        dc.LineTo(970,18+28*i);
    }
        dc.SelectObject(pOldPen);
    // Do not call CDialog::OnPaint() for painting messages
    }
    添出OnPaint
      

  7.   

    我想问题应该不是出在这段代码,很可能是出个自定义按钮类的DrawItem上,请问有那几种可能的对象需要释放?
      

  8.   

    用双缓冲解决抖动问题,具体可以google“双缓冲”看看是不是dc没有释放,导致出现问题。
      

  9.   

    用TRACE宏调试输出一下吧,一般实时的调试问题就这么解决的。
      

  10.   

    先把InValidate()移出来,放到一个按钮的按下事件里调用,
    如果没问题,就是说你的串口接收事件OnOMM在飞快的被重复调用.
      

  11.   

    timer里来个KillTiemr(1);再OnOMM最后面来个SetTimer(1,5000,NULL);也是一样的结果
      

  12.   

    void CRoundButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
    {
    // TODO: Add your code to draw the specified item
    ASSERT(lpDrawItemStruct != NULL);
      CDC* pDC   = CDC::FromHandle(lpDrawItemStruct->hDC);   //绘制操作所使用的设备环境
    CRect rect = lpDrawItemStruct->rcItem;                 //指定了将被绘制的矩形区域
    UINT state = lpDrawItemStruct->itemState;//指定了当前绘制操作完成后,所绘项的可见状态
    UINT nStyle = GetStyle();                //The window’s style
    int nRadius = m_nRadius;
        //该函数通过把数据描述选定对象和图形模式(如位图、画笔、调色板、字体、笔、区域、绘图
    //模式、映射模式)拷贝到描述表推栈中为保存,指定设备上下文环境的当前状态
    //int nSavedDC = pDC->SaveDC();
    pDC->SelectStockObject(NULL_BRUSH);
    pDC->FillSolidRect(rect, RGB(138, 162, 157));
    if ((state & ODS_FOCUS) && m_bDrawDashedFocusCircle)  //第一个按钮
            //画出一个圆
    DrawCircle(pDC, m_ptCentre, nRadius--, RGB(0,0,0));
     //Draw the raised/sunken edges of the button (unless flat)
    if (nStyle & BS_FLAT) {                               //第二个按钮
    DrawCircle(pDC, m_ptCentre, nRadius--, RGB(0,0,0));
    DrawCircle(pDC, m_ptCentre, nRadius--, ::GetSysColor(COLOR_3DHIGHLIGHT));
    } else {
    if ((state & ODS_SELECTED)) {
    DrawCircle(pDC, m_ptCentre, nRadius--, 
       ::GetSysColor(COLOR_3DDKSHADOW), ::GetSysColor(COLOR_3DHIGHLIGHT));
    DrawCircle(pDC, m_ptCentre, nRadius--, 
       ::GetSysColor(COLOR_3DSHADOW), ::GetSysColor(COLOR_3DLIGHT));

    for(int i=0;i<6;i++)
    {

        if(CColor=="0")
    {
    DrawCircle(pDC, m_ptCentre, i, 
       RGB(0, 190, 0),RGB(0, 190, 0));    //绿色
    }
    if(CColor=="1")
    {
    DrawCircle(pDC, m_ptCentre, i, 
       RGB(190, 1, 20),RGB(190,1, 20));    //红色
    }
    if(CColor=="2")
    {
    DrawCircle(pDC, m_ptCentre, i, 
       RGB(204, 204, 0),RGB(204, 204, 0));    //黄色
    }
    if(CColor=="3")
    {
    DrawCircle(pDC, m_ptCentre, i, 
       RGB(27, 58, 143),RGB(27,58, 143));    //蓝色
    }
    }
    } else {
    DrawCircle(pDC, m_ptCentre, nRadius--, RGB(0,0,0));
    DrawCircle(pDC, m_ptCentre, nRadius--, 
       ::GetSysColor(COLOR_3DHIGHLIGHT), ::GetSysColor(COLOR_3DDKSHADOW)); DrawCircle(pDC, m_ptCentre, nRadius--, 
       ::GetSysColor(COLOR_3DLIGHT), ::GetSysColor(COLOR_3DSHADOW)); for(int i=0;i<6;i++)
    {


        if(CColor=="0")
    {
    DrawCircle(pDC, m_ptCentre, i, 
       RGB(0, 190, 0),RGB(0, 190, 0));    //绿色
    }
    if(CColor=="1")
    {
    DrawCircle(pDC, m_ptCentre, i, 
       RGB(192, 26, 42),RGB(192, 26, 42));    //红色
    }
    if(CColor=="2")
    {
    DrawCircle(pDC, m_ptCentre, i, 
       RGB(204, 204, 0),RGB(204,204, 0));    //黄色
    }
    if(CColor=="3")
    {
    DrawCircle(pDC, m_ptCentre, i, 
       RGB(27, 58, 143),RGB(27,58, 143));    //蓝色
    }
    }
    }
    }
    // draw the text if there is any
    CString strText;
    //该函数将指定窗口的标题条文本(如果存在)拷贝到一个缓存区内
    GetWindowText(strText);
        //指出变量是否已经初始化
    if (!strText.IsEmpty())
    {
    CRgn rgn;
    //创建一个椭圆,该椭圆与X1,Y1和X2,Y2坐标点确定的矩形内切 
    rgn.CreateEllipticRgn(m_ptCentre.x-nRadius, m_ptCentre.y-nRadius, 
      m_ptCentre.x+nRadius, m_ptCentre.y+nRadius);
    //该函数选择一个区域作为指定设备环境的当前剪切区域
    pDC->SelectClipRgn(&rgn);

            //使用该函数获得所选字体中指定字符串的高度和宽度
    CSize Extent = pDC->GetTextExtent(strText);
    //构造一个CPoint对象。如果不给参数,则不初始化x和y成员
    CPoint pt = CPoint( m_ptCentre.x - Extent.cx/2, m_ptCentre.x - Extent.cy/2 ); if (state & ODS_SELECTED) pt.Offset(1,1); pDC->SetBkMode(TRANSPARENT); if (state & ODS_DISABLED)
    //调用该成员函数来显示图象,并将视觉效果表示状态,例如无效或缺省状态
    pDC->DrawState(pt, Extent, strText, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL);
    else
    pDC->SetTextColor(RGB (255, 255, 255));
    //pDC->TextOut(pt.x, pt.y, strText);
            //该函数选择一个区域作为指定设备环境的当前剪切区域
    pDC->SelectClipRgn(NULL);
    //该函数删除一个逻辑笔、画笔、字体、位图、区域或者调色板,释放所有与该对象
    //有关的系统资源,在对象被删除之后,指定的句柄也就失效了
    rgn.DeleteObject();
    } // Draw the focus circle on the inside of the button
    //if ((state & ODS_FOCUS) && m_bDrawDashedFocusCircle)
    //可以画出一个圆
    DrawCircle(pDC, m_ptCentre, nRadius, 
       RGB(0,0,0),RGB(0,0,0));
        //该函数恢复设备上下文环境(DC)到指定状态,
    //该设备上下文环境的恢复是通过使状态信息出栈而进行的
    //pDC->RestoreDC(nSavedDC);
    //pDC->DeleteDC();}请问这段程序那里内存泄露???