本文主要用于再WinCE当中处理不规则窗体的时候用到的。
异形窗体大家相比也是很清楚,主要就是利用Region,Windows里面有很多的API,虽然他的弊端很明显,例如,速度慢,这里主要就是为了解决这个问题,提供如下的函数接口,这里写成了DLL,给大家调用使用:
BITMAP bitmap;
GetObject(_hbmp,sizeof(bitmap),&bitmap);
//获取位图的高和宽
int nWidth=bitmap.bmWidth;
int nHeight=bitmap.bmHeight;
HDC hmemDC= ::CreateCompatibleDC(NULL);
//创建与传入DC兼容的临时
HBITMAP hOldBmp = (HBITMAP)::SelectObject(hmemDC,_hbmp);
//创建总的窗体区域,初始region为0
if(_hrgn==NULL)
_hrgn =::CreateRectRgn(0,0,0,0);
if(_transColor==NULL)
_transColor=GetPixel(hmemDC,0,0);
int y;
for(y=0;y<nHeight ;y++)
{
HRGN rgnTemp; //保存临时region
int iX = 0;
do
{
//跳过透明色找到下一个非透明色的点.
while (iX < nWidth && ::GetPixel(hmemDC,iX, y) == _transColor)
iX++;
//记住这个起始点
int iLeftX = iX;
//寻找下个透明色的点
while (iX < nWidth && ::GetPixel(hmemDC,iX, y) != _transColor)
++iX;
//创建一个包含起点与重点间高为1像素的临时“region”
rgnTemp=::CreateRectRgn(iLeftX, y, iX, y+1);
//合并到主"region".
CombineRgn( _hrgn,_hrgn,rgnTemp, RGN_OR);
//删除临时"region",否则下次创建时和出错
::DeleteObject(rgnTemp);
}
while(iX <nWidth );
iX = 0;
}
::SelectObject(hmemDC,hOldBmp);
::DeleteDC(hmemDC);
//return hrgn;
}
///FunctionName:SaveRGN
///Description:保存HRGN到指定的文件
///HRGN hRgn:需要保存的区域
///pFilePath:保存文件的路径
ROCKRGN_API void SaveRGN(HRGN hRgn,TCHAR *pFilePath)
{
//获取hRgn的大小
DWORD size=0;
size = GetRegionData(hRgn,size,NULL);
BYTE *pRegionData=new BYTE[size];
if(0==GetRegionData(hRgn,size,(LPRGNDATA)pRegionData))
{
return;
}
HANDLE hFile = CreateFile(pFilePath,GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile==NULL)
{
return;
}
DWORD dwWrited=0;
if(0==WriteFile(hFile,pRegionData,size,&dwWrited,NULL))
{
return;
}
CloseHandle(hFile);
hFile=NULL;
//删除
delete pRegionData;
pRegionData=NULL;
}
///FunctionName: ReadRGN
///读取RGN文件到内存当中
///HRGN &_hRgn:读取的文件存放的地方
///pFilePath:读取的文件内容
///
ROCKRGN_API void ReadRGN(HRGN &_hRgn, TCHAR *pFilePath)
{
HANDLE hFile = CreateFile(pFilePath,GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile==NULL)
{
return ;
}
DWORD size=GetFileSize(hFile,NULL);
if(size==0xFFFFFFFF)
{
return ;
}
BYTE *pRegionData= new BYTE[size];
DWORD dwNumberWrite=0;
ReadFile(hFile,pRegionData,size,&dwNumberWrite,NULL);
_hRgn = ExtCreateRegion(NULL,size,(RGNDATA*)pRegionData);
CloseHandle(hFile);
hFile=NULL;
delete pRegionData;
pRegionData=NULL;
}
ROCKRGN_API void RockSetWindowRgn(HWND hWnd,HRGN hrgn,BOOL bRedraw)
{
SetWindowRgn(hWnd,hrgn,bRedraw);
}