www.pudn.com > SDKSkin.rar > SkinRgn.cpp


// SkinRgn.cpp 
 
#include "stdafx.h" 
#include "SkinRgn.h" 
 
SkinRgn::SkinRgn() 
{ 
} 
 
HRGN  SkinRgn::FontToRgn(HDC _hDc,LPTSTR lpstrCap) 
{ 
	if(_hDc == 0 || lpstrCap == 0) return NULL; 
	 
	HRGN rtRgn = NULL; 
	 
	BeginPath(_hDc); 
	 
	int nOldBd = SetBkMode(_hDc,TRANSPARENT); 
	TextOut(_hDc,0,0,lpstrCap,_tcslen(lpstrCap)+1); 
	 
	EndPath(_hDc); 
	 
	rtRgn = PathToRegion(_hDc); 
 
	SetBkMode(_hDc,nOldBd); 
 
	return rtRgn; 
} 
 
HRGN  SkinRgn::ImageToRgn(HDC memDc,int nWid,int nHei,COLORREF dfTranp) 
{ 
	if(memDc == 0) return NULL; 
	 
	//创建总的窗体区域,初始region为0 
	HRGN rtRgn = rtRgn = CreateRectRgn(0,0,0,0); 
 
    int y = 0; 
    for(y=0;y<=nHei;y++) 
    { 
        HRGN rgnTemp = 0; //保存临时region 
         
        int iX = 0; 
        do 
        { 
            //跳过透明色找到下一个非透明色的点. 
            while (iX <= nWid  && GetPixel(memDc,iX,y) == dfTranp) 
			{ 
				iX++; 
			} 
             
            //记住这个起始点 
            int iLeftX = iX; 
             
            //寻找下个透明色的点 
            while(iX <= nWid  && GetPixel(memDc,iX,y) != dfTranp) 
			{ 
				++iX; 
			} 
             
            //创建一个包含起点与重点间高为1像素的临时“region” 
            rgnTemp= CreateRectRgn(iLeftX, y, iX, y+1); 
             
            //合并到主"region". 
            CombineRgn(rtRgn,rtRgn,rgnTemp,RGN_OR); 
             
            //删除临时"region",否则下次创建时和出错 
            DeleteObject(rgnTemp); 
        }while(iX < nWid); 
        iX = 0; 
    } 
	return rtRgn; 
} 
 
HRGN  SkinRgn::ImageToRgn(HDC _hDc,HBITMAP hImg,COLORREF dfTranp) 
{ 
	if(_hDc == 0 || hImg == 0) return NULL; 
 
	HDC memDc = CreateCompatibleDC(_hDc);; 
	HBITMAP oldBm = (HBITMAP)SelectObject(memDc,hImg); 
	 
	BITMAP bmp;    
	//取得位图参数,这里要用到位图的长和宽  
    GetObject(hImg,sizeof(BITMAP),&bmp);    
	 
	HRGN rtRgn = ImageToRgn(memDc,bmp.bmWidth,bmp.bmHeight,dfTranp); 
     
    if(oldBm) 
	{ 
		SelectObject(memDc,oldBm); 
	} 
 
	return rtRgn; 
}