绘制角度可变的颜色渐变效果(2)

分类: VC.NET   出处:iocblog整理  更新时间:2008-11-28   添加到收藏  

        三种颜色比较复杂,也是用gdi+提供的lineargradientbrush刷子,不过需要计算绘制区域的对角线长度,并按照对角线平分为三等分。

 

具体的看以下代码:

bool ctestdlg::onerasebkgnd(cdc* pdc)
{(文章来源 www.iocblog.net)
    cdialog::onerasebkgnd(pdc); 

    //  取得第一种颜色的r,g,b值
    int r1 = getrvalue(color1);
    int g1 = getgvalue(color1);
    int b1 = getbvalue(color1);

    //  取得第二种颜色的r,g,b值
    int r2 = getrvalue(color2);
    int g2 = getgvalue(color2);
    int b2 = getbvalue(color2);

    //  取得第三种颜色的r,g,b值
    int r3 = getrvalue(color3);
    int g3 = getgvalue(color3);
    int b3 = getbvalue(color3);(文章来源 www.iocblog.net)

    //  得到绘制区域
    crect rect;
    getclientrect(&rect);

    //  计算对角线长度
    int iheight = rect.height();
    int iwidth = rect.width();
    double dwdiagonal = sqrt((double)(iwidth * iwidth + iheight * iheight));

    //  三块绘制区域
    rect rectdraw(0, 0, (int)dwdiagonal, (int)dwdiagonal);
    rect rectdraw1(0, 0, (int)dwdiagonal, ((int)dwdiagonal)/2);
    rect rectdraw2(0, ((int)dwdiagonal) / 2, (int)dwdiagonal, ((int)dwdiagonal) / 2);

   //  gdi+对象
   graphics graphics(pdc->getsafehdc()); 
   gdiplus::bitmap bmp(rectdraw.width, rectdraw.height);
   graphics grtmp(&bmp);

    //  用刷子填充区域
    gdiplus::lineargradientbrush lingrbrush(rectdraw1, color(r1, g1, b1), color(r2, g2, b2), 90);
    grtmp.fillrectangle(&lingrbrush, rectdraw1);
    gdiplus::lineargradientbrush lingrbrush1(rectdraw2, color(r2, g2, b2),color(r3, g3, b3), 90);
    grtmp.fillrectangle(&lingrbrush1, rectdraw2);

    //  计算
    dwdiagonal *= 0.5;
    double dwangle = irotation * 3.1415926 / 180.0;
    double dwcosangle = cos(dwangle);
    double dwsinangle = sin(dwangle);
    double dwbeta = atan2((double)iheight, (double)iwidth);
    double dwdistance = dwdiagonal * sin(fabs(dwangle) + dwbeta);
    double xc = 0.5 * iwidth - dwdistance * dwsinangle;
    double yc = 0.5 * iheight - dwdistance * dwcosangle;
    double xc1 = 0.5 * iwidth + dwdistance * dwsinangle;
    double yc1 = 0.5 * iheight + dwdistance * dwcosangle;
    double dx = dwdiagonal * dwcosangle;
    double dy = - dwdiagonal * dwsinangle;

    //  绘制
    point ptdestinationpoints[3];
    ptdestinationpoints[0].x = (int)(xc - dx);
    ptdestinationpoints[0].y = (int)(yc - dy);
    ptdestinationpoints[1].x = (int)(xc + dx);
    ptdestinationpoints[1].y = (int)(yc + dy);
    ptdestinationpoints[2].x = (int)(xc1 - dx);
    ptdestinationpoints[2].y = (int)(yc1 - dy);
    graphics.drawimage(&bmp, ptdestinationpoints, 3);

    return true;
}

上一页 [1] [2]


Tag: gdi ,颜色渐变



文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。