可以缩放的异形窗口 一个矩形裁剪区(rgn),4个角裁剪区(rgnlt,rgnrt,rgnrb,rgnlb). 
矩形裁剪区大小可以变化,4个角裁剪区大小不变,假定都是10*10,位置对应于矩形裁剪区(rgn)的4个角. 1.  生成rgnlt,rgnrt,rgnrb,rgnlb 2.在onsize中 
        CRgn rgn; 
rgn.CreateRectRgn (0, 0, rcClient.Width0, rcClient.Height0); 
        //不知道怎么弄了 
rgn.CombineRgn(&rgn, rgnlt, RGN_AND);//?

解决方案 »

  1.   

    假定4个角裁剪区大小不变,假定都是10*10
    在onsize中  CRect rect, rect2;
    CRgn rgn[4];
    CRgn rgnWnd; GetClientRect(rect);
    GetWindowRect(rect2);
    rect.right = rect.left + rect2.Width();
    rect.bottom = rect.top + rect2.Height();
    rgn[0].CreateRectRgn(rect.left, rect.top, rect.left + 10, rect.top + 10);
    rgn[1].CreateRectRgn(rect.right - 10, rect.top, rect.right, rect.top + 10);
    rgn[2].CreateRectRgn(rect.left, rect.bottom - 10, rect.left + 10, rect.bottom);
    rgn[3].CreateRectRgn(rect.right - 10, rect.bottom - 10, rect.right, rect.bottom); rgnWnd.CreateRectRgn(rect.left, rect.top, rect.right, rect.bottom);
    rgnWnd.CombineRgn(&rgnWnd, &rgn[0], RGN_XOR);
    rgnWnd.CombineRgn(&rgnWnd, &rgn[1], RGN_XOR);
    rgnWnd.CombineRgn(&rgnWnd, &rgn[2], RGN_XOR);
    rgnWnd.CombineRgn(&rgnWnd, &rgn[3], RGN_XOR); SetWindowRgn((HRGN)rgnWnd.Detach(), TRUE);
    貌似另外一个版也发了同样的问题?!
      

  2.   

    生成rgnlt,rgnrt,rgnrb,rgnlb 的代价比较高,就是流行的Bmp2Rgn
    这4个区域怎么和rgn[4]产生反应?
      

  3.   

    rgnlt,rgnrt,rgnrb,rgnlb  只生成一次
    不多次生成
      

  4.   

    我已经弄出来了
    Onsize中,以右上角为例:RECT rect;
    CRgn rgnRT;
    CRgn rgnWnd;
    GetClientRect(rect);
    int a1=rect.right - m_szRT.cx,a2=rect.top,a3=rect.right,a4=rect.top+m_szRT.cy;
    rgnRT.CreateRectRgn(a1,a2 , a3, a4 );//创建右上角区域
    int nOffsetx=rect.right - m_szRT.cx;
    m_cRgnRT.OffsetRgn(nOffsetx,0);//将右上角图片区域移动到右上角,XOR
    rgnRT.CombineRgn(&rgnRT,m_cRgnRT,RGN_XOR);//裁剪右上角
    rgnWnd.CreateRectRgnIndirect(&rect);
    rgnWnd.CombineRgn(&rgnWnd,&rgnRT, RGN_XOR);//将裁剪后的右上角合并到主区域,XOR
    rgnRT.DeleteObject();
    rgnWnd.DeleteObject();
    m_cRgnRT.OffsetRgn(-nOffsetx,0);//返回原来的位置