一、建立工程
1、建立单文档的MFC标准工程
2、新建资源transcontrol,并且为其映射类
3、在mainfrm类中添加窗口分割条,重定义OnCreateClient函数
4、在view中,为WM_SIZE映射函数
二、设计交互界面
程序的交互界面
使用工具箱中的Group Box 与 Radio Box
Group Box:使用注意:调节tab按键的顺序,group box 只是逻辑分组,所以一定要调节tab顺序
Radio Box: GetCheckedRadioButton(IDC_START,IDC_END);获得选择的条目
三、算法学习与实现
1、逐点扫描算法
原理很简单,逐点判断每一个像素是否在多边形内部,如果在这填充;
代码如下:
void CcgGJFillView::Draw_Algorithm_everyPoint(CDC* pDC,COLORREF rgb)
{
CPoint testPoint ;
for (testPoint.x = polyRect.minX; testPoint.x < polyRect.maxX; testPoint.x++)
for (testPoint.y = polyRect.minY; testPoint.y < polyRect.maxY; testPoint.y++)
{
if (PointInPolygon(m_pNumbersONE, m_pAccord, testPoint))
SetPixel(m_pDC->m_hDC,testPoint.x, testPoint.y,rgb);
}
}
2、种子算法(只留有根据点的颜色判断的程序)
基本思想很简单,2个思路
思路一:根据点的位置:
出栈栈顶点,判断当前点是否在图形内部,若在且没有被处理,则处理(即涂色);处理完当前点后在处理四周的点
思路二:根据点的颜色:
出栈栈顶点,判断当前点的颜色是否可以涂色(不是边界颜色,并且未被涂色),若可涂色,则处理(即涂色);处理完当前点后在处理四周的点
注意点:虽然是递归的思想,但是Windows给递归函数分配栈较小,此处应该用栈模拟函数递归;即省时间又省空间
2.1、四连通种子填充算法
void seed44(CPoint seed,COLORREF fill,COLORREF black,COLORREF white,CDC* pDC,BoxRect_t polyRect1,BOOL drawWithA)
{