异形窗口也就是不规则窗口,实现方法是先用CreateRectRgn()函数逐点扫描,再用CombineRgn()函数合成窗口区域。
对于小窗口,启动很快。稍大些的窗口,比如800*600,测试时启动竟然要五秒多,这太不实用了!
分析后,修改了代码,只扫描不规则区域,启动时间降到两秒。效果如下图:
代码如下:
bool Init(HINSTANCE hInst,HWND hwnd)
{
//hdc=GetDC(hwnd);
skin_bmp=(HBITMAP)LoadImage(hInst,
MAKEINTRESOURCE(IDB_BITMAP3),
IMAGE_BITMAP,
WINDOW_WIDTH,
WINDOW_HEIGHT,
NULL);
mask_bmp=(HBITMAP)LoadImage(hInst,
MAKEINTRESOURCE(IDB_BITMAP4),
IMAGE_BITMAP,
WINDOW_WIDTH,
WINDOW_HEIGHT,
NULL);
/*skin_bmp= (HBITMAP)LoadImage(NULL,_T("girl2.bmp"),
IMAGE_BITMAP,
249,
400,
LR_LOADFROMFILE);
mask_bmp= (HBITMAP)LoadImage(NULL,_T("girl1.bmp"),
IMAGE_BITMAP,
249,
400,
LR_LOADFROMFILE);*/
BITMAP bmp;
HRGN LineRegion,FullRegion;
bool First=false;
GetObject(mask_bmp,sizeof(BITMAP),&bmp);
HDC hdc=CreateCompatibleDC(NULL);
SelectObject(hdc,mask_bmp);
bmpW=WINDOW_WIDTH;
bmpH=70;
for(int y=0;y<bmpH;y++)
{
for(int x=0;x<bmpW;x++)
{
if(GetPixel(hdc,x,y)!=TransparentColor)
{
/*LineRegion=CreateRectRgn(x,y,x+1,y+1);
if(First==false)
{
First=true;
FullRegion=CreateRectRgn(x,y,x+1,y+1);
}*/
LineRegion=CreateRectRgn(x,y,x+1,y+1);
if(First==false)
{
First=true;
//FullRegion=CreateRectRgn(x,y,x+2,y+2);
FullRegion=CreateRectRgn(40,70,WINDOW_WIDTH-40,WINDOW_HEIGHT-40);
}
else
CombineRgn(FullRegion,FullRegion,LineRegion,RGN_OR);
DeleteObject(LineRegion);
}
}
}
bmpW=WINDOW_WIDTH;
bmpH=600;
for(int y=WINDOW_HEIGHT-40;y<bmpH;y++)
{
for(int x=0;x<bmpW;x++)
{
if(GetPixel(hdc,x,y)!=TransparentColor)
{
/*LineRegion=CreateRectRgn(x,y,x+1,y+1);
if(First==false)
{
First=true;
FullRegion=CreateRectRgn(x,y,x+1,y+1);
}*/
LineRegion=CreateRectRgn(x,y,x+1,y+1);
CombineRgn(FullRegion,FullRegion,LineRegion,RGN_OR);
DeleteObject(LineRegion);
}
}
}
bmpW=40;
bmpH=WINDOW_HEIGHT-40;
for(int y=70;y<bmpH;y++)
{
for(int x=0;x<bmpW;x++)
{
if(GetPixel(hdc,x,y)!=TransparentColor)
{
/*LineRegion=CreateRectRgn(x,y,x+1,y+1);
if(First==false)
{
First=true;
FullRegion=CreateRectRgn(x,y,x+1,y+1);
}*/
LineRegion=CreateRectRgn(x,y,x+1,y+1);
CombineRgn(FullRegion,FullRegion,LineRegion,RGN_OR);
DeleteObject(LineRegion);
}
}
}
bmpW=WINDOW_WIDTH;
bmpH=WINDOW_HEIGHT-40;
for(int y=70;y<bmpH;y++)
{
for(int x=WINDOW_WIDTH-40;x<bmpW;x++)
{
if(GetPixel(hdc,x,y)!=TransparentColor)
{
/*LineRegion=CreateRectRgn(x,y,x+1,y+1);
if(First==false)
{
First=true;
FullRegion=CreateRectRgn(x,y,x+1,y+1);
}*/
LineRegion=CreateRectRgn(x,y,x+1,y+1);
CombineRgn(FullRegion,FullRegion,LineRegion,RGN_OR);
DeleteObject(LineRegion);
}
}
}
DeleteDC(hdc);
SetWindowRgn(hwnd,FullRegion,true);
return true;
}