Как показать пользовательские элементы управления в перетаскивании панели макета потока и в то же время с помощью значка перемещения курсора мыши в Winforms в c #?
Я работал над приложением Winforms и используюПеретащите функциональность. У меня работает функция перетаскивания, но я должен сделать ее более понятной и удобной для пользователя.
Часть этого будет включать в себя фактическое отображение перетаскиваемого элемента, предпочтительно полупрозрачного при перетаскивании, а также учитывается при расположении мышью вниз на элементе. Какой самый простой способ сделать это?
Элементы, которые я перетаскиваю, представляют собой пользовательские элементы управления с текстом, изображениями, автоматически создаваемыми данными и на панели макета потока, но я даже не уверен, где искать, как это сделать. Я добавил мой код, работающий здесь:
A) В основной форме:
public main_form()
{
InitializeComponent();
flowLayoutPanel1.AllowDrop = true;
flowLayoutPanel1.DragDrop += new DragEventHandler(this.flowLayoutPanel1_DragDrop);
flowLayoutPanel1.DragEnter += new DragEventHandler(this.flowLayoutPanel1_DragEnter);
foreach (uploaded_items c in flowLayoutPanel1.Controls)
c.MouseDown += new MouseEventHandler(c_MouseDown);
}
private void c_MouseDown(object sender, MouseEventArgs e)
{
uploaded_items data=new uploaded_items();
foreach (uploaded_items c in flowLayoutPanel1.Controls)
{
if (c._isDragging == true) data = c;
}
Bitmap bmp = new Bitmap(data.Size.Width, data.Size.Height);
data.DrawToBitmap(bmp, new Rectangle(Point.Empty, bmp.Size));
bmp.MakeTransparent(Color.White);
Cursor cur = new Cursor(bmp.GetHicon());
Cursor.Current = cur;
}
private void flowLayoutPanel1_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}
private void flowLayoutPanel1_DragDrop(object sender, DragEventArgs e)
{
uploaded_items data = (uploaded_items)e.Data.GetData(typeof(uploaded_items));
FlowLayoutPanel _destination = (FlowLayoutPanel)sender;
Point p = _destination.PointToClient(new Point(e.X, e.Y));
var item = _destination.GetChildAtPoint(p);
int index = _destination.Controls.GetChildIndex(item, false);
_destination.Controls.SetChildIndex(data, index);
_destination.Invalidate();
}
B) В пользовательском управлении:
public partial class uploaded_items : UserControl
{
public uploaded_items()
{
InitializeComponent();
AllowDrag = true;
}
public bool AllowDrag { get; set; }
public bool _isDragging = false;
private int _DDradius = 4; //the min distance the mouse req to dragged so that drag action would be taken
private int _mX = 0; //positon on mouse down
private int _mY = 0;
protected override void OnGotFocus(EventArgs e)
{
this.BackColor = Color.SandyBrown;
base.OnGotFocus(e);
}
protected override void OnLostFocus(EventArgs e)
{
this.BackColor = Color.Transparent;
base.OnLostFocus(e);
}
protected override void OnClick(EventArgs e)
{
this.Focus();
base.OnClick(e);
}
protected override void OnMouseDown(MouseEventArgs e)
{
this.Focus();
base.OnMouseDown(e);
_mX = e.X;
_mY = e.Y;
this._isDragging = false;
}
protected override void OnMouseMove(MouseEventArgs e)
{
if (!_isDragging)
{
// This is a check to see if the mouse is moving while pressed.
// Without this, the DragDrop is fired directly when the control is clicked, now I have to drag a few pixels first.
if (e.Button == MouseButtons.Left && _DDradius > 0 && this.AllowDrag)
{
int dist_x_dragged = e.X - _mX ;
int dist_y_dragged = e.Y - _mY ;
if (((dist_x_dragged ^ 2) + (dist_y_dragged ^ 2)) > _DDradius)
{
DoDragDrop(this, DragDropEffects.All);
_isDragging = true;
return;
}
}
base.OnMouseMove(e);
}
}
protected override void OnMouseUp (MouseEventArgs e)
{
_isDragging = false;
base.OnMouseUp(e);
}
#region Properties
private string _title;
private string _msg;
private Image _icon;
[Category("Custom Props")]
public string title
{
get { return _title; }
set { _title = value; lbl_title.Text = value; }
}
[Category("Custom Props")]
public string msg
{
get { return _msg; }
set { _msg = value; lbl_msg.Text = value; }
}
[Category("Custom Props")]
public Image icon
{
get { return _icon; }
set { _icon = value; pictureBox1.Image = value; }
}
#endregion
}
Первичное перетаскиваниефункция в порядке, но я обнаружил, что не могу показать элемент управления / изображение перетаскивания элемента управления в этой схеме:
- Ограниченная область закрыта: bmp появляется только тогда, когда она нажата и перетаскивается «осторожно» напользовательский элемент управления, и он ограничен только пользовательским элементом управления, но не текстом / рисунком на пользовательском элементе управления или панели макета потока
- Когда я пытаюсь перетащить, bmp исчезает
- bmpцентрируется в мгновенном месте мыши, но я бы хотел, чтобы он находился в том месте, где мышь изначально находится на пользовательском элементе управления