.NET UserControl: свойство Size дает неверное значение для события Resize - PullRequest
1 голос
/ 24 июня 2009

Извините, дамп кода, это функции внутри UserControl

private void PNGQuantPreviewControl_Resize(object sender, EventArgs e)
{
    createOffScreenBm();
    draw();           
} 
private void createOffScreenBm()
{
    offScreenBm = new Bitmap(this.Size.Width, this.Size.Height);
    offScreenGfx = Graphics.FromImage(offScreenBm);
}
private void draw()
{
    // draw background
    offScreenGfx.FillRectangle(transTexture, 0, 0, offScreenBm.Width, offScreenBm.Height);
    // draw image preview
    offScreenGfx.DrawImage(pngQuantPreview, getTopLeftPosition());
    // apply to picture box
    this.CreateGraphics().DrawImage(offScreenBm, 0, 0);
}

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

Однако, если я быстро изменю размер элемента управления, растровое изображение не заполняет его, слева и / или снизу будет пробел.

Я довольно новичок в C #, так что, вероятно, что-то очевидно, что я делаю не так, или я читаю значения размера не в то время. Есть идеи?

Ответы [ 3 ]

2 голосов
/ 24 июня 2009

Прежде всего вам нужно переписать метод OnPaint или подписаться на событие Paint и нарисовать там все.

Во-вторых, вам не нужно создавать закадровое изображение для двойной буферизации, потому что в .net уже существует класс для таких целей BufferedGraphics .

И, в-третьих, гораздо лучше создать наследник UserControl и включить внутреннюю двойную буферизацию .net, что-то вроде этого:

public UserControl2
{
    SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
}

Используя этот подход, вы получите двойную буферизацию, и все, что вам нужно, это нарисовать графику в методе OnPaint. Подробнее об этом стилях управления можно прочитать в Msdn.

1 голос
/ 24 июня 2009

Рассматривали ли вы переопределение метода OnPaint и размещение кода в этом методе? Это может привести к тому, что код вашего чертежа будет выполнен в любое время, когда необходимо перерисовать элемент управления, независимо от причины.

Событие изменения размера не обязательно ожидает завершения изменения размера родительского контейнера. Когда возникает событие resize, ему нужно подождать, пока код не выйдет, прежде чем он сможет захватить новое событие resize, поэтому, когда окно / элемент управления быстро изменяется, он не может поддерживать все так хорошо, и то, что вы получаете, это последний раз, когда он смог захватить событие, не обязательно конечное состояние элемента управления ... если это имеет смысл.

0 голосов
/ 24 июня 2009

Есть ли у вас что-то вроде сплиттера на вашем контроле или объявлено MinSize или MaxSize?

...