2010-02-05 68 views
2

我有一个应用程序,用户可以在其中在表单上拖动控件。但他们 再问我管理单元行,使控制对齐更容易。我不知道如何实现它们 - 我曾看过:在运行时对齐控件时的对齐线条

http://msdn.microsoft.com/en-us/library/ms752100.aspx Adorner的,但它说它只适用于WPF。我在WinForms中尝试过,但是(如预期的)没有奏效。

如何在我的应用程序中获得管理单元行(类似于VS中的单元格)?

谢谢

巴尔

回答

1

你看到这篇文章在CodeProject:

Form Designer

设有锁定到对设计图面的网格。

+0

虽然这一个对齐网格,它不是我所期待的,但我会一定记住这一点。谢谢你周杰伦:) – 2010-02-06 04:53:57

1

在您的移动控制,你可以通过划分,然后由你的线条的宽度乘以调整LeftTop

left = (left/10)*10; 
top = (top/10)*10; 

它并不完美,但它简单。当然,因为控件没有MoveEnd事件,所以你必须跟踪MouseButton状态或类似的东西。

编辑:一个更好的实施将全面正确的划分结果,因此134 = 130和136 = 140

+0

嗯......这看起来很简单是真的:P感谢Cory,我会看看我能做些什么:) – 2010-02-06 04:54:38

+0

通常最好的解决方案是最简单的:-)。我没有实现这个代码,所以我非常渴望听到这个想法是如何为你制定的(或者没有)。 – 2010-02-06 21:52:26

0

我有同样的问题,我还在寻找一个解决方案;这里是我做过什么,到目前为止,它可以为您

const grid = 12; 
private void MyControl_LocationChanged(object sender, EventArgs e) 
{ 
    if (this.Left % grid != 0) 
     this.Left -= this.Left % grid; 
    if (this.Top % grid != 0) 
     this.Top -= this.Top % grid; 
} 

或在用户控件

protected override void OnMove(EventArgs e) 
{ 
    if (this.Left % grid != 0) 
     this.Left -= this.Left % grid; 
    if (this.Top % grid != 0) 
     this.Top -= this.Top % grid; 
} 

我目前的挑战是绘图活动的解决方案;我的控件托管在一个面板中,我正在寻找一种在必要时锁定和解锁面板图的方法;例如:只有在左侧或顶部发生变化后

+0

如果您通过'MouseDown','MouseMove'和'MouseUp'事件而不是'SendMessage'移动控件,该解决方案将完美工作。 – 2016-05-19 18:30:22