【问题标题】:Smooth movement of icon displayed on a Panel面板上显示的图标平滑移动
【发布时间】:2009-11-14 01:16:14
【问题描述】:

我正在编写一个应用程序,在该应用程序中,我使用如下代码在 System.Windows.Forms.Panel 上显示 System.Drawing.Icon 对象:

Graphics g = _panel.CreateGraphics();
g.DrawIcon(this.NodeIcon, _rectangle);

我有代码可以使用拖放来移动图标。 我的问题是,当用户移动图标时,它一点也不流畅。 在用户停止移动图标之前,图标看起来会变形。

我试图在网上找到这方面的信息,但我无法让它顺利进行。 我以前对这种特殊类型的编码(使用图形)几乎没有经验,所以我是这方面的新手。

如果有好心人能帮我一些提示,将不胜感激。

提前致谢!

【问题讨论】:

  • 我也不知道,好像在拖拽的时候,正在重绘算法,效率不高。
  • 我想你也遇到过类似的问题?
  • @Freddy:不是真的,这是我的预感:P
  • 当我阅读“拖放”时,它具有非常具体的含义,但是,当我阅读您的问题时,我认为您指的是在面板周围移动图形元素,而不是“插入”图标到面板内的控件中,或将其移到某些控件之外的面板表面本身。也许您可以明确说明您在做什么,如何在图标上实现“命中检测”。另外:只是拖动带有图标的图片框是使用 MouseDown、MouseUp 和 MouseMove 的标准覆盖的选项吗?希望这些 cmets 有帮助,最好,
  • 一般来说,您不应该将 CreateGraphics 返回的 Graphics 对象用于文本测量 (Graphics.MeasureString) 之外的任何内容。渲染应该在 OnPaint 中进行。

标签: c# winforms .net-3.5 graphics


【解决方案1】:

我相信您正在尝试做的是在 MouseMove 事件处理程序上重绘您的控件。看起来你的问题是重绘面板时的闪烁。首先,您可以尝试将面板的 DoubleBuffered 属性设置为 true。这样做,您将设置面板以使用辅助缓冲区重新绘制其表面,以减少或防止闪烁。此属性受保护,因此您需要创建一个新的面板后代:

public class TestPanel : Panel
{
  public TestPanel()
  {
     DoubleBuffered = true;
  }
}

作为替代方案,您可以通过反射为面板设置 DoubleBuffered 属性

希望这会有所帮助,问候

【讨论】:

  • 感谢您的评论。我会尝试这个以及其他 cmets 的其他技巧。当我解决了问题时,我会通知你。
  • 谢谢!我终于有时间测试这些技巧,DoubleBuffered 做了我需要的。再次感谢!
猜你喜欢
  • 2013-04-13
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 2017-01-08
相关资源
最近更新 更多