我用鼠标在CDC上画了任意的图形,其中有一些是闭合的,如何发现并且填充这些闭合曲线的内部呢?实现如widows画图程序那样的效果!我用的是递归的方法(以鼠标点击处为开始点,对周围屏幕上的每一个点进行递归),对于较小的图形还可以应付,大的图形速度很慢,而且还经常非法操作!不知是什么原因?!!另外fillinrgn这个函数怎么用?还望各位高手给于回答!!!先谢谢了~~~~~~~~~~~~~~~~~~~~~~~~~~~~~如果你太忙,就提供个大概的算法就行了。

解决方案 »

  1.   

    给你点建议
    你可以显建立个区域crng再填充该区域。
    CDC里有这样的函数
      

  2.   

    谢谢wind_xu,可是如何建立区域crng呢?它是由一连串点组成的吗?
      

  3.   

    可以这样:
    先用填充色填充背景,然后画上你的图形,然后再用floodfill在外面开始填充白色,这样如果被你的图形围起来的区域还是保持着填充色,但是也有一点可能实现起来有些困难:就是FloodFill(x,y,color)中的x,y不好确定,必须保证该点在你的图形外。
      

  4.   

    谢谢xiner,我的问题在于图形是先画好的,比如一个花朵之类的图象,还没有着色,然后鼠标在里面一点,它就充满了想要的颜色.
      

  5.   

    当然花朵内部是白色的!rgb(255,255,255)
      

  6.   

    那你知道填充的基点,就可以用FloodFill这个函数啦。
      

  7.   

    在OnLButtonDown()函数里
    CDC pDC=GetDC();
    pDC->FloodFill(point.x,point.y,RGB(255,255,255));
    ReleaseDC(pDC);
      

  8.   

    不行呀,我用鼠标的点击点为基点,然后调用这个函数,可是一切变白了呀!在onlbuttonup中响应的.
    CClientDC dc(this);
    dc.FloodFill(point.x,point.y,RGB(255,0,0));
      

  9.   

    FloodFill的最后一个参数用来指定边界的颜色值,如果你的边界是黑色的,这里就用RGB(0,0,00).
      

  10.   

    对,我太激动了,连画刷和边界都忘了定义,可是现在还有一个问题,如果用两种不同颜色的画笔构成一个封闭区域,那么如何填充呢?用FloodFill好象不行也.
      

  11.   

    用ExtFloodFill吧,最后一个参数指定为FLOODFILLSURFACE,crColor指定连续的要被填充的颜色块,比如你花瓣的颜色块是白色的,可以这样,
    dc.ExtFloodFill(point.x,point.y,RGB(255,255,255),FLOODFILLSURFACE);
    好了,今天就交流到这里了,我要下班了。
      

  12.   

    成功了,谢谢xiner!!!我很奇怪这个函数的算法,填充速度好快呀,xiner,你了解它的原理吗?我现在在做一个图形方面的软件,没人教,全靠自学,以后肯定还会在这个论坛上提问的,还请您赐教.另外哪里有bmp与gif,jpg格式转换的资料,现在有一些提供的SDK是要用dll的,我不想用它,有没有其它的办法,还有就是哪里有图形算法方面的好的资料,还请你指点一下.
    我的email是[email protected]
    加分给您,请查收. 还有ACuke