【问题标题】:Catching mouse move捕捉鼠标移动
【发布时间】:2009-09-09 09:34:56
【问题描述】:

情况:

我目前正在开展一个项目,目标是开发一个类似 VS 的 IDE,用户可以在其中将新控件拖放到设计图面上,并修改这些控件的属性。

所以我实现了IDesignerHost, IServiceContainer, IContainer, IComponentChangeService, 和其他一些有用的界面,专门设计的。

一切正常,我的工具箱、设计界面和propertyGrid 工作正常。

问题是:

附加到拖放控件的是一个标签,当用户用鼠标移动它时,它必须跟随控件

我尝试使用控件的LocationChanged event,在控件移动时移动标签。但此事件仅发生一次,控件移动后,标签不会移动控件移动时

我无法找到一种方法来完成这项工作。请问大家有什么好的想法吗?

谢谢

编辑: 我使用自定义类,实现 IDesignerHost。此设计图面上的控件不会触发事件 Mouse-----(例如:MouseDown、MouseMove)。

【问题讨论】:

    标签: c# .net design-surface


    【解决方案1】:

    我终于找到了方法:

    我实现了ISelectionService 并在SetSelectedComponents 函数中,我设法选择了与任何选定控件关联的标签控件。

    我封存了标签的设计者,以便在选择标签时不会显示边框/调整大小矩形。

    这是一个不太优雅的解决方案,但效果很好 =)。

    【讨论】:

      【解决方案2】:

      每个控件都有一个ControlDesigner,提供了额外的方法来支持在设计时扩展和更改关联控件的行为。

      在 ControlDesigner 中,你有一个BehaviorService,它负责控制控件在 DesignSurface 上的行为。

      BehaviorService 有多个 Glyphs 和 Adorners,它们就像控件的 UI 装饰器。像矩形一样重新调整大小橡皮筋的控件是一个 Glyph,称为 System.Windows.Forms.Design.Behavior.SelectionBorderGlyph 是 .Net 2.0 的私有类。

      此链接可能会有所帮助:

      http://msdn.microsoft.com/en-us/library/ms171820.aspx

      http://msdn.microsoft.com/en-us/library/bb514670%28VS.90%29.aspx

      您应该能够添加您的自定义字形,该字形带有与控件附加的标签。

      HTH

      【讨论】:

      • 感谢您的建议,尽管我不再从事此项目。我去看看 =)
      【解决方案3】:

      Form2 包含一个panel1, label1

      panel1.MouseMove += panel1_MouseMove
      panel1.MouseDown += panel1_MouseDown
      

      MouseDown+Left Button被点击时->保存初始鼠标位置 当MouseMove+Left Button点击时->移动(panel1+label1)当前鼠标位置和保存的初始位置之间的差异。

      完成了。

      public partial class Form2 : Form
      {
          private int _x, _y;
      
          public Form2()
          {
              InitializeComponent();
          }
      
          private void panel1_MouseMove(object sender, MouseEventArgs e)
          {
              if (e.Button == MouseButtons.Left)
              {
                  panel1.Location = new Point(panel1.Location.X + (e.X - _x), panel1.Location.Y + (e.Y - _y));
                  label1.Location = new Point(label1.Location.X + (e.X - _x), label1.Location.Y + (e.Y - _y));
              }
          }
      
          private void panel1_MouseDown(object sender, MouseEventArgs e)
          {
              if (e.Button == MouseButtons.Left)
              {
                  _x = e.X;
                  _y = e.Y;
              }
          }
      }
      

      【讨论】:

      • 对不起,但不适用于我的项目。我使用自定义类,实现 IDesignerHost。此设计图面上的控件不会触发事件 Mouse-----(例如:MouseDown、MouseMove)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多