Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Управление расположением дочерних окон в MDI-приложениях на Delphi

Delphi , Программа и Интерфейс , MDI приложения

При работе с многооконными приложениями (MDI - Multiple Document Interface) в среде разработки Delphi иногда возникает необходимость управлять расположением дочерних окон. Вопрос управления позиционированием окон особенно актуален, когда требуется создать несколько окон одновременно, чтобы избежать мигания экрана из-за последовательного создания окон в их стандартных позициях и последующего перемещения.

Проблема

При создании дочерних окон с FormStyle := fsMDIChild, свойства, такие как Left, Top, Position и другие, не влияют на их начальное положение до момента, когда окно уже будет создано и отображено в своем стандартном расположении. Это приводит к тому, что при создании нескольких окон одновременно, они сначала появляются в своих стандартных позициях, а затем быстро перемещаются и изменяют размер, что вызывает мигание экрана.

Решение

Изучение исходного кода VCL приводит к выводу, что единственным решением является переопределение метода CreateParams класса TCustomForm и изменение полей X, Y, Width и Height параметра Params. Однако, такой подход может показаться хаком. Существует ли более чистый способ решения данной проблемы?

Альтернативные методы

Использование события FormShow

Один из способов управления расположением окна - это использование события FormShow. В этом событии можно установить желаемые координаты окна:

procedure TForm2.FormShow(Sender: TObject);
begin
  Top := 200;
  Left := 400;
end;

Отключение перерисовки

Еще один метод - это временное отключение перерисовки главного окна с помощью сообщений WM_SETREDRAW. Это позволяет избежать мигания экрана во время создания и позиционирования окон:

Delphi:

SendMessage(Application.MainForm.ClientHandle, WM_SETREDRAW, False, 0);
try
  Child := TChildForm.Create(Self);
  Child.Left := ...;
  Child.Top := ...;
  Child.Show;
finally
  SendMessage(Application.MainForm.ClientHandle, WM_SETREDRAW, True, 0);
  InvalidateRect(Application.MainForm.ClientHandle, nil, True);
end;

C++:

SendMessage(Application->MainForm->ClientHandle, WM_SETREDRAW, FALSE, 0);
try
{
  Child = new TChildForm(this);
  Child->Left = ...;
  Child->Top = ...;
  Child->Show();
}
__finally
{
  SendMessage(Application->MainForm->ClientHandle, WM_SETREDRAW, TRUE, 0);
  InvalidateRect(Application->MainForm->ClientHandle, NULL, TRUE);
}

Комментарии пользователей

Некоторые пользователи отмечают, что для корректного перерисовки дочерних окон MDI могут потребоваться использовать функцию RedrawWindow вместо InvalidateRect, как описано в документации MSDN. Однако, другие пользователи сообщают, что InvalidateRect работает для них корректно.

Заключение

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

Создано по материалам из источника по ссылке.

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


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: MDI приложения ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-15 08:02:54/0.0062899589538574/0