禁用控制的工具提示

时间:2009-12-26 21:19:35

标签: c# tooltip

节日快乐!

我有一个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。所以有些不对劲。

由于某种原因,图片框图像更改代码也会停止工作。

非常欢迎任何帮助!

谢谢。

2 个答案:

答案 0 :(得分:2)

一些想法:

  • 您正在创建另一个名为PictureBox的{​​{1}} - 为什么?这段代码似乎没有做任何事情,它几乎肯定会减慢循环。我认为您只是声明hover并从hover转发,但实际上您正在创建一个新的c实例并将其丢弃。
  • 据我所知,你也永远不会处理PictureBox - 所以你最终会分配大量的内存和窗口句柄。一般来说,你应该避免在hover处理程序中创建新对象(像命中测试这样的小对象有时候可以)。与前一点一样 - 您可能并不想写MouseMove
  • new PictureBox()事件已经为您提供了特定于控件的鼠标位置(PointToClient(Control.MousePosition)MouseMove)时,您使用e.X。这比你应该花费更多的时间。
  • 可能最重要的是,您在每个 e.Y上调用SetToolTip。您应该只在工具提示实际更改时调用此方法。您需要在上次显示工具提示的单元格或控件上设置标记,检查更改,然后调用MouseMove

答案 1 :(得分:1)

如果您在未更改时设置工具提示文本,则会获得大量性能。

除此之外,我想回应评论。这是对鼠标处理程序的大量处理。

您应该尝试进行早期测试,看看鼠标是否仍然在最后一次移动中,并且在这种情况下跳过大部分代码。