Использование Visual Studio 2010 Express для создания поверхности, на которую я могу нарисовать - PullRequest
2 голосов
/ 29 апреля 2010

Я пришел из Java и пытаюсь перенести простую версию игры жизни Конвея, которую я написал на C #, чтобы выучить язык.

В Java я сделал вывод, унаследовав от JComponent и переопределив paint (). У моего нового класса холста был экземпляр бэкэнда симуляции, который он мог читать / манипулировать. Затем я смог получить редактор графического интерфейса WYSIWYG (Matisse, из NetBeans), который позволил бы мне визуально разместить холст.

В C # я понял, что мне нужно переопределить OnPaint (), чтобы рисовать вещи, которые (насколько я знаю) требуют, чтобы я наследовал от чего-то (я выбрал Panel). Я не могу понять, как получить редактор форм Windows, чтобы я мог разместить свой собственный класс. Я также не уверен, где в сгенерированном коде мне нужно разместить свой класс.

Как я могу это сделать, и действительно ли помещаю весь свой код рисования в подкласс, как я должен поступить? Отсутствие простых ответов в Google говорит о том, что я упускаю что-то важное здесь. Если кто-то хочет предложить метод для этого также в WPF, мне любопытно услышать это.

Спасибо

1 Ответ

2 голосов
/ 29 апреля 2010

В Windows Forms вы можете просто рисовать на любом элементе управления, вызывая его метод CreateGraphics. Если у вас есть панель, например, вы можете рисовать так:

using (var g = panel1.CreateGraphics()) {
    g.DrawString("Hello World", 0, 0);
}

Элементы управления также имеют событие Paint. Добавьте обработчик события, дважды щелкнув событие в окне свойств, и вы можете нарисовать так:

private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
    e.Graphics.DrawString("Hello World", 0, 0);
}

Если вы хотите получить из элемента управления, вы можете просто сделать это в коде, или создать новый пользовательский элемент управления и изменить базовый класс в коде и в файле .Designer.cs (хотя UserControl или просто Control будет хорошо). Если у вас уже есть форма в конструкторе, она уже получена из Form, и вы можете просто переопределить OnPaint.

Мой совет: вам обычно не нужно создавать новый класс, если вы просто хотите что-то нарисовать. Просто используйте событие Paint. Если вам нужно немедленно перерисовать, вызовите Refresh, чтобы сделать перерисовку элемента управления самой. Это должно помочь вам. Обратите внимание, что есть также защищенное свойство DoubleBuffered, которое может помочь вам избежать мерцания (установите его для формы или в производном элементе управления).

Я не уверен, что вы будете делать в WPF. Мне никогда не нужно было рисовать что-то вручную в WPF, так как механизм компоновки и рендеринга очень мощный, и вы можете просто сойти с рук с шаблонами данных, шаблонами элементов управления и т. Д. Суть в WPF в том, что вы обычно ничего не рисуете, двигатель тянет за вас.

...