vc#.net使用入门2(移动无标题窗体)

(以下待修改)
    在没有使用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等文件的读写)

原文地址:https://www.cnblogs.com/numen/p/348702.html