подсказка за деактивиран контрол

весели празници!

имам панел за оформление на таблица (10x10). във всяка клетка имам картинна кутия, която е деактивирана (активирано = невярно).

Прихващам движението на мишката върху масата, за да уловя движението на мишката. ето кода:

        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% от процесора. значи има нещо нередно.

също така кодът за промяна на изображението на picturebox спира да работи по някаква причина.

всяка помощ е добре дошла!

Благодаря ти.


person iTEgg    schedule 26.12.2009    source източник
comment
Извършвате страшно много обработка в манипулатора на събития MouseMove... Осъзнавате ли, че се извиква 10-20 пъти в секунда, докато мишката се движи над областта на панела?   -  person Aviad P.    schedule 27.12.2009
comment
да, осъзнавам това, но все още не съм намерил друг начин да го направя. ако премахна кода на подсказката, той се държи нормално и процесорът не се разтяга.   -  person iTEgg    schedule 27.12.2009


Отговори (2)


Няколко мисли:

  • Създавате друг PictureBox, наречен hover - защо? Този код изглежда не прави нищо и почти сигурно ще забави цикъла. Мисля, че искахте просто да декларирате hover и да го преобразувате от c, но всъщност създавате нов екземпляр PictureBox и просто го изхвърляте.
  • Освен това никога не изхвърляте hover, доколкото мога да разбера - така че в крайна сметка разпределяте тонове памет и дръжки на прозорци. Като цяло трябва да избягвате изобщо да създавате нови обекти вътре в манипулатор MouseMove (малките, като тестовете за попадение, понякога са ОК). Както при предишната точка - вероятно не сте искали да напишете new PictureBox().
  • Използвате PointToClient(Control.MousePosition), когато събитието MouseMove вече ви дава специфичната за контрола позиция на мишката (e.X и e.Y). Това ви коства повече време, отколкото би трябвало.
  • Вероятно най-важното е, че извиквате SetToolTip на всеки MouseMove. Трябва да извиквате това само когато подсказката действително е променена. Трябва да зададете флаг за коя клетка или контрола последно е била показана подсказката, да проверите за промени и след това да извикате SetToolTip.
person Aaronaught    schedule 26.12.2009
comment
Добавих тази проверка: if (c.Location != e.Location) {do stuff}, но не получих никакви печалби в производителността. редът: toolTipApp.SetToolTip(tableLayoutPanelTest, tableLayoutPanelTest.GetCellPosition(c).ToString()); все още изяжда процесора. без тази линия натоварването на процесора е 10 - 12%, но с този код достига до 54%. не знам защо. - person iTEgg; 27.12.2009
comment
Първо, вие не уточнявате къде сте добавили този ред; второ, това дори не е надеждна проверка. Позицията на курсора почти никога няма да бъде точният горен ляв пиксел на полето на картината. Както беше посочено по-рано, трябва да съхраните информация за състояние или за реда/клетката на таблицата, или за самата контрола, върху която последно е бил поставен курсора на мишката, и да сравните с това. - person Aaronaught; 27.12.2009
comment
разбирам какво имаш предвид. ще се опита да съхранява по-добра информация за състоянието. работя върху това. ще докладвам, когато направя тази промяна. Благодаря. - person iTEgg; 27.12.2009
comment
вече има напредък! има малки бъгове, но ще го реша и ще го публикувам по-късно. благодаря на всички за помощта. - person iTEgg; 27.12.2009

Ще си върнете много производителност, ако избягвате да задавате текста на подсказката, когато не е променен.

Освен това искам да повторя коментара. Това е много обработка за манипулатор на мишката.

Трябва да се опитате да направите ранен тест, за да видите дали мишката все още е върху същото нещо, което беше при последния ход, и да пропуснете по-голямата част от кода в този случай.

person John Knoeller    schedule 26.12.2009