Рисовать в OnPaint надо.
То есть по клику можно добавить координаты и текст в какой-нибудь список (и может быть еще вызвать что-то типа Invalidate()), а в OnPaint выводить этот список.
public class FirstControl : Control
{
public FirstControl() { }
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), ClientRectangle);
}
}
private void pic_MouseUp(object sender, MouseEventArgs e)
{
....
if (index == 6)
{
g.DrawString(Text, Font, new SolidBrush(ForeColor), ClientRectangle);
}
}
private void pic_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.DrawString("Hello", Font, new SolidBrush(Color.Black), 0, 0);
}
(хз что за index, он тут явно странно используется если вам не только один нарисованный объект одновременно отображать надо)
Ну а чтобы рисовать любое количество объектов с указанными пользователем параметрами надо по нажатию кнопки и т.д. не рисовать, а просто добавить в список какой-то объект (см. ООП) с нужными параметрами, и наверно вызвать Invalidate() у pic. А в pic_Paint проходить этот список и рисовать то, что задано там.
Все равно не работает(
Можете, пожалуйста, в файле попробовать исправить?
Насчет index точно не знаю, в видео он в основе использовался, объяснялось, что например метод рисования карандашом линии свободной формы если значение bool paint = true и index == 1, пользователь щелкает и перемещает мышь. MouseUp, mouseMove и pic_Paint как присвоение, а в самой кнопке уже просто index = 1; index = 2 и тд.
Если так делать, то всё предыдущее нарисованное будет пропадать как минимум если свернуть программу или поменять ее размер (ну и при разных других взаимодействиях с элементами формы). Или наоборот, может долго не появляться.