Delphi notes блокування перемальовування вікна на час поновлення його дочірніх вікон

Відкрив для себе повідомлення WM_SETREDRAW. Дозволяє на якийсь час відключити перерисовку контрола (вікна), тим самим позбавити користувача від зайвих мерехтінь, ефекту шлейфу і тому подібного. Застосував у своєму сплітері. тепер при зміні розмірів - краса. Порівняйте дві анімашки (тому що це gif - зберіг у відтінках сірого, інакше з'являються колірні артефакти).

До застосування WM_SETREDRAW:

Тут прекрасно видно, що панель зліва від спліттера не встигає отрісовиваться (та й права відстає).

А це вже після обрамлення коду зі зміни ширини AlignControl'а в WM_SETREDRAW:

Обрамлення в коді виглядає ось так:

Хочу відзначити, що якщо просто перемальовувати батьківський (по відношенню до спліттеру) контрол, наприклад викликом Parent.Repaint - то шлейфів теж не буде, але при цьому з'являється мерехтіння, яке помітно в більш навантажених (ніж на прикладі) контроль випадках.

Цю техніку можна застосовувати в тих випадках, коли в одному вікні необхідно перерасположіть кілька контролів. Ну як приклад, коли в IDE змінюється Layout (Desktop speedsetting) - без блокування малювання користувач бачить неприємні мерехтіння.

І ще одне важливе зауваження: WM_SETREDRAW змінює видимість вікна (воно як би ховається, але при цьому область під вікном - НЕ перемальовується). І якщо вікно вже було приховано, то воно може бути помилково відображено (і навпаки), тому не забувайте перевіряти цей момент.

Так дякую. Такий трюк робити з TForm - в загальному випадку небезпечно (користувач клікнувши в форму мишкою потрапить "під" форму і форма втратить фокус). Тому краще поміщати все контроли на TPanel і "грати" вже з нею.

Однак в конкретному випадку з сплиттером - таке спрацьовування неможливо, тому що цей код працює з уже захопленої мишею

Хоча якщо дуже постаратися - то можна :)
(Є в ньому можливість програмно задати властивість IsSnapped). Тепер ось думаю, що з цим робити.

Гаразд, залишу як є. Всім рада - використовувати панелі або фрейми.

Схожі статті