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

Смог добиться создания, удаления окон, обновления данных в 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
22.04.2019, 10:05
    #39804677
luigi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI приложение моргает при перерисовке, как добиться "сглаженности"?
Devillio,

Есть такая же проблема. Наблюдается, начиная с Win8. Решения пока не найдено.
Проходя по цепочке вызовов, вышел на UpdateAction, который и приводит к перерисовке всех визуальных контролов...
...
Рейтинг: 0 / 0
22.04.2019, 10:07
    #39804679
luigi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI приложение моргает при перерисовке, как добиться "сглаженности"?
Да, причем никаких сторонних компонентов нет, все только родное.
...
Рейтинг: 0 / 0
22.04.2019, 10:17
    #39804690
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI приложение моргает при перерисовке, как добиться "сглаженности"?
Судя по морганию, сначала форма восстанавливается до каких-то средних размеров, прорисовывается, и затем разворачивается во весь экран и опять прорисовывается.
Нашел обходку одной из "проблем".
Код: 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
22.04.2019, 11:12
    #39804744
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI приложение моргает при перерисовке, как добиться "сглаженности"?
Нашел решёнство! ))
Через жоКак то, скорее всего, не по феншую, но пашет! )

Вот тут обещают, но я не пробовал 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
22.04.2019, 11:22
    #39804760
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI приложение моргает при перерисовке, как добиться "сглаженности"?
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
22.04.2019, 11:46
    #39804780
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI приложение моргает при перерисовке, как добиться "сглаженности"?
Квейд, в одном из приложений, тоже 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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / MDI приложение моргает при перерисовке, как добиться "сглаженности"? / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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