2010-02-11 3 views
3

У меня есть панель (панель управления) в моем приложении WinForms, где пользователи могут перетаскивать объекты, такие как текстовые поля, метки и т. Д. Но я хочу, чтобы им было легче ориентировать объекты. Я читал об этом, и, по-видимому, Алоннерс - это путь? Но, по-видимому, это только для WPF. WPF, к сожалению, не вариант для меня.Adorners for C# Windows Forms

То, что я пытаюсь сделать, это создавать строки, появляющиеся каждый раз, когда пользователь перетаскивает объект вокруг на холсте ... Как они работают в представлении Designer Windows Forms.

Буду признателен за любую помощь.

спасибо.

ответ

3

Спасибо всем за ваши ответы.


Мне удалось найти собственное решение. Код ниже. Там нет «линии», но я получу вокруг него однодневные ...

Label l = (Label)sender; 
foreach (Control control in Canvas.Controls) 
{ 
    if (l.Location.X > control.Location.X + control.Size.Width && l.Location.X < control.Location.X + control.Size.Width + 5) 
     l.Location = new Point(control.Location.X + control.Size.Width + 5, l.Location.Y); 
    else if (l.Location.X < control.Location.X - l.Size.Width && l.Location.X > control.Location.X - l.Size.Width - 5) 
     l.Location = new Point(control.Location.X - l.Size.Width - 5, l.Location.Y); 
    else if (l.Location.Y > control.Location.Y + control.Size.Height && l.Location.Y < control.Location.Y + control.Size.Height + 5) 
     l.Location = new Point(l.Location.X, control.Location.Y + control.Size.Height + 5); 
    else if (l.Location.Y < control.Location.Y - control.Size.Height && l.Location.Y > control.Location.Y - control.Size.Height - 5) 
     l.Location = new Point(l.Location.X, l.Location.Y - 5); 

    this.Update(); 
} 

Приведенный выше код должен быть размещен внутри Control_MouseMove Event, и, конечно, вы по-прежнему необходимо иметь свой код, который на самом деле движется контроля.

Приведенный выше код привяжет управление, которое вы перетаскиваете 5 пикселей вправо, влево, сверху или снизу ближайшего элемента управления.

1

Это вполне возможно. Посмотрите на метод DrawReversibleLine на MSDN. Тем временем я попытаюсь найти код, в котором я делал то же самое.

bool AllowResize; 
bool DoTracking; 

private void MyControl_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (AllowResize) 
    { 
     DoTracking = true; 
       ControlPaint.DrawReversibleFrame(new Rectangle(this.PointToScreen(new Point(1,1)), 
     this.Size), Color.DarkGray, FrameStyle.Thick); 
    } 
} 

Я знаю, что это очень общий & в основном сырой старт, но, как уже упоминалось, это может быть трудоемкой задачей. Особенно, когда дело доходит до отслеживания движения и т. Д. Помните, что на событии MyControl_MouseUp вызвать ControlPaint.DrawReversibleFrame (...), чтобы стереть фрейм. Кроме того, во время движения управления. Вызов функции снова с помощью тех же самых параметров - все, что вам нужно. Надеюсь, это поможет.

Кроме того, чтобы уменьшить мерцание как Джош указывает, добавьте следующее после вашего InitializeComponents();

// To reduce redraw flicker 
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
this.SetStyle(ControlStyles.DoubleBuffer, true); 
1

Если я правильно понимаю, вы хотите настроить свой контроль, чтобы он выглядел как другие элементы управления контейнером (GroupBox, Panel и т. Д.)?

Если это так, я думаю, что DisplayRectangle - это то, что вам нужно. Вы меняете его на прямоугольник, который хотите, чтобы другие элементы управления были привязаны.Например, у меня есть контроль GroupBox стиля и я поставил DisplayRectangle так:

public override Rectangle DisplayRectangle 
{ 
    get 
    { 
     return Rectangle.FromLTRB(base.DisplayRectangle.Left, 
      base.DisplayRectangle.Top + Font.Height + 4, 
      base.DisplayRectangle.Right, 
      base.DisplayRectangle.Bottom); 
    } 
} 

Теперь любой контроль я помещаю как ребенок будет привязываться к этому прямоугольнику, когда я тащу его к краям.

HTH!

+0

Очень интересно !!!!!! Спасибо, я проверю это :) – 2010-09-06 13:09:49