void DrawGradientFill_H3D(CDC* pDC, CRect* prc, COLORREF crStart, COLORREF crMid /*= RGB(255, 255, 255)*/)
{
int iWidth = prc->Width();
int iR = GetRValue(crStart);
int iG = GetGValue(crStart);
int iB = GetBValue(crStart);
int ieB = GetBValue(crMid);
int ieG = GetGValue(crMid);
int ieR = GetRValue(crMid);
int iSegments = iWidth / 2;
int iDiffR = (ieR - iR);
int iDiffG = (ieG - iG);
int iDiffB = (ieB - iB);
int idR = 256 * iDiffR / iSegments;
int idG = 256 * iDiffG / iSegments;
int idB = 256 * iDiffB / iSegments;
iR *= 256;
iG *= 256;
iB *= 256;
ieR *= 256;
ieG *= 256;
ieB *= 256;
int iLeft = prc->left;
int i = 0;
for (i = 0; i < iSegments; i++, iR += idR, iG += idG, iB += idB)
{
pDC->FillSolidRect(CRect(iLeft, prc->top, iLeft + 1, prc->bottom), RGB(iR / 256, iG / 256, iB / 256));
iLeft++;
}
for (i = iSegments; i < iWidth; i++, iR -= idR, iG -= idG, iB -= idB)
{
pDC->FillSolidRect(CRect(iLeft, prc->top, iLeft + 1, prc->bottom), RGB(iR / 256, iG / 256, iB / 256));
iLeft++;
}
}
void DrawGradientFill_V3D(CDC* pDC, CRect* prc, COLORREF crStart, COLORREF crMid /*= RGB(255, 255, 255)*/)
{
int iHeight = prc->Height();
int iR = GetRValue(crStart);
int iG = GetGValue(crStart);
int iB = GetBValue(crStart);
int ieB = GetBValue(crMid);
int ieG = GetGValue(crMid);
int ieR = GetRValue(crMid);
int iSegments = iHeight / 2;
int iDiffR = (ieR - iR);
int iDiffG = (ieG - iG);
int iDiffB = (ieB - iB);
int idR = 256 * iDiffR / iSegments;
int idG = 256 * iDiffG / iSegments;
int idB = 256 * iDiffB / iSegments;
iR *= 256;
iG *= 256;
iB *= 256;
ieR *= 256;
ieG *= 256;
ieB *= 256;
int iTop = prc->top;
int i = 0;
for (i = 0; i < iSegments; i++, iR += idR, iG += idG, iB += idB)
{
pDC->FillSolidRect(CRect(prc->left, iTop, prc->right, iTop + 1), RGB(iR / 256, iG / 256, iB / 256));
iTop++;
}
for (i = iSegments; i < iHeight; i++, iR -= idR, iG -= idG, iB -= idB)
{
pDC->FillSolidRect(CRect(prc->left, iTop, prc->right, iTop + 1), RGB(iR / 256, iG / 256, iB / 256));
iTop++;
}
}
void DrawGradientFill_H(CDC* pDC, CRect* prc, COLORREF crStart, COLORREF crEnd)
{
int iWidth = prc->Width();
int iR = GetRValue(crStart);
int iG = GetGValue(crStart);
int iB = GetBValue(crStart);
int ieB = GetBValue(crEnd);
int ieG = GetGValue(crEnd);
int ieR = GetRValue(crEnd);
int iSegments = iWidth;
int iDiffR = (ieR - iR);
int iDiffG = (ieG - iG);
int iDiffB = (ieB - iB);
int idR = 256 * iDiffR / iSegments;
int idG = 256 * iDiffG / iSegments;
int idB = 256 * iDiffB / iSegments;
iR *= 256;
iG *= 256;
iB *= 256;
ieR *= 256;
ieG *= 256;
ieB *= 256;
int iLeft = prc->left;
for (int i = 0; i < iSegments; i++, iR += idR, iG += idG, iB += idB)
{
pDC->FillSolidRect(CRect(iLeft, prc->top, iLeft + 1, prc->bottom), RGB(iR / 256, iG / 256, iB / 256));
iLeft++;
}
}
void DrawGradientFill_V(CDC* pDC, CRect* prc, COLORREF crStart, COLORREF crEnd)
{
int iHeight = prc->Height();
int iR = GetRValue(crStart);
int iG = GetGValue(crStart);
int iB = GetBValue(crStart);
int ieB = GetBValue(crEnd);
int ieG = GetGValue(crEnd);
int ieR = GetRValue(crEnd);
int iSegments = iHeight;
int iDiffR = (ieR - iR);
int iDiffG = (ieG - iG);
int iDiffB = (ieB - iB);
int idR = 256 * iDiffR / iSegments;
int idG = 256 * iDiffG / iSegments;
int idB = 256 * iDiffB / iSegments;
iR *= 256;
iG *= 256;
iB *= 256;
ieR *= 256;
ieG *= 256;
ieB *= 256;
int iTop = prc->top;
for (int i = 0; i < iSegments; i++, iR += idR, iG += idG, iB += idB)
{
pDC->FillSolidRect(CRect(prc->left, iTop, prc->right, iTop + 1), RGB(iR / 256, iG / 256, iB / 256));
iTop++;
}
}
渐变色填充
最新推荐文章于 2023-04-01 11:20:44 发布