求助,要实现不规则区域内的渐变,而且代码要在Windows CE系统下运行,所以不能用GradientFill()函数,该怎么办帮帮忙,我开始是想画n个颜色逐渐变化的矩形,最大一个该区域等宽,然后,取出于该区域大小相等的一块,不知道该怎么办?
 还要求不能逐点填充,这样太慢

解决方案 »

  1.   

    给你建议,你是在CE下运行,那就意味着,你采用了GDI+,同时你面临跟我一样的问题,那就是不规则区域内的填充,需要用到种子算法,我今天早上想到的基本方法;获取当前点,并设置一个矩形,开始时,这个矩形为当前点,然后再跟这个点的上下左中比较。
    Point ptcur; //当前点
    Rect  rcBound; //用于存储的矩形,使这个矩形往外扩张
    std::deque<POINT> ptUnfilled ; //开一个队列,把所有跟当前点在一个值内相近的
                                     都往这个对列里放
    Point ptpush;  //用于存储跟原点比较时接近的点
    ptUnfilled.push_back (ptCurr) ;  //将原点置于队列的尾
    while (!ptUnfilled.empty ())     //一直到用于存放ptpush点的队列为空,也就意味不用比较了
    {
      ptCurr = ptUnfilled.back() ;  //队列的尾置为当前点
      ptUnfilled.pop_back() ; // 栈顶弹出,这里队列为空
      //将矩形置为当前最大的
      if (ptcur.x < rcBound.left)   //每次检测上下左右是不是当前最大值
    rcBound.left = ptcur.x ;
      if (ptcur.x > rcBound.right)
    rcBound.right = ptcur.x ;
      if (ptcur.y < rcBound.top)
    rcBound.top = ptcur.y ;
      if (ptcur.y > rcBound.bottom)
    rcBound.bottom = ptcur.y ;
      
      //检测上边
        如果ptcur(x,y)与ptcur(x,y-1)为真就将ptcur(x,y-1)置入队列为
           ptpush.x = ptcur.x ; 
           ptpush.y = ptcur.y - 1 ;
           ptUnfilled.push_back (ptPush) ;
      //检测下边
         ......
    }
    rcBound.right ++ ;  //因为开域所以要加上一
    rcBound.bottom ++;这样得到了当前的最大域,你想怎么样填充就怎么样填充,上面还可以考虑用路径来做.
    不过算法有点点慢,因为是一个点一个点的检测,不知你的CE跑起来怎么样。我也正在努力中以上仅是建议,并非完整程序,请注意