2014-11-23 42 views
-1

我正在编写一个像Paint一样的MFC应用程序。 我画两条线(按住并移动鼠标):如何在MFC中删除行

第1步:处理WM_LBUTTONDOWN并获取startPoint。

步骤2:使用LineTo()函数处理WM_MOUSEMOVE(使用MK_LBUTTON)来获取endPoint,并从startPoint绘制一条线到endPoint。

但是在步骤2中,它在接收WM_MOUSEMOVE时绘制一行,因此创建了太多行。我想在这一步中删除旧线并绘制新线。 (接收WM_LBUTTONUP时只绘制一条线)。 你能帮我吗。谢谢大家。对不起,如果我的英语太糟糕了。

回答

0

在WM_MOUSEMOVE中设置endPoint变量但不绘制。而是调用Invalidate。这将导致擦除和重绘。所以在OnPaint/OnDraw中从startPoint到endPoint画一条线。

+0

感谢您的回答。我是MFC新手。如果我调用Invalidate(),OnPaint()会清除客户区中的所有内容?但我只想删除以前的WM_MOUSEMOVE消息中的旧行并绘制当前行。你能帮我吗? – 2014-11-24 07:10:33

+0

如果你想控制线的颜色和宽度,那么它必须按照我所描述的完成。还有另一种使用XOR笔的方式,通常用于让用户拖动橡皮线或矩形。 XOR笔可以通过重画来擦除。要研究这种方法,请在MSDN中查找SetROP2。 – 2014-11-24 15:04:52

+0

我有一些小问题,我需要你的帮助。你可以给我雅虎ID或其他我可以和你聊天的东西吗?谢谢。 – 2014-11-26 12:03:10

1

在WM_LBUTTONDOWN中,将一个新的成员变量m_pMouseObject设置为NULL。

在WM_MOUSEMOVE中,如果m_pMouseObject == NULL,则将m_pMouseObject设置为新创建的线对象,否则在鼠标移动时继续修改m_pMouseObject。

在WM_LBUTTONUP中,从m_pMouseObject创建最终的行对象并设置m_pMouseObject = NULL。

+0

感谢您的回答。但是我不知道我是否“来自m_pMouseObject的明确行对象”(调用Invalidate()),它将删除我在客户区绘制的所有形状,不是吗?我是MFC新手,我需要你的帮助。非常感谢你。 – 2014-11-24 07:14:02

+0

如果您遵循标准绘画方式(当您收到WM_PAINT而不是鼠标移动时),invalidate将正确绘制对象 - 您还需要在鼠标移动过程中使对象的矩形失效 – 2014-11-24 07:32:38