我想知道渐进色的实现算法,而不是Windows封装好的API
GradientFill,请各位赐教。

解决方案 »

  1.   

    for i:=0 to 255 do
      color:=i+$FFFF00;
    for i:=0 to 255 do
      color:=i+$FF00FF;
    for i:=0 to 255 do
      color:=i+$00FFFF;//or  color:=i+yourdefinedcolor
      

  2.   

    这是vckbase里一个例子程序中的一段
    void CGradientProgressCtrl::DrawGradient(CPaintDC *pDC, const RECT &rectClient, const int &nMaxWidth)
    {
    RECT rectFill; //显示区域
    float fStep; //每一步的幅宽
    CBrush brush; //显示的颜色画刷
    CMemDC memDC(pDC); int r,g,b;
    float rStep,gStep,bStep;
    //得到不同颜色并相减,返回颜色之间的最大差值
    r=(GetRValue(m_clrEnd)-GetRValue(m_clrStart));
    g=(GetGValue(m_clrEnd)-GetGValue(m_clrStart));
    b=(GetBValue(m_clrEnd)-GetBValue(m_clrStart));
    //使进程条显示的总数 等于最大的颜色差值
    int nSteps=max(abs(r),max(abs(g),abs(b)));
    //确定每一颜色填充多大的矩形区域
    fStep=(float)rectClient.right/(float)nSteps;
    //设置每一颜色填充的步数
    rStep=r/(float)nSteps;
    gStep=g/(float)nSteps;
    bStep=b/(float)nSteps; r=GetRValue(m_clrStart);
    g=GetGValue(m_clrStart);
    b=GetBValue(m_clrStart);
    //绘制颜色渐变的进程条
    for(int iOnBand=0;iOnBand<nSteps;iOnBand++)
    {
    ::SetRect(&rectFill,
    //以下为填充矩形区域的左上角x,y和右下角x,y
    (int)(iOnBand*fStep),
    0,
    (int)((iOnBand+1)*fStep),
    rectClient.bottom+1);

    VERIFY(brush.CreateSolidBrush(RGB(r+rStep*iOnBand,g+gStep*iOnBand,b+bStep*iOnBand)));
    memDC.FillRect(&rectFill,&brush);
    VERIFY(brush.DeleteObject());
    //在结束绘制之前,使用背景色填充乘下的的客户区域
    if(rectFill.right>nMaxWidth)
    {
    ::SetRect(&rectFill,rectFill.right,0,rectClient.right,rectClient.bottom);
    VERIFY(brush.CreateSolidBrush(m_clrBkGround));
    memDC.FillRect(&rectFill,&brush);
    VERIFY(brush.DeleteObject());
    return;
    }
    }
    }
      

  3.   

    写错了
    for i:=0 to 255 do
      color:=i+$FFFF00;
    for i:=0 to 255 do
      color:=i*$100+$FF00FF;
    for i:=0 to 255 do
      color:=i*$10000+$00FFFF;//or  color:=i+yourdefinedcolor
      

  4.   


    int r,g,b;[0,255]
    COLORREF cf=RGB(r,g,b)