我已经完成了一个小型测试程序,以原型化将图像(在右侧)(使用按钮作为支撑)拖放到面板(左侧)的方法(当前面板背景字母仅用于测试目的)并将其移动到面板周边。
在“绘画”事件期间,手动绘制了移动控件上的图像:
void bouton_Paint( object sender, PaintEventArgs e )
{
Button but = sender as Button;
Bitmap img = new Bitmap(WindowsFormsApplication1.Properties.Resources.triaxe);
img.MakeTransparent(Color.White);
e.Graphics.DrawImage(img, 0, 0, but.Width, but.Height);
}
如下所示,在移动过程中,移动的控件的背景变得模糊。所以不是很漂亮
是否可以使进度更顺畅?
谢谢。
这是在表单上移动三轴的代码:
void bouton_MouseUp( object sender, MouseEventArgs e )
{
Button button = sender as Button;
button.Tag = false;
button.BackColor = Color.Transparent;
}
void bouton_MouseMove( object sender, MouseEventArgs e )
{
Button button = sender as Button;
if (button.Tag != null && (bool)button.Tag == true)
{
button.Left += e.X - MouseDownLocation.X;
button.Top += e.Y - MouseDownLocation.Y;
}
}
private Point MouseDownLocation;
void bouton_MouseDown( object sender, MouseEventArgs e )
{
Button button = sender as Button;
MouseDownLocation = e.Location;
button.Tag = true;
button.BackColor = SystemColors.Control;
}
答案 0 :(得分:0)
让我们假设您不想单独绘制图形,而是希望将具有透明性的Control
移动到另一个Control
之上。
您必须解决两个问题:
Winforms不能很好地支持透明度。您有两种选择:
首先,具有透明背景色的控件和具有透明性的Image或BackgroundImage(取决于控件类型),然后在背景控件中嵌套,就足够了。 / p>
要进行简单测试,可以将if (button.Parent != panel1) button.Parent = panel1;
添加到鼠标按下代码中。这看起来跳动,但应正确显示透明度。 (不要忘记使Backcolor透明;在代码中将其设为SystemColors.Control
。
要自己进行伪造,您将完全按照系统的要求进行操作:
DrawToBitmap
),然后将移动器当前覆盖的区域与图像合并;在这里获得该区域是关键。MouseMove
事件,并且可以移动控件。但是通过移动鼠标,鼠标将相对移动到新位置,并且事件将再次触发,从而导致闪烁!为避免这种情况,您可以测试数字或,或者使用标志或取消注册移动事件,然后再设置位置并随后重新注册。
也可以一次性设置位置而不是两个坐标。.:button.Location = new Point(button.Left + e.X - MouseDownLocation.X, button.Top + e.Y - MouseDownLocation.Y);
Imo,您仍然应该考虑仅在On panel.MouseMove
和panel.Paint
上绘制图形。在panel.MouseUp
上,您仍然可以在此处的Button
上添加一个panel.Controls
。避免了这两个问题,您也可以自由添加所需的功能。