玉镯等手环,晶莹剔透,非常漂亮。然而我们现在使用纯代码方式实现这个手镯。
下面是效果图:
1.环状手镯特效
2.发光的立体手环特效
3.玉盘立体特效
4.中点一个洞的特效
5.中心空洞变大
纯代码实现的玉器手镯,光泽还是很细腻的哦。如果远看,和真的一样。
环状立体特效的实现原理和矩形框立体特效差不多,只是这里是环形的,实现不太一样。同样的原理,你可以是三角形等各种形状。
实现这些效果的函数声明如下:
void GradientLinearCenterBorderCircle(CDC* pDC,CRect rt,COLORREF clr1,COLORREF clr2,int len,bool swap)
函数使用示例:
CDC *pDC = GetDC();
CRect rtClient(50,50,400,400);
GradientLinearCenterBorderCircle(pDC,rtClient,RGB(50,120,50),RGB(200,200,200),100,false);
函数实现代码:
void GradientLinearCenterBorderCircle(CDC* pDC,CRect rt,COLORREF clr1,COLORREF clr2,int len,bool swap)
{
//使用内存DC来加速绘制,防止闪烁
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC,rt.Width(),rt.Height());
dcMem.SelectObject(&bmp);
//开始内存绘制
//rtTmp用于绘制,rt用于画布
CRect rtTmp(0,0,rt.Width(),rt.Height());
rtTmp.left += len;
rtTmp.top += len;
rtTmp.right -= len;
rtTmp.bottom -= len;
int width = rtTmp.Width();
int height = rtTmp.Height();
if (swap)
{
COLORREF clrTmp = clr1;
clr1 = clr2;
clr2 = clrTmp;
}
int r1 = GetRValue(clr1);
int r2 = GetRValue(clr2);
int g1 = GetGValue(clr1);
int g2 = GetGValue(clr2);
int b1 = GetBValue(clr1);
int b2 = GetBValue(clr2);
int rSpan = r2 - r1;
int gSpan = g2 - g1;
int bSpan = b2 - b1;
int len_clr=0;
dcMem.SelectStockObject(NULL_BRUSH);
for (int i=0;i<len/2;i++)
{
COLORREF clr = RGB(r1+(i*rSpan)/len,g1+(i*gSpan)/len,b1+(i*bSpan)/len);
rtTmp.InflateRect(1,1,1,1);
CPen pen(PS_SOLID,2,clr);
dcMem.SelectObject(&pen);
dcMem.Ellipse(&rtTmp);
}
rSpan = r1 - r2;
gSpan = g1 - g2;
bSpan = b1 - b2;
for (int i=len/2;i<len;i++)
{
COLORREF clr = RGB(r2+(i*rSpan)/len,g2+(i*gSpan)/len,b2+(i*bSpan)/len);
rtTmp.InflateRect(1,1,1,1);
CPen pen(PS_SOLID,2,clr);
dcMem.SelectObject(&pen);
dcMem.Ellipse(&rtTmp);
}
//将内存的数据一次性贴到设备DC中
pDC->BitBlt(rt.left,rt.top,rt.Width(),rt.Height(),&dcMem,0,0,SRCCOPY);
bmp.DeleteObject();
dcMem.DeleteDC();
}
代码和前面的都很相似,就不重复说明了。