讨论如何实现微软的画图中的直线等问题
最近在看有关gdi方面的问题,特别是看<>。发现其中有一段代码来画直线,实现了鼠标左键按下的时
候开始画线,也就是固定了一个端点;鼠标移动的时候实现了另一
个端点的移动,动态的画线;鼠标左键释放的时候端点落下,直线
固定。所有过程就像微软的画图程序一样。
书上的程序的算法的核心是:CDC::SetROP2(R2_NOT);
也就是说,记录鼠标按下的时候的鼠标位置m_ptFrom,时时刻刻记
录MouseMove的point值m_ptTo,以及前一个MouseMove的point值
m_ptFrom。在OnMouseMove函数里面:
dc.MoveTo(m_ptFrom);// 用了CDC::SetROP2(R2_NOT)反色后
dc.LineTo(m_ptTemp);// 这两行实际上擦除了前一刻的直线
dc.MoveTo(m_ptFrom);// 用了CDC::SetROP2(R2_NOT)反色后
dc.LineTo(m_ptTo); // 这两行实际上画了这一刻的直线
(其他部分略了)
但是这样出现了一个问题,当后来画的线在以前画的线上面移动的
时候就出现了交点也变成了反色。比如背景白色,直线黑色,那么
你会发现当你拉着线的一头在其他直线上面移动的时候,交点变成
了白色。当然你可以在鼠标的左键释放的函数里把交点给改过来。
但是总归不太好吧。比如微软的画图程序,当你拉着线的一端移动
时候,和其他线的交点不会改变。
不知道有没有人看过这本书,或是自己做过这样的程序,能够很好
的处理交点问题。请回帖。