我写了一段代码,用来渐变色填充对话框的背景,但是没有实现渐变效果,各位大大帮忙看看问题出在哪?
void CTestDlg::DrawGridentBG(CDC *pDC, CRect rect, COLORREF colBegin, COLORREF colEnd)
{
int nRedX = GetRValue(colBegin);
int nGreenX = GetGValue(colBegin);
int nBlueX = GetBValue(colBegin); int nRedRange = GetRValue(colEnd) - GetRValue(colBegin);
int nGreenRange = GetGValue(colEnd) - GetGValue(colBegin);
int nBlueRange = GetBValue(colEnd) - GetBValue(colBegin); double nRedRate = nRedRange/rect.Height();
double nGreenRate = nGreenRange/rect.Height();
double nBlueRate = nBlueRange/rect.Height(); int nRedValue;
int nGreenValue;
int nBlueValue; for (int nIndex=0; nIndex<rect.Height(); nIndex++)
{
nRedValue = nRedX + nRedRate*nIndex;
nGreenValue = nGreenX + nGreenRate*nIndex;
nBlueValue = nBlueX + nBlueRate*nIndex; CRect rectTemp;
rectTemp.SetRect(rect.left, rect.top+nIndex, rect.right, rect.top+nIndex+1); CBrush brush;
brush.CreateSolidBrush(RGB(nRedValue, nGreenValue, nBlueValue));
pDC->FillRect(&rectTemp, &brush);
brush.DeleteObject();
}
}
void CTestDlg::DrawGridentBG(CDC *pDC, CRect rect, COLORREF colBegin, COLORREF colEnd)
{
int nRedX = GetRValue(colBegin);
int nGreenX = GetGValue(colBegin);
int nBlueX = GetBValue(colBegin); int nRedRange = GetRValue(colEnd) - GetRValue(colBegin);
int nGreenRange = GetGValue(colEnd) - GetGValue(colBegin);
int nBlueRange = GetBValue(colEnd) - GetBValue(colBegin); double nRedRate = nRedRange/rect.Height();
double nGreenRate = nGreenRange/rect.Height();
double nBlueRate = nBlueRange/rect.Height(); int nRedValue;
int nGreenValue;
int nBlueValue; for (int nIndex=0; nIndex<rect.Height(); nIndex++)
{
nRedValue = nRedX + nRedRate*nIndex;
nGreenValue = nGreenX + nGreenRate*nIndex;
nBlueValue = nBlueX + nBlueRate*nIndex; CRect rectTemp;
rectTemp.SetRect(rect.left, rect.top+nIndex, rect.right, rect.top+nIndex+1); CBrush brush;
brush.CreateSolidBrush(RGB(nRedValue, nGreenValue, nBlueValue));
pDC->FillRect(&rectTemp, &brush);
brush.DeleteObject();
}
}
double nGreenRate = nGreenRange/rect.Height();
double nBlueRate = nBlueRange/rect.Height(); 建议改为double nRedRate = (double)nRedRange/rect.Height();
double nGreenRate = (double)nGreenRange/rect.Height();
double nBlueRate = (double)nBlueRange/rect.Height();
pDC->FillRect(&rectTemp, &brush); 你这个区域是一个像素高的矩形,而举行填充的时候,最右边和最下边的那条线(1像素宽)是不填充的。改成画线吧,反正是一个像素宽