模拟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());
}
}
创建区域用了类似下面的代码(当然有点不同),这个过程到是很快,但是后来用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());
}
}
不知道你指的是不是CDC::FrameRgn,应该不会比你这个函数效率低,除非超大超复杂的区域。最好贴出代码来看看。
FrameRgn .......
TimeUse=GetTickCount-t;这个TimeUse就是这个函数执行所需要的时间啊,对于一些形状比较简单的,这个速度还可以,如果选区很复杂,就难以胜任了/