绘制角度可变的颜色渐变效果(2)
三种颜色比较复杂,也是用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;
}
Tag: gdi ,颜色渐变
文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。