对话框里面的刷新onpaint(),对话框显示后,再刷新一两次,就有CreatePolygonRgn失败了,帮忙看一下这段代码的问题在哪?
           CPaintDC dc(this);
CPoint* p=new CPoint[7];
p[1].x =1;
p[1].y =7; p[2].x =55;
p[2].y= 21;
p[3].x =12;
p[3].y =37;
p[4].x =21;
p[4].y =76;
p[5].x =61;
p[5].y =75;
p[6].x =21;
p[6].y =72;
p[0] = p[6];
CPen pen(1,1,RGB(255,0,0));
CPen* pOldPen;
pOldPen=dc.SelectObject(&pen);
dc.SetBkMode(TRANSPARENT);
for(int i=0 ; i<1000 ; i++)
{
  dc.TextOut(20,20,"dddd da",9); 
CRgn* rgn=new CRgn;
if(rgn->CreatePolygonRgn(p,11,ALTERNATE)==0)
{
CString s;
s.Format("%d error",i);
AfxMessageBox(s);
}
CBrush b(RGB(0,220,0));
if(dc.FillRgn(rgn,&b)==0)
AfxMessageBox("fill error");
rgn->DeleteObject();
delete rgn;
}
dc.SelectObject(pOldPen);
delete []p;

CDialog::OnPaint();

解决方案 »

  1.   

    有点乱,整理一下
    CPaintDC dc(this); 
    CPoint* p=new CPoint[7]; 
    p[1].x =1; 
    p[1].y =7; p[2].x =55; 
    p[2].y= 21; 
    p[3].x =12; 
    p[3].y =37; 
    p[4].x =21; 
    p[4].y =76; 
    p[5].x =61; 
    p[5].y =75; 
    p[6].x =21; 
    p[6].y =72; 
    p[0] = p[6]; 
    CPen pen(1,1,RGB(255,0,0)); 
    CPen* pOldPen; 
    pOldPen=dc.SelectObject(&pen); 
    dc.SetBkMode(TRANSPARENT); 
    for(int i=0 ; i <1000 ; i++) 

        dc.TextOut(20,20,"dddd da",9); 
        CRgn* rgn=new CRgn; 
        if(rgn->CreatePolygonRgn(p,11,ALTERNATE)==0) 
        { 
            CString s; 
            s.Format("%d error",i); 
            AfxMessageBox(s); 
        } 
        CBrush b(RGB(0,220,0)); 
        if(dc.FillRgn(rgn,&b)==0) 
        AfxMessageBox("fill error"); 
        rgn->DeleteObject(); 
        delete rgn; 

    dc.SelectObject(pOldPen); 
    delete []p; CDialog::OnPaint();
      

  2.   

    if(rgn->CreatePolygonRgn(p,7,ALTERNATE)==0) 
    应该是7个点吧!你用了11个点,估计会错了!
      

  3.   

    dc.SelectObject(pOldPen); 后要加 pen.DeleteObject();
    delete rgn; 后面加b.DeleteObject();
    另外,dc.SetBkMode(TRANSPARENT); 应该记录以前的mode,然后用完设置回去!