模拟PS的魔术棒的功能,先创建一个区域,然后用一定的刷子绘制这个 区域,
创建区域用了类似下面的代码(当然有点不同),这个过程到是很快,但是后来用frameRGN绘制这个区域的时间要比计算这个区域的时间还要长,大家看有什么好的办法啊 !
void CToolRgnSameColor::CreateRgn(CDC* pDC)
{
    COLORREF color = pDC->GetPixel(m_StartPoint);
    //创建总的窗体区域,初始region为0
    m_Rgn.CreateRectRgn(0, 0, 0, 0);
  CRgn rgnTemp; //保存临时region
    int y;
    for(y = 0; y <= m_pDoc->GetHeight(); y++)
    {
              int iX = 0;
        do
        {
            //跳过透明色找到下一个非透明色的点.
            while (iX <= m_pDoc->GetWidth() && pDC->GetPixel(iX, y) != color)
                iX++;
            //记住这个起始点
            int iLeftX = iX;            //寻找下个透明色的点
            while (iX <= m_pDoc->GetWidth() && pDC->GetPixel(iX, y) == color)
                ++iX;            //创建一个包含起点与重点间高为1像素的临时“region”
            rgnTemp.CreateRectRgn(iLeftX, y, iX, y + 1);            //合并到主"region".
            m_Rgn.CombineRgn(&m_Rgn, &rgnTemp, RGN_OR);            //删除临时"region",否则下次创建时和出错
            rgnTemp.DeleteObject();
        } while(iX < m_pDoc->GetWidth());
    }
}

解决方案 »

  1.   

    我想你这个CreateRgn函数效率已经非常低了,应该直接读取位图数据而不是通过GetPixel来获取颜色值。
    不知道你指的是不是CDC::FrameRgn,应该不会比你这个函数效率低,除非超大超复杂的区域。最好贴出代码来看看。
      

  2.   

    我实际的不是用的GetPixel的,用的是DIB的,修改后的上面这个函数速度还可以,一般0.5秒(1024*768),但是对于复杂选区,CDC::FrameRgn执行的时间甚至五六秒.
      

  3.   

    就是用类似的代码得到区域的句柄,然后直接调用FrameRgn函数的,t=GetTickCount;
    FrameRgn .......
    TimeUse=GetTickCount-t;这个TimeUse就是这个函数执行所需要的时间啊,对于一些形状比较简单的,这个速度还可以,如果选区很复杂,就难以胜任了/
      

  4.   

    这里的问题是和我一样的,看样子是FrameRGN这个函数的问题了http://topic.csdn.net/t/20050708/15/4131893.html