如何在 MFC 中删除一行

Posted

技术标签:

【中文标题】如何在 MFC 中删除一行【英文标题】:How to delete a Line in MFC 【发布时间】:2014-11-23 10:39:07 【问题描述】:

我正在编写像 Paint 这样的 MFC 应用程序。 我分两步画一条线(按住并移动鼠标):

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

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

但是在第2步中,收到WM_MOUSEMOVE时画了一条线,所以创建了太多的线。我想在这一步删除旧线并绘制新线。 (接收 WM_LBUTTONUP 时只画一条线)。 你能帮我吗。谢谢大家。对不起,如果我的英语这么差。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

感谢您的回答。但我不知道如果我“来自 m_pMouseObject 的明确线对象”(调用 Invalidate()),它会擦除​​我在客户区绘制的所有形状,不是吗?我是 MFC 的新手,我需要你的帮助。非常感谢。 如果您遵循标准的绘制方式(当您收到 WM_PAINT 而不是鼠标移动时),invalidate 将正确绘制对象 - 您还需要在鼠标移动期间使对象的矩形无效跨度> 【参考方案2】:

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

【讨论】:

感谢您的回答。我是 MFC 的新手。如果我调用 Invalidate(),OnPaint() 将擦除客户区中的所有内容?但我只想擦除之前 WM_MOUSEMOVE 消息中的旧线并绘制当前线。你能帮帮我吗? 如果你想控制线条的颜色和宽度,那么它必须按照我的描述来完成。还有另一种使用异或笔的方法,经常用于让用户拖动橡皮线或矩形。 XOR 笔可以通过重绘来擦除。要研究这种方法,请在 MSDN 中查找 SetROP2。 我有一些小问题,需要您的帮助。你能给我雅虎ID或其他我可以和你实时聊天的东西吗?谢谢。

以上是关于如何在 MFC 中删除一行的主要内容,如果未能解决你的问题,请参考以下文章

VC++、MFC开发中如何通过鼠标点击控制列表选择一行

如何在 MFC CDialog 类中自动删除事件处理程序?

如何在vs2008 MFC中添加、删除成员变量

如何在 MFC 中垂直同步两个列表控件

如何在 MFC 中获得多行工具提示

如何获得MFC列表框中选中的数据