一千萬個為什麽

搜索

禁用控制的工具提示

節日快樂!

我有一個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。所以有些不對勁。

由於某種原因,圖片盒圖像更改代碼也停止工作。

任何幫助非常歡迎!

謝謝。

最佳答案

一些想法:

  • 您正在創建另一個名為 hoverPictureBox - 為什麽?這段代碼似乎沒有做任何事情,而且幾乎可以肯定會減慢循環速度。我想你只是聲明 hover 並從 c 轉換它,但你實際上是在創建一個新的 PictureBox 實例並將它扔掉
  • 據我所知,你也永遠不會處理 hover - 所以你最終會分配大量的內存和窗口句柄。一般來說,你應該避免在 MouseMove 處理程序中創建新對象(像命中測試這樣的小對象有時候可以)。與前一點一樣 - 您可能並不打算編寫 new PictureBox()
  • MouseMove 事件已經為您提供控件特定的鼠標位置( eX時,使用 PointToClient(Control.MousePosition) > EY </代碼>)。這比你應該花費更多的時間。
  • 可能是最重要的,你在每個 MouseMove 上調用 SetToolTip 。您應該只在工具提示實際更改時調用此方法。您需要在上次顯示工具提示的單元格或控件上設置一個標誌,檢查更改,然後調用 SetToolTip

轉載註明原文: 禁用控制的工具提示