Я могу приостановить перерисовку формы, пока я не выполнил все обновления?

Измените тип return void на List<String>

public static List<String> allButLast(List<String> list)
{
   List<String> set = new ArrayList<String>();
   String last=set.remove(set.size() - 1);
   set.clear();
   set.add(last);
   return set;
}

или

public static List<String> allButLast(List<String> list)
{
   List<String> set = new ArrayList<String>();
   set.subList(0, set.size() - 1).clear();
   return set;
}
7
задан G-. 12 January 2010 в 08:15
поделиться

5 ответов

НОВЫЙ ответ: Переопределите WndProc и заблокируйте сообщение WM_PAINT при применении новых свойств Window.

СТАРЫЙ ответ: Переопределите WndProc и заблокируйтесь WM_ERASEBKGND сообщение.

Объяснение того, что ниже делает код:

Когда регион окна делается недействительным, Windows отправляет ряд сообщений к управлению, которые приводят к недавно нарисованному виджету. Раннее сообщение в этом ряду WM_ERASEBKGND. Обычно, в ответ на это сообщение, управление красит себя сплошным цветом. Позже, в ответ на WM_PAINT сообщение (который обычно используется нами в событии OnPaint) фактический рисунок сделано. Если этот рисунок будет нетривиален то будет задержка, прежде чем виджет будет обновлен, и Вы получите раздражающее мерцание.

При рассмотрении кода снова я ясно решал другую проблему. Попробуйте этот новый пример. Это заблокирует рисование формы/управления если bAllowPaint флаг сброшен.

НОВЫЙ пример:

    private const int WM_PAINT = 0x000F;

    protected override void WndProc(ref Message m)
    {
        if ((m.Msg != WM_PAINT) ||
            (bAllowPaint && m.Msg == WM_PAINT))
        {
            base.WndProc(ref m);
        }
    }

СТАРЫЙ пример:

    private const int WM_ERASEBKGND = 0x0014;

    protected override void WndProc(ref Message m)
    {
        if (m.Msg != WM_ERASEBKGND) // ignore WM_ERASEBKGND
        {
            base.WndProc(ref m);
        }
    }
9
ответ дан 6 December 2019 в 09:22
поделиться

Попробуйте Форму. Свойство DoubleBuffered. Установите его на 'истинный'.

Кроме того, если Ваша форма имеет какие-либо дочерние элементы управления, также установите DoubleBuffered на истинный для тех также (и детские дети, и т.д., по линии).

Наконец, назовите SuspendLayout перед своими изменениями и ResumeLayout впоследствии. Следует иметь в виду это единственное размещение влияния дочерних элементов управления. При выполнении какого-либо пользовательского рисунка, свойство DoubleBuffered даст Вам больше удара для маркера.

4
ответ дан 6 December 2019 в 09:22
поделиться

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

Попробуйте это: 1. Непрозрачность набора к 0 так форма становится невидимой 2. Измените BackColor, без проблем 3. Измените FormBorderStyle, окно становится воссозданным 4. Измените TransparencyKey, окно становится воссозданным 5. Непрозрачность изменения к 1, окно воссоздается, затем видимое

Например:

  this.Opacity = 0;
  this.BackColor = Color.FromKnownColor(KnownColor.Control);
  this.FormBorderStyle = FormBorderStyle.Sizable;
  this.TransparencyKey = Color.Empty;
  this.Opacity = 1;
4
ответ дан 6 December 2019 в 09:22
поделиться

Способ отправить все "изображение" формы на экран за один шаг состоит в том, чтобы включить DoubleBuffer.

В Конструкторе можно установить ControlStyles

VB.NET:

SetStyle(ControlStyles.DoubleBuffer, True)
0
ответ дан 6 December 2019 в 09:22
поделиться

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

ПРЕДУПРЕЖДЕНИЕ: Я не пропагандирую использование этого метода, но вы можете попробовать его, если действительно хотите. Он помог мне в прошлом.

Win32.LockWindowUpdate(this.Handle);
try
{
   //make your changes here
}
finally
{
  //release the lock
  Win32.LockWindowUpdate((IntPtr)0);
}

Этот код опирается на следующий поддерживающий код:

public class Win32
{
  private Win32() { }

    /// <summary>
    /// Lock ore relase the wndow for updating.
    /// </summary>
    [DllImport("user32")]
    public static extern int LockWindowUpdate(HWND hwnd);
 }
3
ответ дан 6 December 2019 в 09:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: