(以下待修改)
在没有使用vc#的时候觉得,移动无标题窗体不是很难的,在真正操作时候,发现了许多问题,它毕竟没有flash中startdrag与stopdrag方法,我把我的解决过程写下来,当然对于熟练使用vc#的人来说我写的东西简直是垃圾。
我一开始这样考虑:1、MouseDown的时候,记录当前鼠标在窗体的位置,firstpoint,设置逻辑变量a,可以移动了。2、MouseMove的时候,再获取当前鼠标的位置,减去firstpoint,获得位置变化的量▽pos,窗体的位置加上这个变化的量。3、MouseUp的时候,改变变量a,不可以移动。
代码如下:
待加(代码在笔记本中,没时间打开了)
运行的结果:拖动窗体可以实现了,但是“抖”得厉害,也就是说鼠标没有放开时,窗体的位置一直在变化,拉动鼠标的幅度越大,越抖得厉害,加了一个toolTip,发现鼠标位置在变化。
分析原因:当鼠标移动过快,移出窗体,获得的e.Location就不准确了。others……
解决办法:waitting……
花了半天的时候重新写的代码:(复制以下代码可以测试,注意位置)
private Point m_pOffset; //鼠标偏移
private int xPos, yPos; //鼠标位置
private Point LocationMain = new Point(0, 0); //主窗口位置
public Form1()
{
InitializeComponent();
}
//添加鼠标事件处理方法
private void Form1_Load(object sender, EventArgs e)
{
this.MouseDown += new MouseEventHandler(Form1_MouseDown);
this.MouseMove += new MouseEventHandler(Form1_MouseMove);
}
//响应鼠标移动,并移动窗口
private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Point mousePos = Control.MousePosition;
mousePos.Offset(m_pOffset.X, m_pOffset.Y);
Location = mousePos;
xPos = mousePos.X;
yPos = mousePos.Y;
if (xPos < 0)
xPos = 0;
if (yPos < 0)
yPos = 0;
this.LocationMain.X = xPos;
this.LocationMain.Y = yPos;
}
}
//记录鼠标位置
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
m_pOffset = new Point(-e.X, -e.Y);
}
暂告一段落。
//下篇,用户状态的物理存储(ini等文件的读写)