讨论如何实现微软的画图中的直线等问题

PerfectPoint 2003-08-23 12:46:29
最近在看有关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); // 这两行实际上画了这一刻的直线

(其他部分略了)


但是这样出现了一个问题,当后来画的线在以前画的线上面移动的
时候就出现了交点也变成了反色。比如背景白色,直线黑色,那么
你会发现当你拉着线的一头在其他直线上面移动的时候,交点变成
了白色。当然你可以在鼠标的左键释放的函数里把交点给改过来。
但是总归不太好吧。比如微软的画图程序,当你拉着线的一端移动
时候,和其他线的交点不会改变。

不知道有没有人看过这本书,或是自己做过这样的程序,能够很好
的处理交点问题。请回帖。
...全文
113 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
hellolwl 2003-08-24
  • 打赏
  • 举报
回复
这个问题我也是不久前发现的,画图板不是用这种方法做的,是用双缓冲技术实现的,即先在内存位图中画,再BitBlt到屏幕DC上,现在我在我程序中也是这样做的:
CDC* pDC = GetDC();
CDC dcMem;
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC,300,300);
dcMem.CreateCompatibleDC(pDC);
CBitmap *pOld = dcMem.SelectObject(&bitmap);

dcMem.FillRect(CRect(0,0,300,300),(CBrush *)dcMem.SelectStockObject(WHITE_BRUSH));//画白色背景
//此处进行你想要的绘图操作
pDC->BitBlt(0,0,300,300,&dcMem,0,0,SRCCOPY);
bitmap.DeleteObject();
ReleaseDC(pDC);
zhouyong0371 2003-08-23
  • 打赏
  • 举报
回复
你那样做交点一定会被反色的,微软的画图程序交点不会改变是因为它没有用
CDC::SetROP2(R2_NOT);
你给出的例子是让你知道,CDC::SetROP2(R2_NOT);之后再次画那条直线,会清除原有直线,但不是让你做画图程序。画图程序也没有这样做。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧