Рисование фигур без Visual studio designer. Фигуры не отображаются и события не запускаются

#c#

#c#

Вопрос:

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

Следуя некоторым руководствам по формам, в которых не использовалась никакая Visual Studio (и да, я знаю, что с ней намного проще, но использование таких вещей в прошлом меня подводило, поэтому хочу учиться без) Я создал форму и тому подобное, но когда дело дошло до фактического рисования фигур, я уперся в стену.

Я провел небольшую отладку, из того, что я смог определить, событие вообще не запускается. И графический код в функции main ничего не делает, отображается просто пустая форма. Я попробовал пару вариантов как основного кода, так и кода события, который виден в коде, я также попытался использовать вариант события, в котором использовался аргумент «sender», понятия не имею, изменило ли это что-либо, ни один из них все равно не сработал.

 using System;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;
using System.Workflow.ComponentModel;

class Genetics : Form
{

    public static Form form1;
    static void Main(string[] args)
    {

        form1 = new Form();
        form1.Size = new Size(800, 800);

        Pen blackpen = new Pen(Color.Black, 10);
        Graphics G = form1.CreateGraphics();

        G.DrawRectangle(blackpen, form1.Width - form1.Width / 2, form1.Width - form1.Width / 2, 300, 300);

      form1.CreateGraphics().DrawRectangle(blackpen, form1.Width -    form1.Width / 2, form1.Width - form1.Width / 2, 300, 300);

        Application.Run(form1);


    }

    protected override void OnPaint(PaintEventArgs e)
    {        
        Graphics graphics;
        graphics = form1.CreateGraphics();

        Pen mypen = new Pen(Color.Black, 5);

        graphics.DrawLine(mypen, 20, 20, 200, 210);

        e.Graphics.DrawRectangle(mypen, 20, 20, 200, 210);

    }


}
  

Я не получаю никаких ошибок или чего-то еще, это просто… Ничего не делает, кроме отображения формы, но это что-то вроде абсолютного минимума.

Я знаю, что это, вероятно, легко исправить, но опять же, во всех руководствах использовались формы Visual studio, и я не уверен, был ли код другим. Поскольку я пытался напрямую скопировать этот код, и это выдало мне ошибки, я предполагаю, что я прав, но не уверен на 100%. И у меня достаточно опыта, я просто привык писать в unity, хотя процесс перехода оттуда к чистому коду был для меня трудным.

Комментарии:

1. Не создавайте новый Graphics объект, используйте тот, который указан в вашем PaintEventArgs ( e.Graphics ). Если по какой-либо причине вы когда-либо создадите новую Graphics (чего здесь делать не нужно — просто повторите), убедитесь, что вы Dispose это сделали (обычно с помощью using инструкции). Графические объекты переносят контексты устройств Win32, и их необходимо активно освобождать.

2. Вам нужно взять книгу или следовать руководству, графика WinForm слишком сложна, чтобы угадать ваш путь.

3. Да, послушай @DourHighArch. Я только что посмотрел на вашу Main функцию (изначально я смотрел только на вашу OnPaint ). Создавать Graphics там бесполезно, как и пытаться рисовать на вашей форме (хотя Form объект создан, пока вы не вызовете Application.Run его (и не запустится множество закулисного кода), у вас нет окна, поэтому рисовать не на чем. В Windows Forms вы должны выполнять все свои отрисовки OnPaint с помощью e.Graphics . Вы контролируете время OnPaint выполнения, тщательно делая недействительными части вашего окна. Все это восходит к Win32 (который WinForms переносит)

4. @Flydog57 Хм, я вообще-то хочу найти учебные пособия, проблема была только в том, что я увидел разницу между использованием встроенных функций visual Studio и просто чистым их кодированием. Насколько велика разница? И есть ли разница вообще? Просто спрашиваю tp, действительно ли можно использовать учебные пособия, использующие функциональные возможности Visual Studio, когда дело доходит до форм.

5. @TaW Привет, просто хотел поблагодарить тебя, выяснение того, что код для конструктора существовал (хотя и немного скрытый) в файле .cs, очень помогло, и я заставил свой скрипт работать. Так что спасибо 🙂

Ответ №1:

На всякий случай, если кто-то, кроме меня, искал это, проблема заключалась в двух основных вещах: 1, события ни с чем не были связаны, поэтому мне нужно было добавить строку, подобную этой:

 [Form variable].[form event]  = new PaintEventHandler([Class].[Method with an object sender and an event argument]
//Example of that
form1.Paint  = new PaintEventHandler(Genetics.Paint);
  

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

2, в основном повторение комментариев, мне нужно было иметь все функции рисования в events, поскольку им не на чем будет рисовать, до фактического запуска приложения. Тогда остается только аннулировать код внутри этих событий, чтобы принудительно перерисовать форму.