0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 47
1

Как переопределить родителя для дочерних окон мди-приложения?

12.01.2013, 20:09. Показов 2414. Ответов 10
Метки нет (Все метки)

Есть MDI-приложение. На главной форме этого MDI лежит Panel1.Align = alClient. При открытии дочернего окна оно становиться невидным т.к. открытое окно уходит под панель.
Скажите, пожалуйста, как сделать так, чтобы дочерних окна нормально показывались даже если на всю главную форму лежит панель или фрейм?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.01.2013, 20:09
Ответы с готовыми решениями:

Запрет на появление дочерних окон при открытии приложения
При открытии приложения все дочернии формы оказываются в положении видимости, не зависимо от их...

Как переопределить метод родителя класса?
Есть класс TDot, который есть классом-наследником для класса TTriangle В классе TDot есть метод...

Js Class как переопределить свойство родителя
Здравствуйте!!! Подскажите как переопределить свойство родителя? // Class Parent class App...

Как получить текст дочерних элементов родителя treeview
Как получить текст дочерних элементов родителя treeview? Так удается получить только текст...

10
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31881 / 20779 / 8066
Регистрация: 22.10.2011
Сообщений: 35,999
Записей в блоге: 7
12.01.2013, 21:39 2
MDI child vs объекты на parent
0
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 47
12.01.2013, 22:22  [ТС] 3
Цитата Сообщение от UI Посмотреть сообщение
Вот что я хочу добиться, фото -
Как переопределить родителя для дочерних окон мди-приложения?
0
2648 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,725
12.01.2013, 22:27 4
Не уверен, но можно попробовать отрисовать иконки прямо на канве MDIParent-формы в обработчике ее события OnPaint.
0
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 47
12.01.2013, 22:35  [ТС] 5
Цитата Сообщение от mss Посмотреть сообщение
Не уверен, но можно попробовать отрисовать иконки прямо на канве MDIParent-формы в обработчике ее события OnPaint.
Крутовато вручную все отрисовывать
0
2648 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,725
12.01.2013, 22:46 6
Цитата Сообщение от fedorov2012 Посмотреть сообщение
Крутовато вручную все отрисовывать
Ну не VCL же править)
0
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 47
12.01.2013, 22:47  [ТС] 7
Я не могу просто понять зачем было разработчикам delphi делать так, что при работе компоненты гл. формы mdi отображаются поверх child-окнов, зачем?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31881 / 20779 / 8066
Регистрация: 22.10.2011
Сообщений: 35,999
Записей в блоге: 7
12.01.2013, 22:59 8
Решение очень специфичное, и насколько стабильно будет работать - неизвестно, но по крайней мере можно начать копать в эту сторону:
Delphi
1
2
3
4
5
procedure TMainForm.FormCreate(Sender: TObject); // При создании MDIParent-формы
begin
   Windows.SetParent(Panel1.Handle, Self.ClientHandle);
   Panel1.Align := alClient; // После назначения родителя !!!
end;
, теперь открывающееся окно будет над панелью.

Добавлено через 1 минуту
Это не контролы отображаются поверх, а MDIClient (контейнер MDIChild-форм) лежит под контролами...
0
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 47
13.01.2013, 00:40  [ТС] 9
Цитата Сообщение от UI Посмотреть сообщение
Delphi
1
2
3
4
5
procedure TMainForm.FormCreate(Sender: TObject); // При создании MDIParent-формы
begin
   Windows.SetParent(Panel1.Handle, Self.ClientHandle);
   Panel1.Align := alClient; // После назначения родителя !!!
end;
, теперь открывающееся окно будет над панелью.

Добавлено через 1 минуту
Это не контролы отображаются поверх, а MDIClient (контейнер MDIChild-форм) лежит под контролами...
Все вроде бы нормально, но один эффект неприятный нашел - открываем дочернее окно (WindowState=wsNormal) щелкаем мышкой в любом месте гл. формы MDI (наш раб. стол) и дочернее окно исчезает (уходит под Panel1)

Добавлено через 34 минуты
UI, одна надежда на вас
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31881 / 20779 / 8066
Регистрация: 22.10.2011
Сообщений: 35,999
Записей в блоге: 7
13.01.2013, 03:32 10
Да, надо будет еще заменить функцию окна панели так, чтобы панелька при получении WM_WINDOWPOSCHANGING была всегда снизу:
Delphi
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
type
    // ...
  private
    { Private declarations }
    FOldWndProc: TWndMethod;
    procedure NewWndProc(var Msg : TMessage);
 
    // ...
  public
    { Public declarations }
  end;
 
// ...
 
procedure TMainForm.FormCreate(Sender: TObject);
begin
   Windows.SetParent(DesktopPanel.Handle, Self.ClientHandle);
   DesktopPanel.Align := alClient;
 
   FOldWndProc := DesktopPanel.WindowProc;
   DesktopPanel.WindowProc := NewWndProc;
end;
 
procedure TMainForm.FormDestroy(Sender: TObject);
begin
   DesktopPanel.WindowProc := FOldWndProc;
end;
 
procedure TMainForm.NewWndProc(var Msg: TMessage);
begin
   case Msg.Msg of
   WM_WINDOWPOSCHANGING:
      PWindowPos(Msg.LParam)^.hwndInsertAfter := HWND_BOTTOM;
   end;
   FOldWndProc(Msg);
end;
, тогда описанного тобой поведения не будет. Проверь, у меня Дельфи под рукой нет...
0
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 47
13.01.2013, 14:58  [ТС] 11
UI, большое спасибо! - вроде бы все работает так как надо.

Вы ранее писали:
Решение очень специфичное, и насколько стабильно будет работать - неизвестно
Скажите, пожалуйста, а в чем потенциальная опасность вот так взять и переопределить стандартное поведение?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.01.2013, 14:58
Помогаю со студенческими работами здесь

StayOnTop для нескольких дочерних окон
Доброго времени суток=) натолкнулся на такую проблему - при создании нескольких копий формы с...

Число дочерних окон
Здравствуйте. Есть ли у главной формы свойство обозначающее число открытых дочерних форм?

Минимизация дочерних окон
Здравствуйте! Есть задание: Написать приложение, обладающее следующей функциональностью: ...

Определение дочерних окон
Есть программа у нее есть дочерние окна, как их определить? Как определить что открылось дочернее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru