本帖最后由 BoweirrKing 于 2013-03-02 17:46:49 编辑

解决方案 »

  1.   

    void CXxxxDlg::OnPaint() 
    {
    CPaintDC dc(this); 
    CBrush xBrush;
    xBrush.CreateSolidBrush(RGB(250,230,200)); CRgn  x1,x2;
    x1.CreateRectRgn(50,50,250,250);     //外矩形区域
    x2.CreateRectRgn(100,100,200,200);   //内矩形区域
    x1.CombineRgn(&x1,&x2,3);            //用外区域减去内区域,得到回形区域
    dc.FillRgn(&x1,&xBrush);             //填充回形区域 x1.DeleteObject();
    x2.DeleteObject();
    xBrush.DeleteObject();}
      

  2.   

    也可以用不同大小的矩形填充
    比如,先FillRect黑色矩形,再算好坐标,在中间FillRect白色矩形(假设为背景色)
      

  3.   

    终于帮楼主搞定了  过程虽艰难 但也学到了很多东西求个一起学Windwos程序设计 C++的朋友一起写扫雷。
    不求精密算法 不参考成品源码 只求熟悉代码 用GDI跟MFC没关系 有没有一起学的同学?  有意的站内私信
    代码:
    RECT CreateRECT (INT left,INT top,INT Width,INT Height)//制矩形区域
    {
    RECT rcA;
    rcA.left=left;
    rcA.top=top;
    rcA.right=rcA.left+Width;
    rcA.bottom=rcA.top+Height;
    return rcA;
    }VOID BitBitRgn (HDC hdc,RECT rect,INT RWidth,INT CWidth,HBITMAP hbmp)//以图片填充矩形区域到目标设备 (目标设备hdc,总体矩形区域,第一个向内扩展边宽度,第二个向内扩展边宽度,位图)
    {
      HRGN x1,x2;
      HBRUSH     hBrush ; x1=CreateRectRgn(rect.left,rect.top,rect.right,rect.bottom);
    x2=CreateRectRgn(rect.left+RWidth,rect.top+RWidth,rect.right-RWidth,rect.bottom-RWidth);
    CombineRgn(x1,x1,x2,RGN_XOR);
    x2=CreateRectRgn(rect.left+RWidth+CWidth,rect.top+RWidth+CWidth,rect.right-RWidth-CWidth,rect.bottom-RWidth-CWidth);
    CombineRgn(x1,x1,x2,RGN_XOR); SetBrushOrgEx(hdc,rect.left,rect.top,NULL);//必须设置刷子的新起点否则位图平铺整个客户区
    hBrush=CreatePatternBrush(hbmp);
    FillRgn(hdc,x1,hBrush); DeleteObject(hBrush);
    DeleteObject(x1);
    DeleteObject(x2);
    }
    调用代码:
    BitBitRgn(hdcMem,CreateRECT(10,100,100,100),20,10,hBitmap3);
    运行效果: