MFC控件本身不支持透明度,但是可以设置Rgn,于是可以通过带透明度图片,获取图片透明度,然后设置控件的不同位置的透明度,于是问题就回到如何获取图片的每个像素点的透明度,如下:
void GetBKimageVisibleRgn(CString filepath, int width, int height, CRgn& Rgn)
{
//获取图片宽高
Bitmap *pimage = Bitmap::FromFile(filepath);
pimage->SetResolution(width, height);
int imageW = pimage->GetWidth();
int imageH = pimage->GetHeight();
Rgn.CreateRectRgn(0, 0, imageW, imageH);
COLORREF color;
for (int i = 0; i < imageH; i++)//行循环从上到下行
{
for (int j = 0; j < imageW; j++)//列循环从左到右
{
Color cl;
pimage->GetPixel(j, i, &cl);
int alp = (int)cl.GetAlpha();//获取j,i点的ALP值
if (alp == 0)
{
CRgn tempPixRgn;//象素点区域
tempPixRgn.CreateRectRgn(j, i, j + 1, i + 1);
Rgn.CombineRgn(&Rgn, &tempPixRgn, RGN_XOR);//重叠区域抛弃叠加
tempPixRgn.DeleteObject();
}
}
}
}
以上代码可以根据图片获取Rgn,然后通过SetWindowRgn实现图片的区域为不透明的部分。
至于不仅仅透明,还要设置透明度,最好还是重绘背景。毕竟MFC并没有帮开发者做太多事情