本文讲述了C# Winform自定义UI!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:
经过实践总结 ,在Winform中实现窗口自定义 并可以拖动窗口的三种方式
一、通过重写鼠标事件的方式
private Point m_MousePoint;
private Point m_LastPoint;
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
this.m_LastPoint = this.Location;
this.m_MousePoint = this.PointToScreen(e.Location);
}
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
if (e.Button == MouseButtons.Left)
{
Point t = this.PointToScreen(e.Location);
Point l = this.m_LastPoint;
l.Offset(t.X - this.m_MousePoint.X, t.Y - this.m_MousePoint.Y);
this.Location = l;
}
}
1 代码直接复制到窗体上就可以使用.
2 可以用到UserControl上,UserControl就成了一个可拖动的控件了
3 可以用到自定义控件上,例如:自定义控件继承了一个Button ,然后写上上面代码,那么这个自定义Button就可以在Form窗体上随处拖动....
二、通过Win32 底层Windows API形式
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
public const int WM_SYSCOMMAND = 0x0112;
public const int SC_MOVE = 0xF010;
public const int HTCAPTION = 0x0002;
public void ShapedForm_MouseDown(object sender, MouseEventArgs e)
{
ReleaseCapture();
SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
}
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
ShapedForm_MouseDown(sender,e);
}
三、这种是第二种的延伸 通过底层窗口消息进行窗口控制 重写WndProc方法
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case (int)0x84:
WmDragWin(ref m);
break;
default:
base.WndProc(ref m);
break;
}
}
protected virtual void WmDragWin(ref Message m)
{
int wparam = m.LParam.ToInt32();
Point point = new Point(
wparam & 0xFFFF, wparam >> 16);
point = PointToClient(point);
m.Result = new IntPtr((int)2);
return;
}
建议用第二种,灵活稳定,方便处理
更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。
想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!