CRgn rgn;
rgn.CreateRectRgn(5, 5, 100, 100);
// ??? 怎么能取得这个rgn的补集?谢谢
pDC->SelectClipRgn(&rgn);
………………

解决方案 »

  1.   

    CRgn rgn;
    rgn.CreateRectRgn(5,5,100,100);
    CRgn rgn2;
    rgn2.CreateRectRgn(0,0,200,200);
    CRgn rgnDes;
    rgnDes.CombineRgn(rgn1,rgn2,RGN,XOR);
    pDC->SelectClipRgn(&rgnDes);
    /**********
    int CombineRgn(
       CRgn* pRgn1,
       CRgn* pRgn2,
       int nCombineMode 
    );
    RGN_XOR   Combines both regions but removes overlapping areas. 
      

  2.   

    Sorry,
    rgnDes.CombineRgn(rgn1,rgn2,RGN_XOR);
      

  3.   

    一个是整个DC的区域
    一个是小的区域
    求XOR,形成覆盖掉的被去掉了的区域
      

  4.   

    不知道为什么,在MM_TEXT模式下没问题,但是我一换到MM_HIMETRIC下就搞不定了。郁闷啊。
      

  5.   

    一下代码再屏幕中间做一个空洞使用MM_HIENGLISH模式
    int iOldMode=pDC->SetMapMode(MM_HIENGLISH);
    CRect rect(0,0,800,600),rect1(200,150,600,450);
    CBrush brush;
    brush.CreateSolidBrush(RGB(255,0,0));
    CBrush *pOldBrush=pDC->SelectObject(&brush); CRgn rgn1;
    rgn1.CreateRectRgn(rect1.left,rect1.top,rect1.right,rect1.bottom);
    CRgn rgn2;
    rgn2.CreateRectRgn(rect.left,rect.top,rect.right,rect.bottom);
    CRgn rgnDes;
    rgnDes.CreateRectRgn(rect.left,rect.top,rect.right,rect.bottom);
    rgnDes.CombineRgn(&rgn1,&rgn2,RGN_XOR);
    pDC->SelectClipRgn(&rgnDes);

    pDC->DPtoLP(&rect); pDC->Rectangle(&rect);
    pDC->SelectObject(pOldBrush);
    brush.DeleteObject();
    pDC->SetMapMode(iOldMode);
    }
      

  6.   

    唉,知道了。就是我说的转成MM_TEXT模式吗。
    看来CRgn只能用在MM_TEXT模式下面。那我还不如手动画,反正都是矩形而已。
    谢谢诸位。