我想使我的主窗体像智能手机触摸屏一样可拖动。
因此,我在其中放置了一个Bunifugradientpanel并将其停靠在主窗体中。还放置了bunifudragcontrol并将targetcontrol属性设置为'bunifugradientpanel'
,并将vertical属性设置为'false',还将固定属性设置为'false'。但是,每当我在朗姆酒时段将面板拖动到右侧时,就会显示主窗体的一部分,即图片中的白色部分。
屏幕的白色部分是主要形式。我想要的是如果主窗体上的bunifugradientpanel位置=(x = 0,y = 0),则停止拖动活动,因此不会出现该主窗体的部分。谢谢您的帮助。
答案 0 :(得分:0)
BunifuGradientPanel
是第三方控件,这就是为什么它会出现绘图和闪烁问题的原因,我的建议是您使用常见的Panel
System.Windows.Forms.Panel
也就是说,我为您创建了此代码,使控件在按下鼠标按钮时只能从右向左和从左向右拖动:
using System;
using System.Windows.Forms;
namespace JeremyHelp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.SetStyle(
ControlStyles.AllPaintingInWmPaint |
ControlStyles.UserPaint |
ControlStyles.DoubleBuffer,
true);
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
this.SetDraggable(this.bunifuGradientPanel1, vertical: false);
}
protected override CreateParams CreateParams
{
get
{
CreateParams handleParam = base.CreateParams;
handleParam.ExStyle |= 0x02000000; // WS_EX_COMPOSITED
return handleParam;
}
}
private void SetDraggable(Control target, bool horizontal = true, bool vertical = true)
{
bool IsDraggable = false;
int
X = 0, Y = 0,
A = 0, B = 0;
target.MouseUp += (s, e) =>
{
IsDraggable = false;
X = 0; Y = 0;
A = 0; B = 0;
};
target.MouseDown += (s, e) =>
{
IsDraggable = true;
A = Control.MousePosition.X - target.Left;
B = Control.MousePosition.Y - target.Top;
};
target.MouseMove += (s, e) =>
{
X = Control.MousePosition.X;
Y = Control.MousePosition.Y;
if (IsDraggable)
{
if (horizontal) target.Left = X - A;
if (vertical) target.Top = Y - B;
}
};
}
}
}