需求,像QQ斗地主那样,鼠标在一个牌上按住,拖拉,放手,选中的牌被选中我的程序的每张牌是一个PictureBox,没有name属性
我现在用MouseMove事件的时候,如果加了
if (e.Button == MouseButtons.Left)
在这个if体里得到的sender就不会变,也就是鼠标选中了哪张牌,以后鼠标后就只有这一张牌被选中而不再if体里,就可以得到不同的sender,鼠标放到哪哪里的牌就被选中-------------------上边的是我的第一种思路-----------
-------------------下边是第二种--------------------
下边代码在if (e.Button == MouseButtons.Left)体里好使
现在我的鼠标在牌的控件上移动,可以得到坐标,比如下面4张牌的排列顺序如下
2KQJ
2的最左坐标为191,K的最左坐标为207,也就是说191+16等于下一张牌的最左坐标,一张牌有15像素露在外边
从191开始到j的最右坐标,我都可以得到,但是牌的PictureBox是没有name的,我不知道用什么能得到坐标所在的牌的PictureBox,也就是说可以框选却不知选中那些PictureBox代码1:如果鼠标在大王位置按住,拖动鼠标,下边代码((PictureBox)sender).Top,只有大王一个牌被选中
private void paiImage_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
((PictureBox)sender).Top = 545;
}
}
代码2:这个label4.Text显示的坐标完全正确
private void paiImage_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
label4.Text = Cursor.Position.X +".."+ _oldPosition.X;
}
}
代码3:不加if判断,鼠标划过,鼠标经过哪张牌,哪张牌就被选中,比如2KQJ 4张牌,鼠标一次从2经过到j,4张牌全部被选中
private void paiImage_MouseMove(object sender, MouseEventArgs e)
{
((PictureBox)sender).Top = 545;
}注:我设置了一个全局变量 bool MouseIsDown = false;
在MouseDown事件里判断点了鼠标左键 设置MouseIsDown 为true
然后在MouseMove事件里加判断
if (MouseIsDown)
在这个if体里跟在if (e.Button == MouseButtons.Left)体里的效果一样请问,我想在鼠标按下的时候,鼠标划过牌,按下的和被划过的牌在鼠标放手时全被选中,我这个代码该怎么改?
200分,明天再加100

解决方案 »

  1.   

    没看明白你的思路... 你先不要管PictureBox  先获取鼠标选取的矩形..然后判断PictureBox所在的位置是否和矩形相交就可以了
      

  2.   

    没必要这么麻烦吧,在MouseDown获得鼠标坐标点P1(x1,y1);在MouseUp获得坐标点(x2,y2);判断这两个点组成的矩形里面包含有那一张牌的坐标不就行了
      

  3.   

    应该比较简单,用MouseDown Point 和 MouseUp Point 构成Rectangle 再用 IntersectsWith你的“牌子”
      

  4.   

    可以构成坐标组成的矩形
    但是放牌的PictureBox没有name
    不知道矩形内的PictureBox是什么
      

  5.   

      给你个实现移动的类 直接调用就可以了!
         
    using System; 
    using System.Collections.Generic; 
    using System.Text; 
    using System.Windows.Forms; 
    using System.Drawing; 
    namespace MoveControl 

        class BarcodeControl 
        { 
            #region private         private const int MIN_SIZE = 10; //对控件缩放的最小值 
            private const int BOX_SIZE = 7;  //调整大小触模柄方框大小         public bool _IsCtrlKey = false; 
            private TextBox _textbox; 
            private Control _MControl = null; 
            private bool _IsMouseDown = false; 
            private Point _oPointClicked; 
            private Color BOX_COLOR = Color.White; 
            private Label[] _lbl = new Label[8]; 
            private int _startl, _startt, _startw, _starth; 
            private bool _dragging; 
            private Cursor[] _arrArrow = new Cursor[] {Cursors.SizeNWSE, Cursors.SizeNS, 
                                                        Cursors.SizeNESW, Cursors.SizeWE, Cursors.SizeNWSE, Cursors.SizeNS, 
                                                        Cursors.SizeNESW, Cursors.SizeWE};         #endregion         #region 构造函数         /// <summary> 
            /// 构造控件拖动对象 
            /// </summary> 
            /// <param name="moveControl">需要拖动的控件 </param> 
            public BarcodeControl(Control moveControl) 
            { 
                // 
                // TODO: 在此处添加构造函数逻辑 
                // 
                _MControl = moveControl; 
                _MControl.MouseDown += new MouseEventHandler(this.Control_MouseDown); 
                _MControl.MouseUp += new MouseEventHandler(this.Control_MouseUp); 
                _MControl.MouseMove += new MouseEventHandler(this.Control_MouseMove); 
                _MControl.Click += new System.EventHandler(this.Control_Click);             //构造8个调整大小触模柄 
                for (int i = 0; i <8; i++) 
                { 
                    _lbl[i] = new Label(); 
                    _lbl[i].TabIndex = i; 
                    _lbl[i].FlatStyle = 0 ; 
                    _lbl[i].BorderStyle = BorderStyle.FixedSingle; 
                    _lbl[i].BackColor = BOX_COLOR; 
                    _lbl[i].Cursor = _arrArrow[i]; 
                    _lbl[i].Text = ""; 
                    _lbl[i].BringToFront(); 
                    _lbl[i].MouseDown += new MouseEventHandler(this.handle_MouseDown); 
                    _lbl[i].MouseMove += new MouseEventHandler(this.handle_MouseMove); 
                    _lbl[i].MouseUp += new MouseEventHandler(this.handle_MouseUp); 
                }             CreateTextBox(); 
                Create();             //Control_Click((object)sender, (System.EventArgs)e); 
            }         #endregion         #region 需拖动控件键盘事件         private void textBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
            { 
                if (e.KeyValue == 37 || e.KeyValue == 38 || e.KeyValue == 39 || e.KeyValue == 40) 
                { 
                    if (e.KeyValue == 37) 
                        _MControl.Left -= 1; 
                    if (e.KeyValue == 38) 
                        _MControl.Top -=1; 
                    if (e.KeyValue == 39) 
                        _MControl.Left += 1; 
                    if (e.KeyValue == 40) 
                        _MControl.Top +=1; 
                    MoveHandles(); 
                    ControlLocality(); 
                    _MControl.Visible = true; 
                }             if (e.KeyValue == 46) 
                { 
                    for (int i = 0; i <8; i++) 
                    { 
                        _MControl.Parent.Controls.Remove(_lbl[i]); 
                    } 
                    _MControl.Parent.Controls.Remove(_MControl); 
                    _textbox.Parent.Controls.Remove(_textbox); 
                }             if (e.KeyValue == 17) 
                { 
                    _IsCtrlKey = true; 
                    //MessageBox.Show("a"); 
                } 
            }         #endregion         #region 需拖动控件鼠标事件         private void Control_Click(object sender, System.EventArgs e) 
            { 
                _textbox.Focus(); 
                _MControl = (sender as Control); 
                MoveHandles();             if (_IsCtrlKey == false) 
                { 
                    for (int i = 0; i < _MControl.Parent.Controls.Count; i++) 
                    { 
                        if (_MControl.Parent.Controls[i].Text.Trim().Length == 0 && _MControl.Parent.Controls[i] is Label) 
                        { 
                            _MControl.Parent.Controls[i].Visible = false; 
                        } 
                    } 
                } 
            } 
            private void Control_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) 
            { 
                _IsMouseDown = true; 
                _oPointClicked = new Point(e.X, e.Y); 
                for (int i = 0; i < 8; i++) 
                { 
                    _MControl.Parent.Controls.Add(_lbl[i]); 
                    _lbl[i].BringToFront(); 
                } 
                HideHandles(); 
            }         private void Control_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) 
            { 
                _IsMouseDown = false; 
                MoveHandles(); 
                ShowHandles(); 
                _MControl.Visible = true; 
            }         private void Control_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) 
            { 
                if (_IsMouseDown) 
                { 
                    int l = _MControl.Left + (e.X - _oPointClicked.X); 
                    int t = _MControl.Top + (e.Y - _oPointClicked.Y); 
                    int w = _MControl.Width; 
                    int h = _MControl.Height; 
                    l = (l < 0) ? 0 : ((l + w > _MControl.Parent.ClientRectangle.Width) ? 
                        _MControl.Parent.ClientRectangle.Width - w : l); 
                    t = (t < 0) ? 0 : ((t + h > _MControl.Parent.ClientRectangle.Height) ? 
                        _MControl.Parent.ClientRectangle.Height - h : t); 
                    _MControl.Left = l; 
                    _MControl.Top = t; 
                    ControlLocality(); 
                } 
                //_MControl.Cursor=Cursors.SizeAll; 
            }         #endregion
      

  6.   


         #region 调整大小触模柄鼠标事件         private void handle_MouseDown(object sender, MouseEventArgs e) 
            { 
                _dragging = true; 
                _startl = _MControl.Left; 
                _startt = _MControl.Top; 
                _startw = _MControl.Width; 
                _starth = _MControl.Height; 
                HideHandles(); 
            } 
          // 通过触模柄调整控件大小 
            //    0  1  2 
            //  7      3 
            //  6  5  4 
            private void handle_MouseMove(object sender, MouseEventArgs e) 
            { 
                int l = _MControl.Left; 
                int w = _MControl.Width; 
                int t = _MControl.Top; 
                int h = _MControl.Height; 
                if (_dragging) 
                { 
                    switch (((Label)sender).TabIndex) 
                    { 
                            //l算法:控件左边X坐标 + 鼠标在触模柄X坐标 < 控件左边X坐标 + 父控件宽度 - 控件大小 ?控件左边X坐标 + 鼠标在触模柄X坐标 :控件左边X坐标 + 父控件宽度 - 控件大小  
                            //t算法: 
                            //w算法: 
                            //h算法: 
                        case 0: // _dragging top-left sizing box 
                            l = _startl + e.X < _startl + _startw - MIN_SIZE ? _startl + e.X : _startl + _startw - MIN_SIZE; 
                            t = _startt + e.Y < _startt + _starth - MIN_SIZE ? _startt + e.Y : _startt + _starth - MIN_SIZE; 
                            w = _startl + _startw - _MControl.Left; 
                            h = _startt + _starth - _MControl.Top; 
                            break; 
                        case 1: // _dragging top-center sizing box 
                            t = _startt + e.Y < _startt + _starth - MIN_SIZE ? _startt + e.Y : _startt + _starth - MIN_SIZE; 
                            h = _startt + _starth - _MControl.Top; 
                            break; 
                        case 2: // _dragging top-right sizing box 
                            w = _startw + e.X > MIN_SIZE ? _startw + e.X : MIN_SIZE; 
                            t = _startt + e.Y < _startt + _starth - MIN_SIZE ? _startt + e.Y : _startt + _starth - MIN_SIZE; 
                            h = _startt + _starth - _MControl.Top; 
                            break; 
                        case 3: // _dragging right-middle sizing box 
                            w = _startw + e.X > MIN_SIZE ? _startw + e.X : MIN_SIZE; 
                            break; 
                        case 4: // _dragging right-bottom sizing box 
                            w = _startw + e.X > MIN_SIZE ? _startw + e.X : MIN_SIZE; 
                            h = _starth + e.Y > MIN_SIZE ? _starth + e.Y : MIN_SIZE; 
                            break; 
                        case 5: // _dragging center-bottom sizing box 
                            h = _starth + e.Y > MIN_SIZE ? _starth + e.Y : MIN_SIZE; 
                            break; 
                        case 6: // _dragging left-bottom sizing box 
                            l = _startl + e.X < _startl + _startw - MIN_SIZE ? _startl + e.X : _startl + _startw - MIN_SIZE; 
                            w = _startl + _startw - _MControl.Left; 
                            h = _starth + e.Y > MIN_SIZE ? _starth + e.Y : MIN_SIZE; 
                            break; 
                        case 7: // _dragging left-middle sizing box 
                            l = _startl + e.X < _startl + _startw - MIN_SIZE ? _startl + e.X : _startl + _startw - MIN_SIZE; 
                            w = _startl + _startw - _MControl.Left; 
                            break; 
                    } 
                    l =(l <0)?0:l; 
                    t =(t <0)?0:t; 
                    _MControl.SetBounds(l,t,w,h); 
                } 
            }         private void handle_MouseUp(object sender, MouseEventArgs e) 
            { 
                _dragging = false; 
                MoveHandles(); 
                ShowHandles(); 
            }         #endregion         #region private方法         private void Create() 
            { 
                //_IsMouseDown = true; 
                //_oPointClicked = new Point(e.X,e.Y); 
                for (int i = 0; i < 8; i++) 
                { 
                    _MControl.Parent.Controls.Add(_lbl[i]); 
                    _lbl[i].BringToFront(); 
                } 
                HideHandles(); 
            }         private void CreateTextBox() 
            { 
                _textbox = new TextBox(); 
                _textbox.CreateControl(); 
                _textbox.Parent = _MControl.Parent; 
                _textbox.Width = 0; 
                _textbox.Height = 0; 
                _textbox.TabStop = true; 
                _textbox.KeyDown += new System.Windows.Forms.KeyEventHandler(textBox_KeyDown); 
            }         private void ControlLocality() 
            { 
                if (_MControl.Location.X < 0) 
                { 
                    _MControl.Visible = false; 
                    _MControl.Left = 0; 
                } 
                if (_MControl.Location.Y < 0) 
                { 
                    _MControl.Visible = false; 
                    _MControl.Top = 0; 
                } 
                if (_MControl.Location.X + _MControl.Width > _MControl.Parent.Width) 
                { 
                    _MControl.Visible = false; 
                    _MControl.Left = _MControl.Parent.Width - _MControl.Width; 
                } 
                if (_MControl.Location.Y + _MControl.Height > _MControl.Parent.Height) 
                { 
                    _MControl.Visible = false; 
                    _MControl.Top = _MControl.Parent.Height - _MControl.Height; 
                } 
            }         private void HideHandles() 
            { 
                for (int i = 0; i < 8; i++) 
                { 
                    _lbl[i].Visible = false; 
                } 
            }         private void MoveHandles() 
            { 
                int sX = _MControl.Left - BOX_SIZE; 
                int sY = _MControl.Top - BOX_SIZE; 
                int sW = _MControl.Width + BOX_SIZE; 
                int sH = _MControl.Height + BOX_SIZE; 
                int hB = BOX_SIZE / 2; 
                int[] arrPosX = new int[] {sX+hB, sX + sW / 2, sX + sW-hB, sX + sW-hB, 
                                              sX + sW-hB, sX + sW / 2, sX+hB, sX+hB}; 
                int[] arrPosY = new int[] {sY+hB, sY+hB, sY+hB, sY + sH / 2, sY + sH-hB, 
                                              sY + sH-hB, sY + sH-hB, sY + sH / 2}; 
                for (int i = 0; i < 8; i++) 
                { 
                    _lbl[i].SetBounds(arrPosX[i], arrPosY[i], BOX_SIZE, BOX_SIZE); 
                } 
            }         private void ShowHandles() 
            { 
                if (_MControl != null) 
                { 
                    for (int i = 0; i < 8; i++) 
                    { 
                        _lbl[i].Visible = true; 
                    } 
                } 
            }         #endregion     } 

    MoveControl.BarcodeControl barcode = new BarcodeControl(控件); 
      

  7.   

    鼠标框选的矩形你可以知道,你放置牌的PictureBox应该是个集合吧,
    你在集合中遍历一下,如果集合中的元素的坐标在矩形范围内,
    就是被选中的,在进行相应的操作。
    LS代码好多,没细看,注释也少-_-!
      

  8.   

    你这些picturebox肯定都是放在同个容器里的吧?
    鼠标事件当然是这个容器的, 你不应该去抓picturebox的鼠标事件吧
      

  9.   

    鼠标框选的矩形你可以知道,你放置牌的PictureBox应该是个集合吧,//是集合的,54张牌,就是54个PictureBox
    你在集合中遍历一下,如果集合中的元素的坐标在矩形范围内,//54个PictureBox被分成3份,地主20个,其他两个人每人17个你这些picturebox肯定都是放在同个容器里的吧?//不是的,都是单独的,要是容器就是Form窗体``
    还有每次出牌后手里的牌的坐标都会重新排列一次,坐标也会变化
      

  10.   

    C# code
    using System; 
    using System.Collections.Generic; 
    using System.Text; 
    using System.Windows.Forms; 
    using System.Drawing; 
    namespace MoveControl 

        class BarcodeControl 
        { 
            #region private         private const int MIN_SIZE = 10; //对控件缩放的最小值 
            private const int BOX_SIZE = 7;  //调整大小触模柄方框大小         public bool _IsCtrlKey = false; 
            private TextBox _textbox; 
            private Control _MControl = null; 
            private bool _IsMouseDown = false; 
            private Point _oPointClicked; 
            private Color BOX_COLOR = Color.White; 
            private Label[] _lbl = new Label[8]; 
            private int _startl, _startt, _startw, _starth; 
            private bool _dragging; 
            private Cursor[] _arrArrow = new Cursor[] {Cursors.SizeNWSE, Cursors.SizeNS, 
                                                        Cursors.SizeNESW, Cursors.SizeWE, Cursors.SizeNWSE, Cursors.SizeNS, 
                                                        Cursors.SizeNESW, Cursors.SizeWE};         #endregion         #region 构造函数         /// <summary> 
            /// 构造控件拖动对象 
            /// </summary> 
            /// <param name="moveControl">需要拖动的控件 </param> 
            public BarcodeControl(Control moveControl) 
            { 
                // 
                // TODO: 在此处添加构造函数逻辑 
                // 
                _MControl = moveControl; 
                _MControl.MouseDown += new MouseEventHandler(this.Control_MouseDown); 
                _MControl.MouseUp += new MouseEventHandler(this.Control_MouseUp); 
                _MControl.MouseMove += new MouseEventHandler(this.Control_MouseMove); 
                _MControl.Click += new System.EventHandler(this.Control_Click);             //构造8个调整大小触模柄 
                for (int i = 0; i <8; i++) 
                { 
                    _lbl[i] = new Label(); 
                    _lbl[i].TabIndex = i; 
                    _lbl[i].FlatStyle = 0 ; 
                    _lbl[i].BorderStyle = BorderStyle.FixedSingle; 
                    _lbl[i].BackColor = BOX_COLOR; 
                    _lbl[i].Cursor = _arrArrow[i]; 
                    _lbl[i].Text = ""; 
                    _lbl[i].BringToFront(); 
                    _lbl[i].MouseDown += new MouseEventHandler(this.handle_MouseDown); 
                    _lbl[i].MouseMove += new MouseEventHandler(this.handle_MouseMove); 
                    _lbl[i].MouseUp += new MouseEventHandler(this.handle_MouseUp); 
                }             CreateTextBox(); 
                Create();             //Control_Click((object)sender, (System.EventArgs)e); 
            }         #endregion         #region 需拖动控件键盘事件         private void textBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
            { 
                if (e.KeyValue == 37 || e.KeyValue == 38 || e.KeyValue == 39 || e.KeyValue == 40) 
                { 
                    if (e.KeyValue == 37) 
                        _MControl.Left -= 1; 
                    if (e.KeyValue == 38) 
                        _MControl.Top -=1; 
                    if (e.KeyValue == 39) 
                        _MControl.Left += 1; 
                    if (e.KeyValue == 40) 
                        _MControl.Top +=1; 
                    MoveHandles(); 
                    ControlLocality(); 
                    _MControl.Visible = true; 
                }             if (e.KeyValue == 46) 
                { 
                    for (int i = 0; i <8; i++) 
                    { 
                        _MControl.Parent.Controls.Remove(_lbl[i]); 
                    } 
                    _MControl.Parent.Controls.Remove(_MControl); 
                    _textbox.Parent.Controls.Remove(_textbox); 
                }             if (e.KeyValue == 17) 
                { 
                    _IsCtrlKey = true; 
                    //MessageBox.Show("a"); 
                } 
            }         #endregion         #region 需拖动控件鼠标事件         private void Control_Click(object sender, System.EventArgs e) 
            { 
                _textbox.Focus(); 
                _MControl = (sender as Control); 
                MoveHandles();             if (_IsCtrlKey == false) 
                { 
                    for (int i = 0; i < _MControl.Parent.Controls.Count; i++) 
                    { 
                        if (_MControl.Parent.Controls[i].Text.Trim().Length == 0 && _MControl.Parent.Controls[i] is Label) 
                        { 
                            _MControl.Parent.Controls[i].Visible = false; 
                        } 
                    } 
                } 
            } 
            private void Control_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) 
            { 
                _IsMouseDown = true; 
                _oPointClicked = new Point(e.X, e.Y); 
                for (int i = 0; i < 8; i++) 
                { 
                    _MControl.Parent.Controls.Add(_lbl[i]); 
                    _lbl[i].BringToFront(); 
                } 
                HideHandles(); 
            }         private void Control_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) 
            { 
                _IsMouseDown = false; 
                MoveHandles(); 
                ShowHandles(); 
                _MControl.Visible = true; 
            }         private void Control_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) 
            { 
                if (_IsMouseDown) 
                { 
                    int l = _MControl.Left + (e.X - _oPointClicked.X); 
                    int t = _MControl.Top + (e.Y - _oPointClicked.Y); 
                    int w = _MControl.Width; 
                    int h = _MControl.Height; 
                    l = (l < 0) ? 0 : ((l + w > _MControl.Parent.ClientRectangle.Width) ? 
                        _MControl.Parent.ClientRectangle.Width - w : l); 
                    t = (t < 0) ? 0 : ((t + h > _MControl.Parent.ClientRectangle.Height) ? 
                        _MControl.Parent.ClientRectangle.Height - h : t); 
                    _MControl.Left = l; 
                    _MControl.Top = t; 
                    ControlLocality(); 
                } 
                //_MControl.Cursor=Cursors.SizeAll; 
            }         #endregion
      

  11.   

    换个思路吧,为什么不给picturebox设个name,没有name的picturebox靠什么识别,句柄吗?
    发牌时候动态生成20,17,17个picturebox,可以叫做p1,..,p54,也可以叫b1,..,b54,随便,但是与list[54]数组一一对应,然后简单了。
    假设第一张牌x坐标为0(不可能,简单起见),鼠标单击位置x,
    if(x<=1*15) 第一张牌list[0]
    if(1*15<x<2*15) 第二张牌list[1]

    通过对应的映射关系就找到p1..p54了,这个映射关系可以用个hash表存储下,简单。
      

  12.   

    实现没法仔细看你的代码,请原谅。给几个想法:一、控件的鼠标方法有一个叫做pointtoscreen和pointtoclient好像是吧,望文生义即可。你可以通过这个完全掌握鼠标均划过哪些控件。二、你的picturebox应该由一个列表来维护,控件还有一个方法是判断自己是否包含某个矩形的一部分或者是否包含某个点,你在步骤一中得到了鼠标走过的首尾两点划过的矩形,那么遍历picturebox便可以知道哪些picturebox处在这个矩形中。控件的这两个方法你注意一下。还有,以上的想法应该可以帮助你解决问题,具体怎么利用你自己试。不过我觉得你的这个设计方案不太合理。
      

  13.   

    哥们,给你个建议,最好用windows api做,方便,而且也比较美观
      

  14.   

    PictureBox本身就是一种容器,那么LZ的鼠标事件写在其父容器上,很可能鼠标落在PictureBox上时触发不到父容器的事件...另外个人觉得扑克的程序用PictureBox不太好吧~~~~一般都是BitBlt画上去的,如果用微软自带的Cards.dll就更方便了,这样的话,全部画在父容器上,也就不存在LZ说的那种问题了,鼠标拖动画一个反集的矩形框就行了
      

  15.   

    鼠标在一个牌上按住,拖拉,放手,选中的牌被选中,这样试一下。
    PictureBox[] pk = new PictureBox[13];//生成数组
    int xleft=30
    private void button1_Click(object sender, EventArgs e)
            {
               for (int i = 0; i < 13; i++)
                 pk[i] = new PictureBox();
                    pk[i].Width = 85;
                    pk[i].Height = 119;  //牌的width,height
                    pk[i].Left = xleft+15; //牌的坐标,+15是13张牌排好后每张露在外部份。
                    pki].Top = 19;
                    pk[i].Name = pk[i].ToString();
                    pk[i].Image = Image.FromFile(@"pk\.jpg" );
                    Controls.Add(pk[i]);
                   pk[i].BringToFront();  //将新增控件Z轴定义为最底层。
                    pk[i].MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseUp);
                    pk[i].MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseMove);
                    pk[i].MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseDown); 
      private void pictureBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)        {
                if (e.Button == MouseButtons.Left)
                {
                    Point mousePos = Control.MousePosition;
                    mousePos.Offset(mouse_offset.X, mouse_offset.Y);
                    ((Control)sender).Location = ((Control)sender).Parent.PointToClient(mousePos);
                    ((Control)sender).BringToFront();
                }
            }        private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)        {            mouse_offset = new Point(-e.X, -e.Y);
                ((Control)sender).BringToFront();
            }        private void pictureBox1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)        {
                if (e.Button == MouseButtons.Left)
                {
                    Point mousePos = Control.MousePosition;
                    mousePos.Offset(mouse_offset.X, mouse_offset.Y);
                    ((Control)sender).Location = ((Control)sender).Parent.PointToClient(mousePos);
                }        }        
      

  16.   

    当然要把牌所在集合中的坐标也变 //重排的牌的坐标也可以得到,只是pb没有name,不知如何得到当前坐标的牌,现在我只知道可以用  ((PictureBox)sender)取得当前点击的牌
      

  17.   

    12楼和33楼代码都试过了都不是我想要的功能你们的实现的是鼠标拖动一个pb移动而我的需求是鼠标按住左键选中一个pb,不放手,然后移动鼠标到其他pb上,鼠标移动到那个pb上哪个pb就被选中我等下做个demo代码发上来,可能会更清楚的表达``
      

  18.   

    demo做好了源码下载可以进入下面的163邮箱
    163邮箱地址: http://email.163.com
    用户名:   [email protected]
    密  码:   xxxbaibai1
    名字是:   鼠标框选不同控件的问题(原版demo)
    [[email protected]][/email]改好了请直接上传到这个邮箱里,然后在这里留言,我会给分的,谢谢大家下边是效果图看不到图可以点下边的连接看到http://xxxbaibai.blog.163.com/prevPhDownload.do?host=xxxbaibai&photoId=fks_087071081094084064084084086075072087080069092085080068083086&frompvphdown
      

  19.   



    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;namespace TestMouseMove
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    } PictureBox[] pk = new PictureBox[13];//生成数组
    int xleft = 60;
    private Point mouse_offset; private void Form1_Load(object sender, EventArgs e)
    {
    this.label1.Text = "现在的牌只能是一张一张的选择\n我想做成可以鼠标在牌上一拉\n就把拉过的牌全选中\n玩过QQ斗地主的应该都知道的";
    this.label2.Text = "鼠标单击牌上看效果";
    for (int i = 0; i < 13; i++)
    {
    pk[i] = new PictureBox();
    pk[i].Width = 72;
    pk[i].Height = 97;  //牌的width,height
    xleft += 15;
    pk[i].Left = xleft; //牌的坐标,+15是13张牌排好后每张露在外部份。
    pk[i].Top = 100;
    pk[i].BackgroundImage = TestMouseMove.Properties.Resources.pk;
    Controls.Add(pk[i]);
    pk[i].BringToFront();  //将新增控件Z轴定义为最底层。
                    //pk[i].MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseUp);
                    //pk[i].MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseMove);
                    //pk[i].MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseDown);
    pk[i].Click += new System.EventHandler(paiImage_Click);   
    }
                this.MouseUp += new System.Windows.Forms.MouseEventHandler(pictureBox1_MouseUp);
                this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseMove);
                this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseDown);
    }

    private void pictureBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
    {
                if (m_MouseRectangle != Rectangle.Empty)
                {
                    this.Refresh();
                    m_MouseRectangle.Width = Cursor.Position.X - m_MouseRectangle.Left;
                    m_MouseRectangle.Height = Cursor.Position.Y - m_MouseRectangle.Top;
                    ControlPaint.DrawReversibleFrame(m_MouseRectangle, Color.White, FrameStyle.Dashed);
                }

    } private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
                if (e.Button == MouseButtons.Left)
                {
                    Control _Control = (Control)sender;
                    m_MouseRectangle.X = Cursor.Position.X;
                    m_MouseRectangle.Y = Cursor.Position.Y;
                }           
    }        private Rectangle m_MouseRectangle = new Rectangle();
            
    private void pictureBox1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
    {
                if (e.Button == MouseButtons.Left)
                {
                    this.Refresh();
                    Rectangle _ClientRectangle = this.RectangleToClient(m_MouseRectangle);
                    this.Text = _ClientRectangle.ToString();                if (_ClientRectangle.Width < 0)
                    {
                        int _X = _ClientRectangle.X;
                        _ClientRectangle.X = _ClientRectangle.Width + _ClientRectangle.X;
                        _ClientRectangle.Width = _X - _ClientRectangle.X;
                    }
                    if (_ClientRectangle.Height < 0)
                    {
                        int _Y = _ClientRectangle.Y;
                        _ClientRectangle.Y = _ClientRectangle.Height + _ClientRectangle.Y;
                        _ClientRectangle.Height = _Y - _ClientRectangle.Y;
                    }                if (_ClientRectangle.Width == 0 || _ClientRectangle.Height == 0) return;
                    for (int i = 0; i != pk.Length; i++)
                    { 
                        if (_ClientRectangle.IntersectsWith(pk[i].Bounds))
                        {
                            if (pk[i].Top == 100) pk[i].Top = 80;
                            else pk[i].Top = 100;
                        }
                    }
                    m_MouseRectangle = Rectangle.Empty;
                }
    }        #region 牌的点击事件
            private void paiImage_Click(object sender, EventArgs e)
    {
    MouseEventArgs Mouse_e = (MouseEventArgs)e; if (Mouse_e.Button == MouseButtons.Right)
    {
    return;
    } if (((PictureBox)sender).Top == 100) ((PictureBox)sender).Top = 80;
    else ((PictureBox)sender).Top = 100;
    }
    #endregion
    }
    }恩 这个应该是你要的意思把.
      

  20.   

    只在牌上选的问题解决了
    只要在 Form1_Load 方法里把注释打开,注释掉循环外的事件即可,不过现在鼠标选中的牌还要修改一下,我希望
    隐藏在牌后面的那部分的牌就不要被选中了
      

  21.   

    隐藏在牌后面的那部分的牌不被选中也解决了只要在MouseUp事件里的循环前加上这两句即可
    _ClientRectangle.Width = _ClientRectangle.Width - 57;
    _ClientRectangle.X = _ClientRectangle.X + 57;结贴
      

  22.   

    //按下
    private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    if(e.Button == MouseButtons.Left)
    {
    mouseOffset = new Point(-e.X , -e.Y);
    isMouseDown  = true;
    }
    }
    //移动
    private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    if (isMouseDown) 
    {
    Point mousePos = Control.MousePosition;
    mousePos.Offset(mouseOffset.X,mouseOffset.Y);
    Location = mousePos;
    }
    }
    //
    private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    if(e.Button == MouseButtons.Left)
    {
    isMouseDown = false;
    }
    }
    我的一个不规则窗体 拖动代码  可以借鉴