接触C# 不到一个月 基础也挺糟糕,现碰到一个问题:当我运行程序后 有意的快速移动鼠标就会出现图1的bug,我大概知道是因为鼠标的MouseMove事件无法及时响应导致的。有什么方法能避免这个bug吗,希望得到大家的指点。感谢!
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace FinalTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public int lattice_w = 0;//定义一个整型变量用来接收鼠标每次移动后所占的格子列数
public int lattice_h = 0;//定义一个整型变量用来接收鼠标每次移动后所占的格子行数
public List<Button> btnList = new List<Button>();//用来存放所有按钮控件的集合
private bool ischanged = true;
private void btn_MouseMove(object sender, MouseEventArgs e)
{
Button btn = (Button)sender;//将object参数对象转换成Button
this.panel1_MouseMove(this, new MouseEventArgs(MouseButtons.Left, 0, btn.Location.X + e.X, btn.Location.Y + e.Y, 0));
}
int w = 0, h = 0;
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
w = (int)Math.Ceiling((decimal)(e.X) / 26);//获得鼠标光标位置对应的列数(26为每个矩形框尺寸加上距离另一个矩形框间距的总长)
h = (int)Math.Ceiling((decimal)(e.Y) / 26);//获得鼠标光标位置对应的行数
if ((w * h) > 16)
{
if (lattice_w > w) //列数较上一次鼠标位置向左边方向移进 这一步把之前着色的最后两列染成白色(因为有(w * h) > 16这个前提)
{
for (int i = 0; i < lattice_h; i++)
{
for (int j = 0; j < lattice_w; j++) // j的范围是[0,w]的整数 w = lattice_w - 1
{
if (j >= w) // j的范围是[0,w]的整数 w = lattice_w - 1
{
btnList[i * 11 + j].FlatAppearance.BorderColor = Color.White; //最右边的一列着色为白色
}
else
{
btnList[i * 11 + j].FlatAppearance.BorderColor = Color.Red;
}
}
}
}
else // 列 较上一次鼠标位置向右方移动或不变
{
for (int i = 0; i < lattice_h; i++)
{
for (int j = 0; j < w; j++)
{
btnList[i * 11 + j].FlatAppearance.BorderColor = Color.Red;
}
}
}
if (lattice_h > h) //行数方向 鼠标位置向上方移动
{
for (int i = h; i < lattice_h; i++)
{
for (int j = 0; j < lattice_w; j++)
{
btnList[i * 11 + j].FlatAppearance.BorderColor = Color.White;
}
}
}
else
{
for (int i = lattice_h; i < h; i++)
{
for (int j = 0; j < lattice_w; j++)
{
btnList[i * 11 + j].FlatAppearance.BorderColor = Color.Red;
}
}
}
} //if ((w * h) > 16) 结尾
else
{
if (lattice_w > w)
{
for (int i = 0; i < lattice_h; i++)
{
for (int j = 0; j < lattice_w; j++)
{
if (j >= w) // j的范围是[0,w]的整数 w = lattice_w - 1
{
btnList[i * 11 + j].FlatAppearance.BorderColor = Color.White;
}
else
{
btnList[i * 11 + j].FlatAppearance.BorderColor = Color.Lime;
}
}
}
}
else
{
for (int i = 0; i < lattice_h; i++)
{
for (int j = 0; j < w; j++)
{
btnList[i * 11 + j].FlatAppearance.BorderColor = Color.Lime;
}
}
}
if (lattice_h > h)
{
for (int i = h; i < lattice_h; i++)
{
for (int j = 0; j < lattice_w; j++)
{
btnList[i * 11 + j].FlatAppearance.BorderColor = Color.White;
}
}
}
else
{
for (int i = lattice_h; i < h; i++)
{
for (int j = 0; j < lattice_w; j++)
{
btnList[i * 11 + j].FlatAppearance.BorderColor = Color.Lime;
}
}
}
}
lattice_w = w;
lattice_h = h;
label1.Text = h + "行 X " + w + "列";
}//panel1_MouseMove()结尾
private void Form1_Load(object sender, EventArgs e)
{
foreach (Control control in panel1.Controls)
{
control.MouseMove += new MouseEventHandler(btn_MouseMove);//加载窗体时,将panel中每个button对应的鼠 标移动事件传递给父级控件panel1
//control.MouseLeave += new EventHandler(panel1_MouseLeave);
((Button)control).FlatStyle = FlatStyle.Flat;
((Button)control).FlatAppearance.BorderColor = Color.White;//初始化按钮边框样式
//btnList.Add((Button)control);//将所有按钮控件添加到集合里面
//Console.WriteLine(((Button)control).Name + "-------");
}
//Console.WriteLine(panel1.Controls.Count);
btnList.Add(button1);
btnList.Add(button2);
btnList.Add(button3);
btnList.Add(button4);
btnList.Add(button5);
btnList.Add(button6);
btnList.Add(button7);
btnList.Add(button8);
btnList.Add(button9);
btnList.Add(button10);
btnList.Add(button11);
btnList.Add(button12);
btnList.Add(button13);
btnList.Add(button14);
btnList.Add(button15);
btnList.Add(button16);
btnList.Add(button17);
btnList.Add(button18);
btnList.Add(button19);
btnList.Add(button20);
btnList.Add(button21);
btnList.Add(button22);
btnList.Add(button23);
btnList.Add(button24);
btnList.Add(button25);
btnList.Add(button26);
btnList.Add(button27);
btnList.Add(button28);
btnList.Add(button29);
btnList.Add(button30);
btnList.Add(button31);
btnList.Add(button32);
btnList.Add(button33);
btnList.Add(button34);
btnList.Add(button35);
btnList.Add(button36);
btnList.Add(button37);
btnList.Add(button38);
btnList.Add(button39);
btnList.Add(button40);
btnList.Add(button41);
btnList.Add(button42);
btnList.Add(button43);
btnList.Add(button44);
btnList.Add(button45);
btnList.Add(button46);
btnList.Add(button47);
btnList.Add(button48);
btnList.Add(button49);
btnList.Add(button50);
btnList.Add(button51);
btnList.Add(button52);
btnList.Add(button53);
btnList.Add(button54);
btnList.Add(button55);
btnList.Add(button56);
btnList.Add(button57);
btnList.Add(button58);
btnList.Add(button59);
btnList.Add(button60);
btnList.Add(button61);
btnList.Add(button62);
btnList.Add(button63);
btnList.Add(button64);
btnList.Add(button65);
btnList.Add(button66);
btnList.Add(button67);
btnList.Add(button68);
btnList.Add(button69);
btnList.Add(button70);
btnList.Add(button71);
btnList.Add(button72);
btnList.Add(button73);
btnList.Add(button74);
btnList.Add(button75);
btnList.Add(button76);
btnList.Add(button77);
btnList.Add(button78);
btnList.Add(button79);
btnList.Add(button80);
btnList.Add(button81);
btnList.Add(button82);
btnList.Add(button83);
btnList.Add(button84);
btnList.Add(button85);
btnList.Add(button86);
btnList.Add(button87);
btnList.Add(button88);
btnList.Add(button89);
btnList.Add(button90);
btnList.Add(button91);
btnList.Add(button92);
btnList.Add(button93);
btnList.Add(button94);
btnList.Add(button95);
btnList.Add(button96);
btnList.Add(button97);
btnList.Add(button98);
btnList.Add(button99);
btnList.Add(button100);
btnList.Add(button101);
btnList.Add(button102);
btnList.Add(button103);
btnList.Add(button104);
btnList.Add(button105);
btnList.Add(button106);
btnList.Add(button107);
btnList.Add(button108);
btnList.Add(button109);
btnList.Add(button110);
btnList.Add(button111);
btnList.Add(button112);
btnList.Add(button113);
btnList.Add(button114);
btnList.Add(button115);
btnList.Add(button116);
btnList.Add(button117);
btnList.Add(button118);
btnList.Add(button119);
btnList.Add(button120);
btnList.Add(button121);

}
private void panel1_MouseLeave(object sender, EventArgs e)
{
/*Console.WriteLine("1111111111111111111111111111111");
label1.Text = "0 X 0";
foreach (Control control in panel1.Controls)
{
((Button)control).FlatAppearance.BorderColor = Color.White;
}*/
//lattice_h = 0; //每当鼠标从panel移出时,重置lattice_h和lattice_w数值为0
//lattice_w = 0;
}
//由于子线程去更新数据,界面刷新需要在主线程空闲的时候才回去更新数据。当鼠标在移动时,主线程会开辟部分资源去等待响应鼠标事件(这块资源挺大,因为CPU一下子从1涨到了8左右),当子线程刷新数据源过多时,导致CPU属性通知资源不足,从而界面卡死不更新。
}
}
事件不存在即使响应,就是只要你触发事件 他就会发消息处理 有异常是多个事件逻辑的问题 看看代码逻辑 自己屡屡
有个办法是
假设间隔为一秒
先记录下鼠标的当前坐标
过1秒后再记录下鼠标当前坐标
两坐标距离除以1秒的时间就是鼠标的移动速度
判断移动速度是否超标,若超标则执行指定函数......