需求,像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
我现在用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
但是放牌的PictureBox没有name
不知道矩形内的PictureBox是什么
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
#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(控件);
你在集合中遍历一下,如果集合中的元素的坐标在矩形范围内,
就是被选中的,在进行相应的操作。
LS代码好多,没细看,注释也少-_-!
鼠标事件当然是这个容器的, 你不应该去抓picturebox的鼠标事件吧
你在集合中遍历一下,如果集合中的元素的坐标在矩形范围内,//54个PictureBox被分成3份,地主20个,其他两个人每人17个你这些picturebox肯定都是放在同个容器里的吧?//不是的,都是单独的,要是容器就是Form窗体``
还有每次出牌后手里的牌的坐标都会重新排列一次,坐标也会变化
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
发牌时候动态生成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表存储下,简单。
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);
} }
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
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
}
}恩 这个应该是你要的意思把.
只要在 Form1_Load 方法里把注释打开,注释掉循环外的事件即可,不过现在鼠标选中的牌还要修改一下,我希望
隐藏在牌后面的那部分的牌就不要被选中了
_ClientRectangle.Width = _ClientRectangle.Width - 57;
_ClientRectangle.X = _ClientRectangle.X + 57;结贴
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;
}
}
我的一个不规则窗体 拖动代码 可以借鉴