标题:如何实现控件在容器中来回拖动?
只看楼主
转角之后
Rank: 2
来 自:山东
等 级:论坛游民
帖 子:11
专家分:18
注 册:2011-10-13
结帖率:0
已结贴  问题点数:10 回复次数:7 
如何实现控件在容器中来回拖动?
自己用C#做了一个棋子游戏但想不出方法让棋子在容器中实现来回拖动,想请问一下各位高手应该怎么做到控件的来回拖动,还要提取目标位置的具体坐标。
首先申明棋子都是动态添加到窗体的Label控件。谢谢各位
搜索更多相关主题的帖子: 如何 目标 动态 棋子 
2011-10-24 14:23
qubo1982
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:367
专家分:1132
注 册:2009-3-18
得分:10 
你的棋子如果是一个控件的话,
在棋子这个控件设定一个鼠标单击事件,然后在容器里使用这个事件:
这里要注意,添加每一个棋子的事候,记得把事件关联上
程序代码:
        public delegate void ClickLine(object sender, MouseEventArgs e);
        public event ClickLine OnClickLine;
        private void UserLine_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                if (OnClickLine != null)
                {
                    OnClickLine(sender, e);
                }
            }
        } //如果你的棋子是WINDOWS里自带的控件来做的话,上面的东西就不用,直接用它的MouseClick事件就可以,如果不是,要写在自定义的控件里面

        void Box_OnClickLine(object sender, MouseEventArgs e)
        {
            _isMove = true;//确定开始移动操作
            _clickControl = (UserLine)sender;
        }
在棋子里再设定一个鼠标放开的事件,然后:
程序代码:
        void Box_MouseUp(object sender, MouseEventArgs e)
        {
            _isMove = false;//结束移动操作
            _clickControl.Location = new Point(e.X, e.Y);//这里自己微调坐标
        }

如果要实现棋子随鼠标动的话,在这个棋子的容器控件里:
程序代码:
        bool _isMove = false;
        Control _clickControl = null;
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (_isMove)
            {
                _clickControl.Location = new Point(e.X, e.Y);
            }
        }

        
大概就是这样了,有不清楚的再说吧

[ 本帖最后由 qubo1982 于 2011-10-24 18:36 编辑 ]
2011-10-24 18:30
转角之后
Rank: 2
来 自:山东
等 级:论坛游民
帖 子:11
专家分:18
注 册:2011-10-13
得分:0 
十分感谢你的指导,可以留个QQ号吗,以后方便请教。
2011-10-24 21:43
qubo1982
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:367
专家分:1132
注 册:2009-3-18
得分:0 
程序代码:
    public partial class Man : UserControl
    {
        public Man()
        {
            InitializeComponent();
        }

        bool _isMove = false;//移动状态
        Point _clickPoint;//鼠标点击时的位置

        private void Man_MouseUp(object sender, MouseEventArgs e)
        {
            _isMove = false;
        }

        private void Man_Paint(object sender, PaintEventArgs e)
        {
            this.BringToFront();//把控件置于顶层
        }

        private void Man_MouseDown(object sender, MouseEventArgs e)
        {
            //只影响鼠标左键单击
            if (e.Button != System.Windows.Forms.MouseButtons.Left)
                return;
            _isMove = true;
            _clickPoint = e.Location;
            //这里还可以改变控件的显示,例如虚化
        }

        private void Man_MouseMove(object sender, MouseEventArgs e)
        {
            if (_isMove)
            {
                //鼠标的屏幕坐标计算成当前控件在父窗口的Location
                Point newPoint = this.Parent.PointToClient(Cursor.Position);
                //修正坐标,保持控件与鼠标点击时位置相同
                this.Location = new Point(newPoint.X - _clickPoint.X, newPoint.Y - _clickPoint.Y);
            }
        }
    }
昨天那个是想象的,今天试了一下,换了一个事件,做了些小调整
这个效果更好,而且是在控件里独立实现,不用在父容器中添加代码了
2011-10-25 11:20
转角之后
Rank: 2
来 自:山东
等 级:论坛游民
帖 子:11
专家分:18
注 册:2011-10-13
得分:0 
高手,你太厉害了,太崇拜你了!
2011-10-26 09:18
转角之后
Rank: 2
来 自:山东
等 级:论坛游民
帖 子:11
专家分:18
注 册:2011-10-13
得分:0 
高手现在又有问题了。我如何通过Lable所绑定的单击事件,获取容器对象呢(本窗体对象)?
2011-11-01 22:29
qubo1982
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:367
专家分:1132
注 册:2009-3-18
得分:0 
Control c = sender as Control;
c.Parent
2011-11-02 08:10
转角之后
Rank: 2
来 自:山东
等 级:论坛游民
帖 子:11
专家分:18
注 册:2011-10-13
得分:0 
谢谢
2011-11-02 15:36



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-353285-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.193408 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved