//效果截图如下(文后提供本例子的VS2008工程下载)
------------------------------------------------------------------------------------------------------------------------------------------------- ---
关于边边有杂色的问题,是因为边边的颜色和要透明的颜色不一样,只要用PS
将边边的颜色弄成和要透明的颜色一样就可以了,CF登陆窗口的背景图弄的就非常好,
这就看亲的PS功底了。
------------------------------------------------------------------------------------------------------------------------
主要代码如下:
//CDC *pDC, //窗体的DC指针
//CBitmap &cBitmap, //含有窗体形状的位图对象
//COLORREF TransColor //透明色
void CIrregularWndDlg::SetupRegionCDC(CDC * pDC, CBitmap & cBitmap, COLORREF TransColor)
{
//本函数只调用一次即可,不然窗口会闪哦
static int nExit=1;
if (nExit>1)
{
return;
}
nExit++;
CDC memDC;//创建与传入DC兼容的临时DC
memDC.CreateCompatibleDC(pDC);
CBitmap *pOldMemBmp = NULL;//将位图选入临时DC
pOldMemBmp = memDC.SelectObject(&cBitmap);
static CRgn wndRgn;//创建总的窗体区域,初始region为0
wndRgn.CreateRectRgn(0, 0, 0, 0);
BITMAP bit;
cBitmap.GetBitmap (&bit);//取得位图参数,这里要用到位图的长和宽
//逐个扫描图片的每个像素,如这个像素不属于透明色,
//则在相应位置创建一个只含一个像素的region,然后将这些小region
//合并起来组成一个任意形状的region
int y;
CRgn rgnTemp; //保存临时region
for(y = 0; y <= bit.bmHeight ; y++)
{
int iX = 0;
do
{
//在图片的第y行寻找第一个非透明色的点
while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) == TransColor)
iX++;
int iLeftX = iX;//记住这个起始点
//在图片的第y行寻找第一个透明色的点
while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) != TransColor)
++iX;
//创建一个包含起点与终点间高为1像素的临时“region”
rgnTemp.CreateRectRgn(iLeftX, y, iX, y + 1);
//合并到主"region".
wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR);
//删除临时"region",否则下次创建时会出错
rgnTemp.DeleteObject();
}
while(iX<= bit.bmWidth);
}
this->SetWindowRgn(wndRgn, TRUE);
memDC.DeleteDC();
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
本例子VS2008工程下载:
http://download.csdn.net/detail/friendan/6202163 //MFC不规则窗体.zip
---------------------------------------------------------------------------------------------------------------------------------
您的十分满意是我追求的宗旨。
您的一点建议是我后续的动力。