求助,要实现不规则区域内的渐变,而且代码要在Windows CE系统下运行,所以不能用GradientFill()函数,该怎么办帮帮忙 求助,要实现不规则区域内的渐变,而且代码要在Windows CE系统下运行,所以不能用GradientFill()函数,该怎么办帮帮忙,我开始是想画n个颜色逐渐变化的矩形,最大一个该区域等宽,然后,取出于该区域大小相等的一块,不知道该怎么办? 还要求不能逐点填充,这样太慢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 给你建议,你是在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跑起来怎么样。我也正在努力中以上仅是建议,并非完整程序,请注意 在按钮上贴图 怎样打印出宏的内容,为了调试宏是否正确 请问MSXML.DLL是否支持多线程,来者有分 请问:为什么有时候不能在其他类调用对话框类 随机数的问题,请帮忙!! 100分! 请教高手,有关列表框中添加颜色块列表项的有关问题。 这是什么错误,怎么改? 判断点在不在线上 读unicode格式的文件为什么是乱码? vc2008为什么m_pRecordset->RecordCount转换成字符串返回的数特别大 有谁能帮我编译dvdx?急用!! 对话框的DoModal()调用失败,
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跑起来怎么样。我也正在努力中以上仅是建议,并非完整程序,请注意