2008-11-13 6 views
2

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

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

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

Спасибо,

Рик

alt text http://img160.imageshack.us/my.php?image=profilebeforeresizeti4.pngalt text http://img512.imageshack.us/my.php?image=profileafterresizenw2.png

ответ

1

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

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

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

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

1

Я просто дал это вихрь, и он сделал то, что я ожидал в режиме выпуска. , , он заполняет панель цветом 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); 
     } 
    } 
Смежные вопросы