高仿QQ2012登录界面, 用的是MFC写的Direct UI 方式,支持换肤,先看效果图
QQ透明皮肤:多层算法,一键适配各种背景
代码和这个的方法有点像,分为背景层,质感层,内容层
背景层:最下面的是背景层,QQ的界面当要做为皮肤的图片小于界面时其他的地方就会用图片的平均颜色来填充,在图片和平均颜色的地方还有个过滤的效果
过度效果如下图
取得平均颜色的代码如下
// 取得图片平均颜色
bool GetAverageColor(CDC *pDC, CBitmap &bitmap, const CSize &sizeImage, COLORREF &clrImage)
{
bool bIsResult = false;
CDC TempDC;
TempDC.CreateCompatibleDC(pDC);
CBitmap *pOldBitmap = TempDC.SelectObject(&bitmap);
int nWidth = sizeImage.cx;
int nHeight = sizeImage.cy;
// 定义位图信息
BITMAPINFO bi;
bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
bi.bmiHeader.biWidth = nWidth;
bi.bmiHeader.biHeight = nHeight;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 32;
bi.bmiHeader.biCompression = BI_RGB;
bi.bmiHeader.biSizeImage = nWidth * nHeight * 4; // 32 bit
bi.bmiHeader.biClrUsed = 0;
bi.bmiHeader.biClrImportant = 0;
// 获取位图数据
BYTE* pBits = (BYTE*)new BYTE[bi.bmiHeader.biSizeImage];
::ZeroMemory(pBits, bi.bmiHeader.biSizeImage);
int nLine = ::GetDIBits(TempDC.m_hDC, (HBITMAP)bitmap.GetSafeHandle(), 0, nHeight, pBits, &bi, DIB_RGB_COLORS);
if (!nLine)
{
delete []pBits;
pBits = NULL;
}
else
{
long r = 0, g = 0, b = 0;
for (LONG i = 0; i < nWidth; i++)
{
for (LONG j = 0; j < nHeight; j++)
{
b += pBits[(j * nWidth + i) * 4];
g += pBits[(j * nWidth + i) * 4 + 1];
r += pBits[(j * nWidth + i) * 4 + 2];
}
}
delete []pBits;
pBits = NULL;
int n = nWidth * nHeight;
clrImage = RGB(r / n, g / n, b / n);
bIsResult = true;
}
TempDC.SelectObject(pOldBitmap);
TempDC.DeleteDC();
return bIsResult;
}
质感层:质感层可以只是一个带透明度的矩形(一般为白色吧),可以是整个矩形透明度一样,也可以从上到下减少如下图
左边的效果是如四个区域组成,右边的是四个区域分开的效果
内容层: 内容层也就是控件层了没什么好说的,少个质感层的话会是这种效果
其他方面也就没什么了,详情请看代码
如果发现在BUG什么的或有别的实现方法可以联系我QQ:278162354