Ловить движение мыши
Ситуация:
В настоящее время я работаю над проектом, целью которого является разработка VS-подобной IDE, где пользователи могут перетаскивать новые элементы управления на поверхность проектирования и изменять свойства этих элементов управления.
Итак, я реализовал IDesignerHost, IServiceContainer, IContainer, IComponentChangeService,
и некоторые другие полезные интерфейсы, разработанные для этого.
Все отлично работает, у меня есть мой набор инструментов, моя поверхность дизайна и мой propertyGrid
работает просто отлично.
Проблема в следующем:
К элементам управления drag'n'droped прикреплена метка, которая должна следовать за элементом управления, пока пользователь перемещает его с помощью мыши.
Я пытался использовать LocationChanged event
элементов управления, чтобы переместить метку при перемещении элемента управления. Но это событие происходит только один раз после перемещения элемента управления, поэтому метка не перемещается во время перемещения элемента управления.
Я не могу найти способ заставить эту работу. У кого-нибудь есть хорошие идеи, пожалуйста?
Спасибо
Редактировать: я использую пользовательский класс, реализующий IDesignerHost. Элементы управления в этой области дизайна не запускают события Mouse----- (например: MouseDown, MouseMove).
3 ответа
Я наконец нашел, как это сделать:
Я реализовал ISelectionService
и в SetSelectedComponents
функции, мне удалось выбрать метку элемента управления, связанную с любым выбранным элементом управления.
Я переопределил конструктор метки, чтобы при выборе метки не отображался прямоугольник границы / изменения размера.
Это не очень элегантное решение, но оно хорошо работает =).
Каждый элемент управления имеет ControlDesigner, предоставляет дополнительные методы для поддержки расширения и изменения поведения связанного элемента управления во время разработки.
В ControlDesigner у вас есть BehaviorService, который отвечает за управление поведением DesignSurface элемента управления.
BehaviorService имеет несколько символов Glyph и Adorner, которые похожи на декораторы пользовательского интерфейса для элемента управления. Элемент управления, изменяющий размер резиновой ленты в виде прямоугольника, представляет собой 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
Вы должны иметь возможность добавить свой собственный глиф, к которому прикреплена метка с элементом управления.
НТН
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;
}
}
}