当前位置:C++技术网 > 精选软件 > GDI环状立体特效,纯代码实现玉镯特效

GDI环状立体特效,纯代码实现玉镯特效

更新时间:2016-11-07 21:42:31浏览次数:1+次

    玉镯等手环,晶莹剔透,非常漂亮。然而我们现在使用纯代码方式实现这个手镯。

    下面是效果图:

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(); 
}
    代码和前面的都很相似,就不重复说明了。