好象在深度历险上见过一个例子。应该不难吧,得到不规则图形的rgn,然后再,,,

解决方案 »

  1.   

    建立一个窗体,设其BorderStyle为bsSingle。
    procedure TForm1.FormDblClick(Sender: TObject);
    var ARgn: HRGN;
    begin
      //创建一个剪裁区域,它可以是任意形状,在此创建的是一个椭圆形
      ARgn := CreateEllipticRgn(0,0,Width,Height);
      //根据剪裁区域形状设置窗体形状。
      SetWindowRgn(Handle, ARgn, True);
      //释放剪裁区域
      DeleteObject(ARgn);
    end;
      

  2.   

    1.加载图形
    2.抠图,去掉指定颜色的图形部分:
    void CNewCBTickerDlg::DigBmp(CDC* pDC,CBitmap* Digged,CRgn* rgnWnd,
    COLORREF TransColor)
    {
    CDC dcMem;
    CBitmap* pOldBitmap=NULL;
    COLORREF cl;
    CRgn rgnTemp; dcMem.CreateCompatibleDC(pDC);
    pOldBitmap=dcMem.SelectObject(Digged); UINT rx=ry=0;
             UINT x1,ry1; BITMAP bm;
    Digged->GetBitmap(&bm);
    rx1=rx+bm.bmWidth;
    ry1=ry+bm.bmHeight; rgnWnd->SetRectRgn(rx,ry,rx1,ry1); for(x=rx ; x<=rx1; x++)
    {
    for(y = ry; y<=ry1; y++)
    {
    //取得坐标处象素的颜色值
      cl = dcMem.GetPixel(x, y);
      if(cl == TransColor)
      {
      象素颜色为指定的透明色,创建透明"微区域"
        rgnTemp.CreateRectRgn(x, y, x+1, y+1);
       //"扣像",从完整的区域中"扣除"透明的"微区域"(异或)
        rgnWnd->CombineRgn(rgnWnd, &rgnTemp, RGN_XOR);
      //删除刚创建的透明"微区域",释放系统资源
        rgnTemp.DeleteObject();
      }
      }
    }
      if (pOldBitmap) dcMem.SelectObject(pOldBitmap);
    ReleaseDC(&dcMem);
    }
    3.在OnInitDialog(窗口初始化函数)中,调用DigBmp

    ……
    DigBmp(……);
    SetWindowRgn((HRGN)rgnWnd,true);
    ……