把位图中不需要部分用某一颜色表示,生成的窗体形状就是去把这种颜色的部分。

解决方案 »

  1.   

    可以根据具体的位图,预先计算对应的一个rgn,通过GetRegionData取得rgn的数据并保存,之后就可以用ExtCreateRegion从保存的数据中产生那一个rgn。然后用SetWindowRgn改变窗口的形状。计算rgn可以用一个最简单的办法:首先用CreateRectRgn创建一个与位图大小一致的rgn,作为初始的rgn,然后进入一个二重循环,扫描位图的每一个点,并判断:如果该点是透明色,就创建一个只包含该点的rgn,用CombineRgn的RGN_DIFF操作,从上次得到的rgn中去掉这一点,作为下一次迭代的rgn。最终得到的rgn就是符合位图的rgn了。
      

  2.   

    //下面为根据指定的位图以及要去掉的颜色生成一个区域
    HRGN SetRgn(HBITMAP hBitmap,COLORREF clrKey) 
    {
      CBitmap bitmap ;
      bitmap.Attach(hBitmap) ;
      BITMAP bitmapInfo ;
      bitmap.GetBitmap(&bitmapInfo) ;
      int nRow = bitmapInfo.bmHeight ;
      int nCol = bitmapInfo.bmWidth ;
      
      CDC memDC ;
      memDC.CreateCompatibleDC(NULL) ;
      CBitmap* pOldBitmap = memDC.SelectObject(&bitmap) ;
      CRgn rgn ;  
      rgn.CreateRectRgn(0,0,nCol,nRow) ;
      for(int y = 0; y < nRow; y++)
      {
           for(int x = 0; x < nCol; x++)
           {
      COLORREF clrPixel = memDC.GetPixel(y,x) ;
      if(clrPixel == clrKey)//去除关键色
      {
         CRgn rgnTemp ;
         rgnTemp.CreateRectRgn(y,x,y+1,x+1) ;
         rgn.CombineRgn(pRgn,&rgnTemp,RGN_XOR) ;
         rgnTemp.DeleteObject() ;
      }
           }
       }
       memDC.SelectObject(pOldBitmap) ;
       memDC.DeleteDC() ;
       bitmap.Detach() ;
       (HRGN)return rgn.Detach() ;
    }根据生成的区域设置窗口
    void SetWndRgn(HWND hWnd,HBITMAP hBitmap)

       HRGN hRgn = SetRgn(hBitmap,clrKey)//其中clrKey为要mask掉的颜色值
       SetWindowRgn(hRgn) ;
       return ;
    }