Как предотвратить визуальное отставание элементов управления при изменении размера внутри TableLayoutPanel? - PullRequest
1 голос
/ 26 августа 2009

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

Есть ли способ предотвратить это или это лучшее, что может TableLayoutPanel сделать?

Редактировать : Поэкспериментировав с кучей программ, я пришел к выводу, что задержка при изменении размера является вездесущей проблемой. Мне кажется, что все смирились с тем, что это неизбежно и приемлемо . Конечно, если на самом деле неизбежно , тогда принимает , это намного проще:)

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

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

Ответы [ 3 ]

1 голос
/ 27 августа 2009

Проблема с собственными элементами управления в окнах заключается в том, что каждый элемент управления отвечает за рисование, что означает рисование растрового изображения на экране. При изменении размера каждого элемента управления в контейнере область окна, которую он занимает, становится недействительной, поэтому не только каждый элемент управления в контейнере перерисовывается, но и сам контейнер должен перерисовываться. Кроме того, все события resize / repaint происходят в потоке пользовательского интерфейса, поэтому это однопотоковая операция. Основные механизмы рисования собственных окон не изменились, поскольку 16-битные окна представили его.

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

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

Если WPF не поддерживается, а вы используете формы Windows, обратитесь к документации layout от Microsoft. Вы можете реализовать свой собственный механизм компоновки, а не полагаться на готовые предложения Microsoft.

0 голосов
/ 17 ноября 2017

Set DoubleBuffered = true.Вы можете установить его на формах.

0 голосов
/ 03 октября 2009

Это кажется невозможным вообще, включая WPF (что на самом деле еще хуже - см. этот вопрос). Qt может избежать такого лага, кроме случаев, когда Aero включен. Вздох ...

...