Проблема отрисовки графики для пользовательского контроля - PullRequest
2 голосов
/ 14 ноября 2008

Мое приложение выскакивает форму как дочерний элемент основной формы. На форме есть
Пользовательский элемент управления с панелью, на которой отображается графика. Когда выполнено из Visual Studio в режиме отладки рисунок часто отображается, как и ожидалось, представьте себе просто XY график. Если изображение панели не нарисовано, то добавление две или три точки останова в процедурах рисования обычно решают проблему.

При выполнении внутри Visual Studio в режиме выпуска или из the.exe в любом режиме, графика никогда не отображается, хотя метод рисования пользовательского элемента управления называется. Изменение размера формы вызывает повторный вызов, конечно, и изображение теперь отображается правильно.

Может кто-нибудь дать мне некоторое представление о том, почему есть разница в поведении между режимами Debug и Release, от исполнения внутри VS и вне стороны VS, любой, почему точки останова иногда исправляют вещи? И как я могу получить графика должна быть постоянно видимой.

Спасибо

Rick

альтернативный текст http://img160.imageshack.us/my.php?image=profilebeforeresizeti4.png альтернативный текст http://img512.imageshack.us/my.php?image=profileafterresizenw2.png

Ответы [ 2 ]

1 голос
/ 25 ноября 2009

Я только что обернулся, и он сделал то, что ожидал в режиме релиза. , , он заполняет панель цветом Blue и большим желтым эллипсом. Пожалуйста, опубликуйте минимальное количество примера кода, необходимого для воспроизведения проблемы. , , возможно построение от MyPanel ниже.

Роль таймера заключается в том, чтобы мы не перерисовывали слишком часто. Это самозавершающийся таймер, который вызывает перерисовку всего элемента управления. Это необходимо, потому что пользовательские размеры нарисованного содержимого с помощью элемента управления.

   public class MyPanel : Panel
    {
        Timer _resizeRedrawDelayTimer = new Timer();
        public MyPanel()
        {
            _resizeRedrawDelayTimer.Interval=50;
            _resizeRedrawDelayTimer.Tick += new EventHandler(_resizeRedrawDelayTimer_Tick);
        }

        void _resizeRedrawDelayTimer_Tick(object sender, EventArgs e)
        {
            Invalidate();
            _resizeRedrawDelayTimer.Stop();
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            // don't redraw if still resizing.
            if (!_resizeRedrawDelayTimer.Enabled)
            {
                e.Graphics.FillRectangle(Brushes.Blue, this.ClientRectangle);
                e.Graphics.FillEllipse(Brushes.Yellow, this.ClientRectangle);
            }
            base.OnPaint(e);
        }

        protected override void OnResize(EventArgs eventargs)
        {
            if (_resizeRedrawDelayTimer.Enabled)
                _resizeRedrawDelayTimer.Stop();
            // restart the timer.
            _resizeRedrawDelayTimer.Start();
            base.OnResize(eventargs);
        }
    }
1 голос
/ 14 ноября 2008

Без дополнительной информации я не могу точно сказать, почему вы видите разницу в поведении (я бы сказал, что вы видите ту же проблему, поскольку вы признаете, что отладочная версия тоже не всегда работает), но вы можете найти что точки останова часто «исправляют» проблемы с рисованием, потому что переключение обратно в Visual Studio приводит к аннулированию всей поверхности рисования, а не только небольшой части. Таким образом, вы открываете приложение, и оно не рисует правильно, вы попадаете в точку останова в Visual Studio, переключаетесь на просмотр некоторых переменных, возвращаетесь к приложению, и оно отображается правильно, потому что OnPaint был вызван с соответствующим прямоугольником отсечения, чтобы перекрасить всю поверхность (и OnPaintBackground также обычно вызывается, см. ниже).

Если это так, вы должны быть в состоянии воспроизвести его в версии выпуска, свернув и восстановив приложение. Если это «исправляет» отображение вашего элемента управления, то это, вероятно, вызвано проблемой с вашим методом рисования, предполагающим, что он рисует весь элемент управления, когда его может не быть.

Вы также можете заглянуть в PaintBackground, чтобы убедиться, что вы стираете поверхность элемента управления должным образом. Возможно, вы оставляете свой старый дисплей и перерисовываете его поверх, а не начинаете со «свежего» холста.

На основании вашего описания того, что происходит, и того, как вы его перерисовываете, это мои лучшие предложения. Чтобы получить более точную помощь, мне потребуются более конкретные сведения (код рисования, конкретное описание того, что происходит - элемент управления не нарисован или отображаются только части и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...