Тайна производительности WinForms: производный элемент управления PictureBox медленнее, чем оригинал?

В моем проекте .NET 2.0 я создал пустой производный класс System.Windows.Forms.PictureBox:

public class NewPictureBox : PictureBox
{
    //absolutely nothing 
}

Затем я сделал следующее:

  1. установите для свойства Image производного и базового элементов управления довольно большое изображение (800x600), SizeMode равно Normal (отображается только верхняя левая часть);
  2. подключил несколько событий NewPictureBox и PictureBox, чтобы окно выбора можно было нарисовать при перетаскивании мыши по поверхности;
  3. настройте его так, чтобы свойства поля выбора (Width/Height) обновлялись в NumericUpDown элементах управления в режиме реального времени.

Проблема заключается в том, что при очень быстром перетаскивании мыши на производном PB наблюдается значительная «прерывистость» по сравнению с выполнением того же на базовом PB. Значения Width/Height не обновляются в режиме реального времени.

Кто-нибудь знает, почему это так? Как добиться такой же гладкости с производным элементом управления? Спасибо!

Для всех, кто хочет проверить минимальный пример проекта с описанной проблемой:

http://www.mediafire.com/?i2nq2tmmjzx


person Dan7    schedule 28.01.2010    source источник
comment
Я не мог воспроизвести это: мой производный PictureBox работал так же быстро, как и базовый (как и следовало ожидать). Можете ли вы предоставить дополнительную информацию или минимальный полный образец, включая перехваченные события?   -  person itowlson    schedule 28.01.2010
comment
Привет, я загрузил минимальный образец проекта, было бы здорово, если бы вы могли его изучить. Спасибо!   -  person Dan7    schedule 28.01.2010


Ответы (1)


Получение изображения, измененного с помощью PB, чтобы оно соответствовало элементу управления, очень дорого. В GDI+ есть очень хороший фильтр, но он не бесплатный. Измените размер изображения самостоятельно, прежде чем назначать его свойству Image, чтобы PB не приходилось изменять его размер.

Использование растрового изображения, созданного с помощью Format32bppPArgb, также может иметь большое значение, оно в 10 раз быстрее, чем любой другой формат.

person Hans Passant    schedule 28.01.2010
comment
Вы имеете в виду обрезать изображение? Или изменить размер изображения, как при масштабировании? В любом случае, я не могу понять, почему пустой производный класс может вызывать такое разное поведение. Но спасибо за советы, обязательно попробую. - person Dan7; 28.01.2010
comment
Нет, измените его размер, как это делает PB. Эта проблема определенно не вызвана производным классом, это просто не так, как работает WF. - person Hans Passant; 28.01.2010
comment
В моем примере я установил для SizeMode значение Normal, чтобы отображался только верхний левый угол изображения. Но я последовал вашему совету и установил свойство Image на предварительно обрезанное растровое изображение, и оно действительно улучшилось! Тем не менее, в чем разница между базовым элементом управления и производным элементом управления, не делающим ничего нового? - person Dan7; 28.01.2010