buckskinner Ответов: 2

Почему последующие методы для painteventhandler иногда не работают?


Я только начинаю работать над некоторыми графическими формами, скопировал несколько примеров и смог заставить их работать.

PaintEventHandler работает нормально. У меня есть методы, вызванные из PaintEventHandler, которые будут рисовать одну из двух графиков. Они прекрасно работают. Они закомментированы в следующем коде.

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

Я предполагаю, что здесь у меня есть концептуальная ошибка. Может быть, графика просто останется там в застое?

public Form1()
{
    InitializeComponent();
   // chkBxOutlinedSquare.CheckState = CheckState.Checked;
    this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
}

private void Form1_Paint(object sender,
    System.Windows.Forms.PaintEventArgs pe)
{
    // Declares the Graphics object and sets it to the Graphics object
    // supplied in the PaintEventArgs.
    Graphics g = pe.Graphics;

    //outlinedSquare(g);
    //someGraphic(g);

    // Insert code to paint the form here.
    if (chkBxOutlinedSquare.CheckState == CheckState.Checked)
    {
        outlinedSquare(g);
    }

    if (chkBxSomeGraphics.Checked)
    {
        someGraphic(g);
    }
}

private void someGraphic(Graphics g)
{
    LinearGradientBrush linGrBrush = new LinearGradientBrush(
    new Point(0, 10),
    new Point(200, 10),
    Color.FromArgb(255, 255, 0, 0),   // Opaque red
    Color.FromArgb(255, 0, 0, 255));  // Opaque blue

    Pen pen = new Pen(linGrBrush);

    g.DrawLine(pen, 0, 10, 200, 10);
    g.FillEllipse(linGrBrush, 0, 30, 200, 100);
    g.FillRectangle(linGrBrush, 0, 155, 500, 30);

}

private void outlinedSquare(Graphics g)
{
    // Create a new pen.
    Pen skyBluePen = new Pen(Brushes.DeepSkyBlue);

    // Set the pen's width.
    skyBluePen.Width = 8.0F;

    // Set the LineJoin property.
    skyBluePen.LineJoin = System.Drawing.Drawing2D.LineJoin.Bevel;

    // Draw a rectangle.
    g.DrawRectangle(skyBluePen,
        new Rectangle(40, 40, 150, 200));

    //Dispose of the pen.
    skyBluePen.Dispose();

}


Что я уже пробовал:

Я поставил точки останова в обоих методах, и код определенно работает в нужное время. Это просто не очищает графику, когда флажки сняты.

2 Ответов

Рейтинг:
2

Ralf Meier

Ваш вопрос не совсем ясен для меня.
Как правило, если вы хотите, чтобы элемент управления (или форма) перекрашивал себя, иногда вы должны сказать ему об этом. Это может быть сделано (например) с помощью myControl.Аннулировать. Этот метод вызывает вызов Paint-метода из элемента управления (или формы).
Этот ответ является дополнительным к решению, упомянутому Дейвом ...


buckskinner

То, что я искал, заключается в том, что при перекраске, если флажок не был установлен и связанный метод outlinedSquare или someGraphic не был вызван, то перекраска формы закрасила бы фон формы поверх графики, созданной ранее outlinedSquare или someGraphic. Я думал, что перекраска формы сделает это. Первый ответ, кажется, указывает на то, что я должен закрасить то, что я ранее нарисовал. Я возился с этим много лет назад и не помню, чтобы это было так.

Рейтинг:
1

Dave Kreskowiak

Во-первых, вы не избавляетесь от ручки, которую вы создали в someGraphic.

Во-вторых, вы не расчищаете область, в которую вы втягиваетесь outlinedSquare() Эта область, а затем и вся форма очищается, ожидая, когда вы ее нарисуете. Если вам нужно удалить область, которая заполнена только для того, чтобы нарисовать пустой контур, вы должны очистить эту область самостоятельно. Это не будет сделано для тебя.