2013-05-28 3 views
5

Я создал один пользовательский элемент управления Windows Forms, я перетащил его, отбросил панель внутри него, а над панелью я нарисовал график в событии Paint Panel.Панель управления Paint Event не работает для управления пользователями

private void pnlViewer_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.TranslateTransform(pnlViewer.AutoScrollPosition.X, pnlViewer.AutoScrollPosition.Y); 
    e.Graphics.FillRectangle(Brushes.Black, Screen.PrimaryScreen.Bounds); 
    //**draw Y Axis** 
    int y; 
    for (int i = 0; i <= 50; i++) 
    { 
     y = (i * cellHeight) + cellHeight; 
     e.Graphics.DrawLine(new Pen(Color.FromArgb(50, 50, 50)), 
          new Point(0, y), new Point(pageWidth, y)); 
    } 
    //**draw X Axis** 
    int x; 
    for (int i = 0; i < 50; i++) 
    { 
     x = (i * cellWidth) + ribbonWidth; 
     e.Graphics.DrawLine(new Pen(Color.FromArgb(50, 50, 50)), 
          new Point(x, 0), new Point(x, pageHeight)); 
    } 
    DrawWaveForm(e.Graphics); **// Here the actual data of graph will draw** 
} 

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

Я пробовал Invalidate(true), Update(), Refresh() все такие методы, но они были бесполезны.

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

+3

Как вы рисуете в 'DrawWaveForm()' без прохождения объекта 'Graphics'? – Andy

+0

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

+0

Решено ли это сейчас, исправив эту ошибку? –

ответ

3
e.Graphics.DrawLine(new Pen(Color.FromArgb(50, 50, 50)), 
         new Point(0, y), new Point(pageWidth, y)); 

Вы не располагаете объектом System.Drawing в этом коде. Возможно, и в другом коде. Это может остаться незамеченным в течение длительного времени, сборщик мусора имеет тенденцию скрывать проблему. Но если он не работает достаточно часто, операционная система может получить угрюмый о вас, используя так много дескрипторов GDI, и это не позволит вашей программе создавать из них больше. Квота составляет 10 000 ручек, очень большое количество, но легко потребляется, если вы часто перекрашиваете. Обычно при рисовании постоянно обновляемого графика. То, что происходит дальше, меняется, где-то между исключением и замечает, что ваша программа больше не рисует.

Всегда используйте оператор с помощью в живописи кода, чтобы избежать этого режима отказа:

using (var pen = new Pen(Color.FromArgb(50, 50, 50))) { 
    e.Graphics.DrawLine(pen, new Point(0, y), new Point(pageWidth, y)); 
} 
Смежные вопросы