2013-12-15 8 views
0

Я хочу нарисовать форму на загрузке в программе на C#. Должен ли быть следующий код в методе paint()? Что делает InitializeComponent(), точно? то, что я спрашивал, это то, что делает метод InitializeComponent(). В основном я не был уверен, что должно быть переопределение метода OnPaint() или если я могу просто нарисовать, где бы я ни хотел, чтобы мой код нарисовал что-то в форме. LoadForm вызывает DrawIt(), который будет рисовать на форме. Но этот код для краски не содержится ни в одном конкретном методе OnPaint() или Paint().Как нарисовать простую графику

public partial class Form3 : Form 
    { 
     public Form3() 
     { 
      InitializeComponent(); 
     } 

     private void DrawIt() 
     { 
      System.Drawing.Graphics graphics = this.CreateGraphics(); 
      System.Drawing.Rectangle rectangle = new System.Drawing.Rectangle(
       50, 50, 150, 150); 
      graphics.DrawEllipse(System.Drawing.Pens.Black, rectangle); 
      graphics.DrawRectangle(System.Drawing.Pens.Red, rectangle); 
     } 

     private void Form3_Load(object sender, EventArgs e) 
     { 
      DrawIt(); 
     } 
    } 
+0

Получить себе вступительная книга по программированию Winforms. Вы очень плохо понимаете основы, довольно сложно догадаться об этом, а интуиция - не лучший гид. –

ответ

1

Да, вы должны вызывать свой код в событии рисования. зачем это делать? Я думаю, что событие paint автоматически запускается окнами, когда необходимо обновить форму. если вы вызываете свой код в событии form_load, он просто вызывается один раз, а затем, когда форма отображается, форма снова рисуется и покрывает ваш эффект в form_load, поэтому вы не можете видеть результат. так, вы можете ссылаться на свой код в Form_paint() событие или вы можете переопределить OnPaint функцию, они такие же, как показано ниже:

private void DrawIt() 
    { 
     System.Drawing.Graphics graphics = this.CreateGraphics(); 
     System.Drawing.Rectangle rectangle = new System.Drawing.Rectangle(
      50, 50, 150, 150); 
     graphics.DrawEllipse(System.Drawing.Pens.Black, rectangle); 
     graphics.DrawRectangle(System.Drawing.Pens.Red, rectangle); 
     this.Update(); 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     DrawIt(); 
     base.OnPaint(e); 

    } 

    private void MainWindow_Paint(object sender, PaintEventArgs e) 
    { 
     //DrawIt(); 
    } 

результат моего теста, как это: result of drawing

+0

Сохраняется ли защищенное переопределение void OnPaint (PaintEventArgs e) { DrawIt(); base.OnPaint (e); } onPaint просто перерисовывает форму, когда она когда-либо должна быть перекрашена или когда она нуждается в повторной обработке. Вы можете просто вызвать onPaint(), когда хотите перерисовать. Почему приведенный выше пример не вызывает цикл infinte, потому что base.onPaint() вы считаете, что он просто будет называть себя рекурсивным вызовом. –

+0

В моем тестовом приложении он работает хорошо, не вызывает бесконечный цикл, в чем проблема в вашем приложении? –

1

InitializeComponent Метод:

При создании формы VS создает два файла, содержащего один класс (только посмотрите на разделяемые классы):

1) Form.cs который где вы поместите свой код.

2) Form.Designer.cs, который является автоматически генерируемым частичным классом. когда вы помещаете какой-либо компонент в свою форму в проектный вид, VS генерирует необходимые коды для сборки этого компонента во время выполнения этого класса.

InitializeComponent - это автоматически сгенерированный метод в Form.Designer.cs, который инициализирует компоненты, которые вы сбросили в форме. Когда вы вызываете его из своего конструктора, вы просто говорите ему, чтобы он выполнял инициализацию при создании объекта формы.

OnPaint Метод:

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

+0

В Java это repaint(), который вызывает paint() и пару других методов рисования. В VB.NET это можно сделать только в paint(), и что, если я хочу перерисовать пользовательский компонент. Должен ли я просто перерисовать всю форму? –

+1

1) На самом деле Paint - это событие, а не метод. Метод OnPaint - это метод, запускаемый при появлении события Paint. Вы можете переопределить метод OnPaint или просто прикрепить свой собственный метод к событию Paint. 2) Класс формы унаследовал Paint и OnPaint из класса Control, поэтому вы можете сделать это с помощью любого элемента управления, который вы хотите. 3) Обратите внимание, что элементы управления и форма перерисовываются в любом случае! вы просто добавляете свой код в процедуру перерисовывания. – Ali

+0

Вам нужно переопределить его, как показано выше. –

Смежные вопросы