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;
}