Предположим, вы не хотите рисовать графику в одиночку, но хотите, чтобы Control
с прозрачностью переместился поверх другой Control
.
Вам нужно решить две задачи.:
Winforms плохо поддерживает прозрачность;у вас есть два варианта:
- Либо пусть система подделает его для вас
- , либо подделайте сами.
Длясначала достаточно иметь элемент управления с прозрачным задним цветом и Image или BackgroundImage (в зависимости от типа элемента управления) с прозрачностью, а затем nest движущийся элемент управления в фоновом элементе управления.
Для упрощенного теста вы можете добавить if (button.Parent != panel1) button.Parent = panel1;
к вашему коду mousedown.Это будет выглядеть странно, но должно отображаться правильно.(Не забудьте сделать Backcolor прозрачным; в вашем коде вы можете сделать его SystemColors.Control
.
. Чтобы подделать его самостоятельно, вы будете делать именно то, что делает система:
- Youполучить целевую поверхность в растровых изображениях (с
DrawToBitmap
) и затем объединить область, которую движущий элемент в настоящее время покрывает изображением, здесь получение этой области является ключевым. - Затем вы можете установить это изображение в качестве фона изображения или нарисовать егона двигатель.
Другая проблема связана с движущимся кодом.Здесь проблема в том, что при перемещении мыши вызывается событие
MouseMove
, и вы можете перемещать элемент управления.Но, перемещая его, мышь переместится
относительно на новое место и
событие снова будет вызвано , что приведет к вспыхиванию скачка!
Чтобы избежатьдля этого вы можете проверить числа или , используя флаг или , отменить регистрацию события перемещения перед установкой местоположения и затем повторно зарегистрироваться.
Хорошей идеей также является установка местоположения за один раз вместо двух координат ..: button.Location = new Point(button.Left + e.X - MouseDownLocation.X, button.Top + e.Y - MouseDownLocation.Y);
Имо, вам все равно стоит рассмотреть рисование только графики на Вкл panel.MouseMove
и panel.Paint
.На panel.MouseUp
вы все равно можете добавить Button
к panel.Controls
прямо здесь.Обе проблемы устраняются, и вы также можете свободно добавлять нужные вам функции.