King Boy Ответов: 5

BackgroundImage мерцает при изменении размера формы?


Не могли бы вы помочь мне исправить эту плохую работу? Моя форма имеет изображение в качестве фонового изображения, я использую таймер, чтобы постепенно увеличить размер формы до определенного размера. Затем он остановится и восстановит размер, как и перед запуском таймера. Но во время увеличения размера фоновое изображение моей формы мерцало. Как сделать так, чтобы это было не так?
Большое вам спасибо!

5 Ответов

Рейтинг:
37

Wayne Gaylard

Вы можете попробовать установить для свойства Forms DoubleBuffered значение true.


Manfred Rudolf Bihy

Звучит правдоподобно! 5+

Sergey Alexandrovich Kryukov

Последующий вопрос также получает ответ.
--СА

[no name]

Но я не могу получить доступ к этой охраняемой собственности. Я должен рассказать вам больше о моем коде. У меня есть основная форма с именем " Form1 "(добавленная дизайнером) и форма, которую я упомянул в ОП, она называется" F", она создается кодом (Form F = new Form ()). Форма F является членом данных класса Form1. Теперь в любом месте класса Form1 я могу получить доступ к DoubleBuffered (this.DoubleBuffered), но это не то, что я хочу, я хочу сделать то же самое с формой F, но я не могу получить доступ к DoubleBuffered формы F, что мне делать?
Большое вам спасибо!

Sergey Alexandrovich Kryukov

Да, ты можешь!

Уэйн, ты прав, мой 5-й, но король мальчик запутался в доступе к этой функции, которая нуждается в объяснении.
Я ответил: "пожалуйста, посмотрите мое" дополнительное " решение.
--СА

BobJanova

Короткий ответ (читайте решение Сака для длинного): сделайте свою форму 'F' экземпляром производного класса и установите ControlStyle в конструкторе.

udhayaCSE from Chennai

Для меня это прекрасно работает

[no name]

Спасибо! Я думаю, что у меня может быть некоторая путаница с "защищенным", в Cpp я помню, что он устанавливает прямую связь между основанными и производными классами. Я подчеркиваю слово "прямой" и предполагаю, что в C#, если это так, мы не можем получить доступ к DoubleBuffered (защищенному свойству элемента управления классом) в классе, не производном от элемента управления классом, но на самом деле мы можем это сделать. Вот почему я могу думать, что "прямое отношение" не обитает в C#, не так ли?
Большое вам спасибо!

Рейтинг:
35

Sergey Alexandrovich Kryukov

Ответ на последующий вопрос:

Но я не могу получить доступ к этой охраняемой собственности.
Ты можешь всегда доступ и установка функции двойного буфера.

Для элементов управления (в том числе Form): не используйте предопределенное управление. Создайте производный класс и используйте его в своей форме вместо исходного. Воспользуйся System.Windows.Forms.Control.SetStyle. Добавьте стиль System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer | System.Windows.Forms.ControlStyles.AllPaintingInWmPaint.

Что касается формы-о чем вы говорите? Вы уже используете класс, производный от System.Windows.Forms.Form, так что любые защищенные члены доступны для вас.

Тем не менее, подумайте о своем решателе проблем с мерцанием. Попробуй!

—СА


[no name]

Спасибо SA, вы еще раз выручайте меня! Ваша уловка заключалась в основном в том, чтобы помочь мне получить доступ к защищенному методу Control.SetStyle, как только я смогу это сделать, мерцание исчезнет. Но в данном случае я действительно не могу различить «частный» и «защищенный». Вроде они такие же. Как я думал раньше, «защищенный» означает, что любые объекты (например, моя форма «F») напрямую унаследованного класса (например, класса Form) смогут получить доступ к защищенным членам (например, DoubleBuffered или SetStyle) базового класса. (как класс Control). Я думаю, что класс Form не наследует Control напрямую (но сначала через ScrollableControl и ContainerControl), поэтому мы никогда не должны были иметь доступ к DoubleBuffered где-либо (но я могу сделать это в классе Form1, унаследованном от Form, с помощью this. DoubleBuffered "), я попытался создать новый объект Form1 и получить доступ к DoubleBuffered вне класса, но не смог. Вот почему я думаю, что «защищенный» в данном случае скорее похож на «частный»? Или мне не хватает некоторых знаний о модификаторе «защита»?
Большое спасибо за решение моей проблемы, а также тому, кто дает Решение 1!
Если вы не можете понять, что я хочу сказать, Пожалуйста, дайте мне знать, я опубликую некоторый код, чтобы сделать проблему более ясной!

Sergey Alexandrovich Kryukov

Нет, просто почитай об этом.

Private - только этот класс, Internal-добавляет все производные классы, public-доступ отовсюду, internal-то же, что public, но нет доступа из других сборок, internal protected-то же, что protected, но нет доступа из других сборок. 5 из них, все разные.

Теперь "форма не наследует контроль напрямую". Прямо или нет-это происходит от контроля. Для доступности прямо= = косвенно.

Это понятно? Я думаю, что понял все ваши проблемы здесь и решил их все. Теперь все ясно?
--СА

[no name]

Все модификаторы мне понятны, кроме "protected" (конечно, внутренняя защита-это комбинированное использование). Чтобы подтвердить то, что я узнал, я хотел бы привести пример. Предположим, что у меня есть 4 класса D, производных от C, C, производных от B, B, производных от A, и "a" является защищенным членом A. В C++ я узнал, что мы можем получить доступ только к "a" в классах A (конечно) и B. Мы не можем получить доступ к нему в классах C и D. Но в C# мы можем получить доступ к "a" во всех 4 классах.
Если вы не возражаете, Пожалуйста, подтвердите вышесказанное для меня?
Большое вам спасибо!

Sergey Alexandrovich Kryukov

Правильный. Напишите эти несколько строк кода, и вы увидите, что "а" доступно во всех классах. Не только в C# и не только в .NET, но, вероятно, и во всех ООП. Прямое или косвенное наследование - не имеет значения. Если подумать, это практически разумно. Как я уже сказал, для доступности, прямо= = косвенно.
--СА

Рейтинг:
1

Nick Reshetinsky

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


Adra Fkja

как ?

Рейтинг:
1

venkynataraj

Добавьте код
это.ResizeRedraw = истина;
на событие load и в случае ResizeEnd добавьте следующий код
этот.Освежить();


Рейтинг:
1

Member 11945108

я использую код, как показано ниже

Private Sub Form1_Resize(sender As Object, e As EventArgs) Handles MyBase.Resize
      Dim bgfile = Me.BackgroundImage
      Me.SuspendLayout()
      Me.BackgroundImage = Nothing
      Me.BackgroundImage = bgfile
      Me.ResumeLayout()
  End Sub


[no name]

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

satheeshkumar2022

Он хорошо работает