MDI: wsMaximized Child-формы

r77
Дата: 11.06.2009 11:18:09
Добрый день!

Проблема следующая...MDI приложение со множеством окон, определенное дочернее окно (назовем его Main) должно быть по воле пользователя wsMaximized или Normal размеров...для Normal - все нормально...а вот wsMaximized: когда создается еще одна Child-форма,то Main, которое было wsMaximized становится Normal...для того чтобы Main осталось прежних ("развернутых" на весь экран) размеров принудительно, после создания другой Child-формы, Main делаю wsMaximized, но получается не очень красиво...видно, что оно сначало свернулось, а потом опять развернулось...как избавиться от этой визуализации "вновь разворачивания" и оставить форму Main wsMaximized размеров?
RENaissance
Дата: 11.06.2009 11:23:52

Это НОРМАЛЬНОЕ поведение MDI-интерфейса. Если вам нужно нестандартное поведение, то пишите свой менеджер окон.

Posted via ActualForum NNTP Server 1.4

r77
Дата: 11.06.2009 11:49:53
RENaissance

Это НОРМАЛЬНОЕ поведение MDI-интерфейса. Если вам нужно нестандартное поведение, то пишите свой менеджер окон.


Я знаю,что это нормальное поведение MDI-интерфейса, вот и спрашиваю пути обхода этого нормального поведения...какой-нибудь вариант, чтоб сильно не заморачиваться...
Alex S
Дата: 15.06.2009 10:24:03
Показывайте Ваши чайлды через такую процедуру:
SendMessage(<главная форма приложения>.ClientHandle, WM_SETREDRAW, 0, 0);
try
    Child.Show;
//  установка wsMaximized если надо
finally
   SendMessage(<главная форма приложения>.ClientHandle, WM_SETREDRAW, 1, 0);
   RedrawWindow(<главная форма приложения>.ClientHandle, nil, 0, RDW_FRAME or RDW_INVALIDATE or
     RDW_ALLCHILDREN or RDW_NOINTERNALPAINT)
end;
и "визуализации" не будет.
MikeDD
Дата: 15.06.2009 14:56:39
Alex S
Показывайте Ваши чайлды через такую процедуру:
SendMessage(<главная форма приложения>.ClientHandle, WM_SETREDRAW, 0, 0);
try
    Child.Show;
//  установка wsMaximized если надо
finally
   SendMessage(<главная форма приложения>.ClientHandle, WM_SETREDRAW, 1, 0);
   RedrawWindow(<главная форма приложения>.ClientHandle, nil, 0, RDW_FRAME or RDW_INVALIDATE or
     RDW_ALLCHILDREN or RDW_NOINTERNALPAINT)
end;
и "визуализации" не будет.


Угу, тока если между SendMessage(Handle,WM_SETREDRAW,0,0) и SendMessage(Handle,WM_SETREDRAW,1,0) проходит достаточно большое время, к примеру открывается датасет, на форме появляются артефакты в виде отдельных элементов окна, находящегося под главной формой. Есть решение этой проблемы?
Alex S
Дата: 15.06.2009 15:26:57
MikeDD

Угу, тока если между SendMessage(Handle,WM_SETREDRAW,0,0) и SendMessage(Handle,WM_SETREDRAW,1,0) проходит достаточно большое время, к примеру открывается датасет, на форме появляются артефакты в виде отдельных элементов окна, находящегося под главной формой. Есть решение этой проблемы?

Открывать датасет имхо лучше при невидимом чайлде (до SendMessage(Handle,WM_SETREDRAW,0,0)) типа, так:

Child := TChild.Create(mainform);
StartWait('Подождите..');//у меня вывешивает форму с часами
try
  Child.Init; // открытие датасетов и т.п.
finally
  CloseWait;
end;
mainform.showForm(Child);// внутри то, о чем писал раньше 

Либо наоборот, показать форму без мерцания, включить Wait и затем открывать датасеты.
Использую первый вариант - нет ни артефактов, ни мерцаний.
MikeDD
Дата: 15.06.2009 17:38:48
Alex S,

Ты прав, артефактов нет. Я тупанул в другом - вместо MainForm.ClientHandle было просто MainForm.Handle.
r77
Дата: 16.06.2009 11:23:52
Спасибо всем большое за помощь!