一些常规形几何形状的绘制和效果填充(二)
我封装了这两个函数,使它的使用更容易:
1.绘制颜色渐变三角形,P1, P2, P3为三角形三个点,cP1, cP2, cP3为三角形三点所指定的颜色。
void DrawTriangle(CDC *pDC,POINT P1,POINT P2,POINT P3,
COLORREF cP1,COLORREF cP2,COLORREF cP3)
{
TRIVERTEX vert [4] ;
vert [0] .x = P1.x;
vert [0] .y = P1.y;
vert [0].Red=GetRValue(cP1)<<8;
vert [0].Green=GetGValue(cP1)<<8;
vert [0].Blue=GetBValue(cP1)<<8;
vert [0] .Alpha = 0;
vert [1] .x = P2.x;
vert [1] .y = P2.y;
vert [1].Red=GetRValue(cP2)<<8;
vert [1].Green=GetGValue(cP2)<<8;
vert [1].Blue=GetBValue(cP2)<<8;
vert [1] .Alpha = 0;
vert [2] .x = P3.x;
vert [2] .y = P3.y;
vert [2].Red=GetRValue(cP3)<<8;
vert [2].Green=GetGValue(cP3)<<8;
vert [2].Blue=GetBValue(cP3)<<8;
vert [2] .Alpha = 0;
_GRADIENT_TRIANGLE gTRi[1];
gTRi[0].Vertex1 = 0;
gTRi[0].Vertex2 = 1;
gTRi[0].Vertex3 = 2;
handle_GradientFill(pDC->GetSafeHdc(),vert,4,&gTRi,1,GRADIENT_FILL_TRIANGLE);
}
2.绘制矩形,颜色渐变,其中falg指定渐变形式:
0:左右渐变。
1:上下渐变
3:中心到左右两边渐变
4:中心到上下渐变
5:中心到四周实现渐变
void_DrawRect(CDC *pDC,CRect rect,COLORREF
nShadowBeginColor,COLORREF nShadowEndColor,int falg )
{
TRIVERTEX rcVertex[2];
rcVertex[0].x=rect.left;
rcVertex[0].y=rect.top;
rcVertex[0].Red=GetRValue(nShadowBeginColor)<<8;
rcVertex[0].Green=GetGValue(nShadowBeginColor)<<8;
rcVertex[0].Blue=GetBValue(nShadowBeginColor)<<8;
rcVertex[0].Alpha=0x0000;
rcVertex[1].x=rect.right;
rcVertex[1].y=rect.bottom;
rcVertex[1].Red=GetRValue(nShadowEndColor)<<8;
rcVertex[1].Green=GetGValue(nShadowEndColor)<<8;
rcVertex[1].Blue=GetBValue(nShadowEndColor)<<8;
rcVertex[1].Alpha=0;
GRADIENT_RECT rect1;
rect1.UpperLeft=0;
rect1.LowerRight=1;
if (falg==0)
handle_GradientFill( pDC->GetSafeHdc(),rcVertex,2,&rect1,1,
GRADIENT_FILL_RECT_H);
if (falg==1)
handle_GradientFill( pDC->GetSafeHdc(),rcVertex,2,&rect1,1,
GRADIENT_FILL_RECT_V );
if (falg==3)
{
rcVertex[0].x=rect.left;
rcVertex[0].y=rect.top;
rcVertex[0].Red=GetRValue(nShadowBeginColor)<<8;
rcVertex[0].Green=GetGValue(nShadowBeginColor)<<8;
rcVertex[0].Blue=GetBValue(nShadowBeginColor)<<8;
rcVertex[0].Alpha=0x0000;
rcVertex[1].x=rect.right-rect.Width()/2;
rcVertex[1].y=rect.bottom;
rcVertex[1].Red=GetRValue(nShadowEndColor)<<8;
rcVertex[1].Green=GetGValue(nShadowEndColor)<<8;
rcVertex[1].Blue=GetBValue(nShadowEndColor)<<8;
rcVertex[1].Alpha=0;
handle_GradientFill(pDC->GetSafeHdc(),rcVertex,2,&rect1,1,
GRADIENT_FILL_RECT_H);
rcVertex[0].x=rect.left+rect.Width()/2-1;
rcVertex[0].y=rect.top;
rcVertex[0].Red=GetRValue(nShadowEndColor)<<8;
rcVertex[0].Green=GetGValue(nShadowEndColor)<<8;
rcVertex[0].Blue=GetBValue(nShadowEndColor)<<8;
rcVertex[0].Alpha=0x0000;
rcVertex[1].x=rect.right;
rcVertex[1].y=rect.bottom;
rcVertex[1].Red=GetRValue(nShadowBeginColor)<<8;
rcVertex[1].Green=GetGValue(nShadowBeginColor)<<8;
rcVertex[1].Blue=GetBValue(nShadowBeginColor)<<8;
rcVertex[1].Alpha=0;
handle_GradientFill( pDC->GetSafeHdc(),rcVertex,2,&rect1,1,
GRADIENT_FILL_RECT_H);
}
if (falg==4)
{
rcVertex[0].x=rect.left;
rcVertex[0].y=rect.top;
rcVertex[0].Red=GetRValue(nShadowBeginColor)<<8;
rcVertex[0].Green=GetGValue(nShadowBeginColor)<<8;
rcVertex[0].Blue=GetBValue(nShadowBeginColor)<<8;
rcVertex[0].Alpha=0x0000;
rcVertex[1].x=rect.right;
rcVertex[1].y=rect.bottom-rect.Height()/2;
rcVertex[1].Red=GetRValue(nShadowEndColor)<<8;
rcVertex[1].Green=GetGValue(nShadowEndColor)<<8;
rcVertex[1].Blue=GetBValue(nShadowEndColor)<<8;
rcVertex[1].Alpha=0;
handle_GradientFill(pDC->GetSafeHdc(),rcVertex,2,&rect1,1,
GRADIENT_FILL_RECT_V);
rcVertex[0].x=rect.left;
rcVertex[0].y=rect.top-1+rect.Height()/2;
rcVertex[0].Red=GetRValue(nShadowEndColor)<<8;
rcVertex[0].Green=GetGValue(nShadowEndColor)<<8;
rcVertex[0].Blue=GetBValue(nShadowEndColor)<<8;
rcVertex[0].Alpha=0x0000;
rcVertex[1].x=rect.right;
rcVertex[1].y=rect.bottom;
rcVertex[1].Red=GetRValue(nShadowBeginColor)<<8;
rcVertex[1].Green=GetGValue(nShadowBeginColor)<<8;
rcVertex[1].Blue=GetBValue(nShadowBeginColor)<<8;
rcVertex[1].Alpha=0;
handle_GradientFill( pDC->GetSafeHdc(),rcVertex,2,&rect1,1,
GRADIENT_FILL_RECT_V);
}
if (falg==MIDDLE_TO_SIDE)
{
POINT p1,p2,p3,p4,p;
p1.x=rect.left;p1.y=rect.bottom;
p2.x=rect.right;p2.y=rect.bottom;
p3.x=rect.right;p3.y=rect.top;
p4.x=rect.left;p4.y=rect.top;
p=rect.CenterPoint();
_DrawTriangle (pDC,p1,p2,p,nShadowEndColor,nShadowEndColor,nShadowBeginColor);
DrawTriangle(pDC,p2,p3,p,nShadowEndColor,nShadowEndColor,nShadowBeginColor);
DrawTriangle(pDC,p3,p4,p,nShadowEndColor,nShadowEndColor,nShadowBeginColor);
DrawTriangle(pDC,p4,p1,p,nShadowEndColor,nShadowEndColor,nShadowBeginColor);
}
}
填充效果如下: