原文:http://www.pcbookcn.com/article/2329.htm中的第三个方法
在c#中调用要能达到不规则窗体的效果void SetupRegion(
 CDC *pDC, //窗体的DC指针
 CBitmap &cBitmap, //含有窗体形状的位图对象
 COLORREF TransColor //透明色
)

 CDC memDC;
 //创建与传入DC兼容的临时DC
 memDC.CreateCompatibleDC(pDC); CBitmap *pOldMemBmp=NULL;
 //将位图选入临时DC
 pOldMemBmp=memDC.SelectObject(&cBitmap); CRgn wndRgn;
 //创建总的窗体区域,初始region为0
 wndRgn.CreateRectRgn(0,0,0,0); BITMAP bit; 
 cBitmap.GetBitmap (&bit);//取得位图参数,这里要用到位图的长和宽  int y;
 for(y=0;y<=bit.bmHeight ;y++)
 {
  CRgn rgnTemp; //保存临时region  int iX = 0;
  do
  {
   //跳过透明色找到下一个非透明色的点.
   while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) == TransColor)
    iX++;
    //记住这个起始点
    int iLeftX = iX;    //寻找下个透明色的点
    while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) != TransColor)
     ++iX;    //创建一个包含起点与重点间高为1像素的临时“region”
    rgnTemp.CreateRectRgn(iLeftX, y, iX, y+1);    //合并到主"region".
    wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR);   //删除临时"region",否则下次创建时和出错
   rgnTemp.DeleteObject();
  }while(iX GetWindow();
  pWnd->SetWindowRgn(wndRgn,TRUE); 
  pWnd->SetForegroundWindow(); 
 }