再winform中,怎么让控件移动时移不出父容器。

ww6439w 2011-11-22 12:19:35
再winform中,怎么让控件移动时移不出父容器。
如果不用任何容器的控件,那就不能移动出当前的form窗体。
最好给下例子,我现在脑子很乱。
我的代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace tc
{
public partial class Form4 : Form
{
//将被拖动的控件
private Control control;
public Form4()
{
InitializeComponent();
//this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form4_Paint);
this.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint);

control = new Button();
control.MouseDown += new MouseEventHandler(button1_MouseDown);
control.MouseMove += new MouseEventHandler(button1_MouseMove);
control.MouseUp += new MouseEventHandler(button1_MouseUp);
this.Controls.Add(control);
}


//鼠标按下坐标(control控件的相对坐标)
Point mouseDownPoint = Point.Empty;
//显示拖动效果的矩形
Rectangle rect = Rectangle.Empty;
//是否正在拖拽
bool isDrag = false;


//重置变量
private void reset()
{
mouseDownPoint = Point.Empty;
rect = Rectangle.Empty;
isDrag = false;
}





//窗体重绘
private void Form4_Paint(object sender, PaintEventArgs e)
{
if (rect != Rectangle.Empty)
{
if (isDrag)
{//画一个和Control一样大小的黑框
e.Graphics.DrawRectangle(Pens.Black, rect);
}
else
{
e.Graphics.DrawRectangle(new Pen(this.BackColor), rect);
}
}
}
//把相对与control控件的坐标,转换成相对于窗体的坐标。
private Point getPointToForm(Point p)
{
return this.PointToClient(control.PointToScreen(p));
}

void button1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
mouseDownPoint = e.Location;
//记录控件的大小
rect = control.Bounds;
}

}

void button1_MouseMove(object sender, MouseEventArgs e)
{

if (e.Button == MouseButtons.Left)
{
isDrag = true;
//重新设置rect的位置,跟随鼠标移动
rect.Location = getPointToForm(new Point(e.Location.X - mouseDownPoint.X, e.Location.Y - mouseDownPoint.Y));
this.Refresh();

// }
}

}

void button1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (isDrag)
{
isDrag = false;
//移动control到放开鼠标的地方
control.Location = rect.Location;
this.Refresh();
}
reset();

}

}

private void panel1_Paint(object sender, PaintEventArgs e)
{
if (rect != Rectangle.Empty)
{
if (isDrag)
{//画一个和Control一样大小的黑框
e.Graphics.DrawRectangle(Pens.Black, rect);
}
else
{
e.Graphics.DrawRectangle(new Pen(this.BackColor), rect);
}
}
}


}
}


...全文
151 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ww6439w 2011-11-22
  • 打赏
  • 举报
回复
晕,你可以自己去试试,拖动控件的时候,超出了父容器,控件就木有了。
不过这个问题,我自己解决了,也明白了,这里面的关系。
以前一直做webform突然转要求做winform好多东西忘了。哈哈。
就是获取坐标,转换父窗体工作区坐标。比较窗体四周的值。
  • 打赏
  • 举报
回复
LZ。你的意思不是很明确
ww6439w 2011-11-22
  • 打赏
  • 举报
回复
木有人知道么 - -
ww6439w 2011-11-22
  • 打赏
  • 举报
回复
代码中最上面注释的那个是窗体,后来,我加了一个panel也是不行(现在的代码中有获取父容器的x,y。来跟移动的坐标对比),也会超出窗体
ww6439w 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 keymo_ 的回复:]

你的意思是不用mdi窗体是吗?
[/Quote]
是啊,不是你会啊?
KimoGao 2011-11-22
  • 打赏
  • 举报
回复
你的意思是不用mdi窗体是吗?

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧