DoubleBuffered SplitContainer не показывает перетаскиваемый сплиттер

У меня есть SplitContainer, который нуждается в DoubleBuffer-ове для всего элемента управления.

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

using System.Windows.Forms;

class BufferedSplit : SplitContainer
{
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED
            return cp;
        }
    }
}

К сожалению, это приводит к странному побочному эффекту: если вы перемещаете сплиттер, он больше не анимирует / обновляет до тех пор, пока вы не отпустите кнопку мыши, что затруднит определение фактического изменения размера элемента управления. Я предполагаю, что это потому, что все перерисовки теперь выполняются за пределами экрана перед отображением в интерфейсе пользователя.
(Этот эффект легче увидеть, если вы установите весь цвет сплита SplitContainer на что-то вроде серого, а затем установите каждую отдельную панель на белый, чтобы вы могли четко видеть сплиттер).

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

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

    var objMethodInfo = typeof(Control).GetMethod("SetStyle", BindingFlags.NonPublic | BindingFlags.Instance);

    var objArgs = new object[] { ControlStyles.AllPaintingInWmPaint |
                             ControlStyles.UserPaint |
                             ControlStyles.OptimizedDoubleBuffer, true };

    objMethodInfo.Invoke(Panel1, objArgs);
    objMethodInfo.Invoke(Panel2, objArgs);
}

Могу ли я дважды буферизовать весь элемент управления SplitContainer, а также правильно ли анимировать сплиттер при его перетаскивании?

WPF не вариант!

0 ответов

Другие вопросы по тегам