抓住鼠标移动

时间:2009-09-09 09:34:57

标签: c# .net design-surface

情况:

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

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

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

问题是:

附加到drag'n'droped控件是一个标签,必须跟随控件,而用户用鼠标移动

我尝试使用控件的LocationChanged event,在控件移动时移动标签。但是这个事件只发生一次,在控件移动后,所以当控件移动时标签不会移动

我无法找到让这项工作的方法。请问有什么好主意吗?

谢谢

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

3 个答案:

答案 0 :(得分:1)

我终于找到了如何做到这一点:

我实施了ISelectionService,在SetSelectedComponents函数中,我设法选择了与所选控件相关联的标签控件。

我覆盖了标签的设计者,因此在选择标签时不会显示边框/调整大小矩形。

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

答案 1 :(得分:1)

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

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

BehaviorService有多个GlyphAdorner,就像控件的UI装饰器一样。控件重新调整大小的橡皮筋像矩形是一个字形,称为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

您应该能够添加自定义的Glyph,其中标签附有Control。

HTH

答案 2 :(得分:0)

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;
        }
    }
}