【问题标题】:Paint red lines on rulers indicating the mouse position (MFC/Direct2D)在指示鼠标位置的标尺上绘制红线 (MFC/Direct2D)
【发布时间】:2015-08-10 10:16:00
【问题描述】:

我想实现红线移动哦 H/V 标尺,类似于我在 windows 画笔 (8.1) 中看到的指示当前鼠标位置。看例子(560处的红线):

最好的方法是什么。 Direct2D动画?层?还有其他简单的技巧吗?这里的事情是有效地做到这一点,而无需在鼠标移动时重新绘制整个区域。

我目前使用 MFC/direct2d,所以我在视图内用字段和标尺绘制自己的区域,因此我可以完全控制这里的图形。

【问题讨论】:

  • 每当鼠标移动时,只需invalidate您之前渲染标记的矩形即可。
  • 另外 1. 我将如何返回标记之前的内容?我应该重新粉刷所有东西还是每次都记住以前的东西?我如何将重绘消息传递给 onDraw2d,为什么会出现此消息(MouseHover),以便它知道它应该移动标记而不是重绘它?
  • 你不需要记住任何东西。您只需使窗口的适当部分无效,然后在下一次渲染过程中(当应用程序接收到WM_PAiNT 消息时),将渲染内容。这将恢复以前的内容。
  • 我已附上上图,方便讨论。假设我画了上面显示的图片(标尺和网格)。现在鼠标已从 560 X 坐标移动,我需要 1)擦除前一行 - 请注意,我必须记住画线之前的内容,以便正确恢复标尺图片 2)在新鼠标位置绘制红线。
  • 你是怎么画的? Direct2D 还是 GDI?

标签: graphics mfc directx direct2d


【解决方案1】:

有很多方法可以解决这个问题。最简单的方法是依靠您的OnPaint 函数在基于成员变量的位置绘制线条。在您的OnMouseMove 处理程序中,根据保存的变量在行的当前位置调用InvalidateRect,更新变量,然后再次调用InvalidateRect 以获得新的行位置。

CPaintDC 构造函数中生成的BeginPaint 调用将根据您提供的无效矩形设置剪辑区域。即使您的OnPaint 尝试绘制整个窗口,也只会重绘那些已失效的部分。如果这样做效率太低,您可以将标尺缓存在位图中,并使用GetClipBox 来确定位图的哪个部分要blit 到屏幕上。

【讨论】:

  • 我目前只是在鼠标移动时重新绘制整个图片,这在我看来是无效的。问题是我对图形重绘优化感到困惑,例如在重绘中,我不仅应该弄清楚鼠标移动了,而且图片没有滚动缩小(在我的应用程序中都支持),并根据这些事实进行重绘,并且那么如何只重绘无效区域。顺便说一句,任何有用的资源都将受到高度赞赏。
  • @Boris:您是否收集到分析数据表明您的方法太慢了?您还应该了解 Windows 应用程序执行其绘制的标准方式,更一般地,了解系统基于事件的性质。
  • @Boris,IInspectable 是对的 - 每次都重新绘制整个东西似乎很浪费,但它不太重要。现代处理器的速度非常快!这一切都假设标尺是您要重绘的唯一东西,但这应该非常简单,可以根据剪切矩形来确保。我不知道描述该过程的任何资源。
猜你喜欢
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 2013-04-14
  • 1970-01-01
  • 2012-06-05
相关资源
最近更新 更多