节日快乐!
我有一个tablelayoutpanel(10x10)。在每个单元格内,我有一个禁用的图片框(启用= false)。
我抓住鼠标移动到桌子上以捕捉鼠标移动。这是代码:
private void tableLayoutPanelTest_MouseMove(object sender, MouseEventArgs e)
{
if (!placeShip)
{
c = tableLayoutPanelTest.GetControlFromPosition(homeLastPosition.Column, homeLastPosition.Row);
if (c.GetType() == typeof(PictureBox))
{
PictureBox hover = new PictureBox();
hover = (PictureBox)(c);
hover.Image = Properties.Resources.water;
}
Point p = tableLayoutPanelTest.PointToClient(Control.MousePosition);
Control picControl = tableLayoutPanelTest.GetChildAtPoint(p);
if (picControl != null)
{
TableLayoutPanelCellPosition me = tableLayoutPanelTest.GetCellPosition(picControl);
if (picControl.GetType() == typeof(PictureBox))
{
PictureBox thisLocation = new PictureBox();
thisLocation = (PictureBox)(picControl);
thisLocation.Image = Properties.Resources.scan;
homeLastPosition = me;
}
}
}
toolTipApp.SetToolTip(tableLayoutPanelTest, tableLayoutPanelTest.GetCellPosition(c).ToString());
}
当我运行它时,tooTipApp开始消耗高达56%的CPU。所以有些不对劲。
由于某种原因,图片框图像更改代码也会停止工作。
非常欢迎任何帮助!
谢谢。答案 0 :(得分:2)
一些想法:
PictureBox
的{{1}} - 为什么?这段代码似乎没有做任何事情,它几乎肯定会减慢循环。我认为您只是声明hover
并从hover
转发,但实际上您正在创建一个新的c
实例并将其丢弃。PictureBox
- 所以你最终会分配大量的内存和窗口句柄。一般来说,你应该避免在hover
处理程序中创建新对象(像命中测试这样的小对象有时候可以)。与前一点一样 - 您可能并不想写MouseMove
。new PictureBox()
事件已经为您提供了特定于控件的鼠标位置(PointToClient(Control.MousePosition)
和MouseMove
)时,您使用e.X
。这比你应该花费更多的时间。e.Y
上调用SetToolTip
。您应该只在工具提示实际更改时调用此方法。您需要在上次显示工具提示的单元格或控件上设置标记,检查更改,然后调用MouseMove
。答案 1 :(得分:1)
如果您在未更改时设置工具提示文本,则会获得大量性能。
除此之外,我想回应评论。这是对鼠标处理程序的大量处理。
您应该尝试进行早期测试,看看鼠标是否仍然在最后一次移动中,并且在这种情况下跳过大部分代码。