我已经完成了一个迷你测试程序,用于将图像(在右侧)(使用按钮作为支撑)拖放到面板(左侧部分)的原型(当前面板背景字母仅用于测试目的)并将其移动到面板周边。
在Paint事件期间手动绘制移动控件上的图像:
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);
}
如下所示,在移动过程中,移动控件的背景会消失。所以它不是很漂亮
是为了让进展更顺畅吗?
谢谢。
这是在表单上移动我的triaxe的代码:
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;
}
让我们假设你不想单独绘制图形,但确实想要一个透明度的Control
移动到另一个Control
之上。
你必须解决两个问题:
对于第一个,使用透明背景和具有透明度的Image或BackgroundImage(取决于控件类型)的控件就足够了,然后将移动控件嵌套在背景控件中。
对于简单的测试,您可以将if (button.Parent != panel1) button.Parent = panel1;
添加到您的mousedown代码中。这看起来很蠢,但应该正确显示透明度。 (不要忘记让Backcolor透明;在你的代码中你做它SystemColors.Control
。
要自己伪造它,你会完全按照系统的做法:
DrawToBitmap
事件,您可以移动控件。但是通过移动它,鼠标将相对移动到新位置,并且将再次触发事件,导致闪烁跳跃!为避免这种情况,您可以在设置位置之前测试数字或使用标记或取消注册移动事件,然后重新注册。
同时设置位置而不是两个坐标是一个好主意..:MouseMove
Imo你仍然应该考虑在On button.Location = new Point(button.Left + e.X - MouseDownLocation.X, button.Top + e.Y - MouseDownLocation.Y);
和panel.MouseMove
上绘制图形。在panel.Paint
你仍然可以在那里添加panel.MouseUp
到Button
。这两个问题都可以避免,您可以自由添加所需的功能。