我写了一段代码,用来渐变色填充对话框的背景,但是没有实现渐变效果,各位大大帮忙看看问题出在哪?
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();
}
}

解决方案 »

  1.   

    如果有问题应该在这double nRedRate =  nRedRange/rect.Height(); 
    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(); 
      

  2.   

    问题的关键在这里
    pDC->FillRect(&rectTemp, &brush); 你这个区域是一个像素高的矩形,而举行填充的时候,最右边和最下边的那条线(1像素宽)是不填充的。改成画线吧,反正是一个像素宽
      

  3.   

    这样改也行rectTemp.SetRect(rect.left, rect.top+nIndex, rect.right, rect.top+nIndex+2);