任意形状的窗体

王朝other·作者佚名  2008-06-01
宽屏版  字体: |||超大  

Graphics::TBitmap* Spirite=new Graphics::TBitmap();

bool bkey=true;

int iCount=0;

TColor ColorKey=clWhite;

Spirite->LoadFromFile("D:\\bcbbak\\resource\\traffic.bmp");

Width=Spirite->Width;Height=Spirite->Height;

for(int i=0;i<Spirite->Height;i++)

{

bkey=true;

for(int j=0;j<Spirite->Width;j++)

{

if(Spirite->Canvas->Pixels[j][i]==ColorKey)

bkey=true;

else{ if(bkey) iCount++; bkey=false;}

}

}

byte* pData;

RGNDATA* pRgnData;

RECT* pRect;

int iIndex=0,iLeft=0;

pData=new Byte[sizeof(RGNDATAHEADER)+sizeof(RECT)*iCount];

pRgnData=(RGNDATA* )pData;

pRect=(RECT* )(pData+sizeof(RGNDATAHEADER));

pRgnData->rdh.dwSize= sizeof( RGNDATAHEADER ) ;

pRgnData->rdh.iType= RDH_RECTANGLES;

pRgnData->rdh.nCount= iCount;

pRgnData->rdh.nRgnSize = sizeof( RECT )*iCount;

pRgnData->rdh.rcBound.left= 0;

pRgnData->rdh.rcBound.top= 0;

pRgnData->rdh.rcBound.right=Spirite->Width;

pRgnData->rdh.rcBound.bottom=Spirite->Height;

for( int i=Spirite->Height-1;i>=0;i--) //因为Bitmap位图在Y方向是颠倒的所以要从底部开始

{

bkey = TRUE ; iLeft = -1;

for( int j=0;j<Spirite->Width;j++)

{

if(Spirite->Canvas->Pixels[j][i]==ColorKey )

{if( !bkey )

{pRect[iIndex].left =iLeft;

pRect[iIndex].right=j;

pRect[iIndex].top=Spirite->Width-i-1;

pRect[iIndex].bottom=Spirite->Height-i;

bkey=TRUE ;iIndex++ ;iLeft=-1;

}

}

else if(bkey){iLeft=j; bkey=false;}

}

if(iLeft>=0)

{

pRect[iIndex].left=iLeft ;

pRect[iIndex].right=Spirite->Width;

pRect[iIndex].top=i;

pRect[iIndex].bottom=i;

iIndex++;

}

}

bool br=ExtCreateRegion(NULL,sizeof( RGNDATAHEADER )+sizeof(RECT)*iCount,pRgnData);

if(!br) { ShowMessage("Create Form Failed."); Close(); }

delete[] pData;

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有