powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / MDI приложение моргает при перерисовке, как добиться "сглаженности"?
7 сообщений из 7, страница 1 из 1
MDI приложение моргает при перерисовке, как добиться "сглаженности"?
    #39804655
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Смог добиться создания, удаления окон, обновления данных в MDI окнах без морганий
...вот таким способом:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
  private
    { Private declarations }
    FMainFormOnLock: Boolean;

function TMainForm.LockDrawing(const AIgnoreLock: Boolean = False): Boolean;
begin
  Result := False;
  if (not FMainFormOnLock) or (AIgnoreLock) then
    try
      LockWindowUpdate(Self.Handle);
    finally
      FMainFormOnLock := True;
      Result := True;
    end;
end;

procedure TMainForm.UnLockDrawing;
begin
  TimerUnlockDrawing.Enabled := False;
  TimerUnlockDrawing.Enabled := True;
end;

procedure TMainForm.TimerUnlockDrawingTimer(Sender: TObject);
begin
  try
    TimerUnlockDrawing.Enabled := False;
    LockWindowUpdate(0);
  finally
    FMainFormOnLock := False;
  end;
end;

//затем в любом месте:
  try
    MainForm.LockDrawing();
    //обновлялки-рисовалки
  finally
    MainForm.UnLockDrawing()
  end;


Программа стала выглядеть "собранной", все контролы на окне единовременно прорисовываются, все ок.
Но в некоторых случаях, например, при изменении размера, при разворачивании окна из свернутого состояния, даже просто при возврате в приложение из другого, жуткая перерисовка, контролы все моргают, "проявляются" по очереди, раздражает, выглядит недоработано. Используется Devexpress и скины.
Как то можно это моргание побороть?
Спасибо!
...
Рейтинг: 0 / 0
MDI приложение моргает при перерисовке, как добиться "сглаженности"?
    #39804677
luigi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Devillio,

Есть такая же проблема. Наблюдается, начиная с Win8. Решения пока не найдено.
Проходя по цепочке вызовов, вышел на UpdateAction, который и приводит к перерисовке всех визуальных контролов...
...
Рейтинг: 0 / 0
MDI приложение моргает при перерисовке, как добиться "сглаженности"?
    #39804679
luigi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, причем никаких сторонних компонентов нет, все только родное.
...
Рейтинг: 0 / 0
MDI приложение моргает при перерисовке, как добиться "сглаженности"?
    #39804690
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Судя по морганию, сначала форма восстанавливается до каких-то средних размеров, прорисовывается, и затем разворачивается во весь экран и опять прорисовывается.
Нашел обходку одной из "проблем".
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TMainForm.ApplicationEvents1Activate(Sender: TObject);
begin
  try
    MainForm.LockDrawing()
  finally
    MainForm.UnLockDrawing;
  end;
end;


Убирает полностью моргание при переходе в приложение из другого.
А вот при разворачивании не получается ((
Отлов (Message.CmdType and $FFF0) = SC_RESTORE или AppEvents.OnRestore - срабатывают уже после восстановления.
Если тоже самое (тот же try finally end) вставить в OnCanRestore (оно срабатывает до восстановления) - то окно восстанавливается черным и потом прорисовывется, что тоже некрасиво.
:( груздь пичаль. ну, будем пока так.
...
Рейтинг: 0 / 0
MDI приложение моргает при перерисовке, как добиться "сглаженности"?
    #39804744
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел решёнство! ))
Через жоКак то, скорее всего, не по феншую, но пашет! )

Вот тут обещают, но я не пробовал VCL, избавляемся от мерцания, раз и навсегда

А сделал вот так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
procedure TMainForm.FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean);
begin
  if FMainFormOnLock then
    Exit; //если мы сами заблокировали, значит, все под контролем, обходка не нужна

  Self.AlphaBlend := True;
  Self.AlphaBlendValue := 0;
  TimerIn.Enabled := True;
end;

procedure TMainForm.ApplicationEvents1Minimize(Sender: TObject);
begin
  TimerIn.Enabled := False; //распорочка, чтобы отключить "проявление" когда сворачиваем, т.к. тоже заходит в FormCanResize
end;

procedure TMainForm.TimerInTimer(Sender: TObject);
begin
  if AlphaBlendValue < 239 then
    AlphaBlendValue := AlphaBlendValue + 16
  else
  begin
    AlphaBlendValue := 255;
    TimerIn.Enabled := False;
    AlphaBlend := False;
  end;
end;


Не знаю, конечно, как на совсем слабых компах будет, у меня видюшки нет, i3, прям красиво плавненько проявляется при восстановлении ))
...
Рейтинг: 0 / 0
MDI приложение моргает при перерисовке, как добиться "сглаженности"?
    #39804760
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DevillioДобрый день!

Смог добиться создания, удаления окон, обновления данных в MDI окнах без морганий
...вот таким способом:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
  private
    { Private declarations }
    FMainFormOnLock: Boolean;

function TMainForm.LockDrawing(const AIgnoreLock: Boolean = False): Boolean;
begin
  Result := False;
  if (not FMainFormOnLock) or (AIgnoreLock) then
    try
      LockWindowUpdate(Self.Handle);
    finally
      FMainFormOnLock := True;
      Result := True;
    end;
end;

procedure TMainForm.UnLockDrawing;
begin
  TimerUnlockDrawing.Enabled := False;
  TimerUnlockDrawing.Enabled := True;
end;

procedure TMainForm.TimerUnlockDrawingTimer(Sender: TObject);
begin
  try
    TimerUnlockDrawing.Enabled := False;
    LockWindowUpdate(0);
  finally
    FMainFormOnLock := False;
  end;
end;

//затем в любом месте:
  try
    MainForm.LockDrawing();
    //обновлялки-рисовалки
  finally
    MainForm.UnLockDrawing()
  end;


Программа стала выглядеть "собранной", все контролы на окне единовременно прорисовываются, все ок.
Но в некоторых случаях, например, при изменении размера, при разворачивании окна из свернутого состояния, даже просто при возврате в приложение из другого, жуткая перерисовка, контролы все моргают, "проявляются" по очереди, раздражает, выглядит недоработано. Используется Devexpress и скины.
Как то можно это моргание побороть?
Спасибо!

1) Почему здесь нельзя использовать LockWindowUpdate , потому что эта функция предназначена для других целей

2) Кури ClientHandle + WM_SETREDRAW
...
Рейтинг: 0 / 0
MDI приложение моргает при перерисовке, как добиться "сглаженности"?
    #39804780
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Квейд, в одном из приложений, тоже MDI, тестировал поведение:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
procedure TMainForm.LockDrawing;
begin
//1 вариант:
    LockWindowUpdate(Self.Handle);

//2 вариант:
//    SendMessage(ClientHandle, WM_SETREDRAW, 0, 0);

//3 вариант:
//  Application.ProcessMessages; // finish any pending updates
//  SendMessage(self.ClientHandle, WM_SETREDRAW, 0, 0);
end;

procedure TMainForm.UnLockDrawing;
begin
//перенос в таймер
  TimerUnlockDrawing.Enabled := False;
  TimerUnlockDrawing.Enabled := True;
//1 вариант
//  LockWindowUpdate(0);

//2 вариант
//    SendMessage(ClientHandle, WM_SETREDRAW, 1, 0);
//    RedrawWindow(ClientHandle, nil, 0, RDW_FRAME
//      or RDW_INVALIDATE or RDW_ALLCHILDREN
//      or RDW_NOINTERNALPAINT or RDW_UPDATENOW);

//3 вариант
//  SendMessage(self.ClientHandle, WM_SETREDRAW, 1, 0);
//  RedrawWindow(self.ClientHandle, nil, 0,
//    RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_UPDATENOW);
end;


сейчас, к сожалению, не вспомню, по каким именно причинам, но вариант с Lock был выбран по поведению как наиболее подходящий.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / MDI приложение моргает при перерисовке, как добиться "сглаженности"?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]