Облегченная форма C # с огромным черным мерцанием при изменении размера! - PullRequest
1 голос
/ 25 ноября 2008

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

Я не знаю, как еще объяснить проблему, поэтому вот видео, которое я создал, чтобы продемонстрировать проблему: http://www.screencast.com/t/AIqK9Szmz

Кроме того, вот тестовое решение VS2008 с полным кодом, перерисовывающим границы формы: http://stuff.nazgulled.net/misc/TestForm.zip

Надеюсь, кто-нибудь может помочь мне избавиться от мерцания ...

Ответы [ 7 ]

3 голосов
/ 26 ноября 2008

Если вы хотите, чтобы ваша форма имела неправильную форму, вам придется обратиться к областям (если вы можете легко определить область вашей формы, используя геометрические формы, такие как Круг и Прямоугольник). Создайте объект System.Drawing.Graphics.Region и добавьте к нему фигуры. Я думаю, что свойство в форме называется Region - присвойте ему свой регион, который вы создали.

Другой вариант - использовать многослойные окна. Кто-то сделал всю работу за вас . Многослойные окна не работают в версиях Windows, более старых, чем 2000, но имеют дополнительное преимущество, заключающееся в полупрозрачности.

Последний вариант - использовать WPF и установить AllowsTransparency = "True" WindowStyle = "None". Это приведет к удалению Chrome (Google, как «миллион окон WPF», например, миллион примеров).

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

3 голосов
/ 25 ноября 2008

Вот что я использую в конструкторе моей базовой формы:

this.SetStyle( ControlStyles.AllPaintingInWmPaint, true );
this.SetStyle( ControlStyles.UserPaint, true );
this.SetStyle( ControlStyles.OptimizedDoubleBuffer, true );
this.SetStyle( ControlStyles.ResizeRedraw, true );

Я думаю, что ключом является использование "AllPaintingInWmPaint".

2 голосов
/ 15 марта 2009

(Это решение для Windows Vista; оно работает только при включенной компоновке на рабочем столе.)

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

Чтобы избавиться от мерцания, просто держите крайнюю правую и нижнюю линию пикселей в форме всегда установленной на TransparencyKey - это будет держать новые области прозрачными, пока вы не получите возможность перекрасить их. То есть, сделать форму на 1 пиксель шире и выше необходимой и закрасить дополнительные пиксели прозрачными.

Пример: TransparentForm.zip

1 голос
/ 26 ноября 2008

Вам придется отказаться от использования свойства Form.TransparencyKey, если вы хотите избежать мерцающего неинициализированного мерцания черного наложения видео. Это не делает ничего полезного в вашей программе примера.

0 голосов
/ 14 октября 2011

Чтобы избавиться от мерцания при изменении размера выигрышной формы, приостановите макет при изменении размера. Переопределите методы resizebegin / resizeend форм, как показано ниже.

protected override void OnResizeBegin(EventArgs e) {
    SuspendLayout();
    base.OnResizeBegin(e);
}
protected override void OnResizeEnd(EventArgs e) {
    ResumeLayout();
    base.OnResizeEnd(e);
}

Это оставит элементы управления нетронутыми (как они были до изменения размера) и приведет к перерисовке после завершения операции изменения размера.

0 голосов
/ 26 ноября 2008

Да, и, кстати, использование кода SLIMcode не сработает, если вы не поместите всю логику рисования в override OnPaint (). Если это не кажется знакомым, вы, вероятно, не знаете, что вы можете принудительно попросить перекрасить, вызвав Invalidate () в вашей форме. Задача состоит в том, чтобы преобразовать ваш код в единый метод Paint, но в конечном итоге это приведет к более чистому коду.

0 голосов
/ 26 ноября 2008

Пробовал включить DoubleBuffering?

...