winforms, .net 3.5, рисование строк, линий и т. д. в пользовательском элементе управления или форме - PullRequest
1 голос
/ 25 января 2012

Я сделал следующее:

public partial class Form1 : Form
{
  public UserControl uc = new UserControl();

  private void Form1_Load(object sender, EventArgs e)
  {
    uc.Width = 100;
    uc.Height = 20;
    uc.BackColor = Color.White;

    uc.Paint += new PaintEventHandler((object s, PaintEventArgs pe) => {
      Graphics g = ((UserControl)s).CreateGraphics();
      g.DrawString("hello", this.Font, Brushes.Black, 0, 0);
    });

    uc.Visible = true;
    this.Controls.Add(uc);

    Bitmap bmp = new Bitmap(uc.Width, uc.Height);
    uc.DrawToBitmap(bmp, uc.ClientRectangle);
    bmp.Save("c:\\my_image.png", System.Drawing.Imaging.ImageFormat.Png);
  }

  private void button1_Click(object sender, EventArgs e)
  {
    Bitmap bmp = new Bitmap(uc.Width, uc.Height);
    uc.DrawToBitmap(bmp, uc.ClientRectangle);
    bmp.Save("c:\\my_image.png", System.Drawing.Imaging.ImageFormat.Png);
  }
}

Теперь я вижу строку "привет", правильно показанную в форме, но файл my_image.png показывает только пустой белый фон.Нажатие кнопки1 имеет тот же результат.Зачем?И более запутанная вещь случается, если я пишу приведенный выше код в VB.NET;при нажатии кнопки 1 исчезает даже белый фон;uc ведет себя так, как если бы он был только что создан, с шириной и высотой, равными 150 пикселей.Чего мне не хватает?

1 Ответ

2 голосов
/ 25 января 2012

Ваш Paint код неверный. Вы передали объект Graphics в PaintEventArgs.
Вам не нужно (и не следует) звонить CreateGraphics.

uc.Paint += new PaintEventHandler((object s, PaintEventArgs pe) => {
      pe.Graphics.DrawString("hello", this.Font, Brushes.Black, 0, 0);
});

Файл изображения, который вы создаете, вероятно, пуст, потому что клиентская область формы еще не была нарисована во время выполнения кода DrawToBitmap в событии Load.

Это должно нормально работать в ответ на нажатие кнопки. Что поднимает вопрос о том, почему код находится в обоих местах для начала.

Трудно сказать, в чем проблема с вашим кодом VB.NET, учитывая, что вы его не показывали. Но было бы неплохо выполнить все это создание / инициализацию UserControl внутри конструктора формы , а не в ответ на событие Load.

...