| 
| 
 | Вопрос # 608/ вопрос открыт / | 
 |  Здравствуйте, уважаемые эксперты!Подскажите пожалуйста как сделать окна как в делфи, чтобы дочерние окна разворачивались до границ главной
 
|  |   Вопрос задал: Храмцов Денис (статус: 1-ый класс)Вопрос отправлен: 31 мая 2007, 09:15
 Состояние вопроса: открыт, ответов: 3.
 |  Ответ #1. Отвечает эксперт: Venom Здравствуйте, hdrus!Если я все правильно понял, то ничего сложного нет.
 F_Child.Top:=F_Main.Top;
 F_Child.Left:=F_Main.Left;
 F_Child.Width:=F_Main.Width;
 F_Child.Height:=F_Main.Height;
 если необходимо поставить ограничение на размер дочернего окна, то, например, так:
 if F_Child.Width>F_Main.Width then F_Child.Width:=F_Main.Width;
 if F_Child.Height>F_Main.Height then F_Child.Height:=F_Main.Height;
 повесить можно на событие onresize
 
|  | Ответ отправил: Venom (статус: 1-ый класс)Время отправки: 31 мая 2007, 09:59
 
 |  Ответ #2. Отвечает эксперт: min@y™ Нужно обрабатывать сообщение WM_GetMinMaxInfo в дочерних формах.
 Порылся в исходниках. Вот тебе примерчик написал (см. приложение):
 Приложение:Переключить в обычный режим program Project1; uses  Forms,  Unit1 in 'Unit1.pas' {Form1},  Unit2 in 'Unit2.pas' {Form2}; {$R *.res} begin  Application.Initialize;  Application.CreateForm(TForm1, Form1);  Application.CreateForm(TForm2, Form2);  Form2.Show;  Application.Run;end. unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs; type  TForm1 = class(TForm)  private    { Private declarations }  public    constructor Create(AOwner: TComponent); override;  end; var  Form1: TForm1; implementation {$R *.dfm} { TForm1 } constructor TForm1.Create(AOwner: TComponent);begin  inherited;  Constraints.MinHeight:= Height;  Constraints.MaxHeight:= Height;  WindowState:= wsMaximized;end; end.  unit Unit2; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs; type  TForm2 = class(TForm)  private    procedure WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo); message WM_GetMinMaxInfo;  public    { Public declarations }  end; var  Form2: TForm2; implementation {$R *.dfm} { TForm2 } uses Unit1; procedure TForm2.WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo);begin  inherited;  Msg.MinMaxInfo^.ptMaxPosition.Y:= Form1.BoundsRect.Bottom;  Msg.MinMaxInfo^.ptMaxSize.Y:= Screen.DesktopRect.Bottom - Form1.BoundsRect.Bottom;end; end.    object Form1: TForm1  Left = 192  Top = 109  Width = 870  Height = 118   Color = clBtnFace  Font.Charset = DEFAULT_CHARSET  Font.Color = clWindowText  Font.Height = -11  Font.Name = 'MS Sans Serif'  Font.Style = []  OldCreateOrder = False  PixelsPerInch = 96  TextHeight = 13end object Form2: TForm2  Left = 192  Top = 105  Width = 870  Height = 640   Color = clBtnFace  Font.Charset = DEFAULT_CHARSET  Font.Color = clWindowText  Font.Height = -11  Font.Name = 'MS Sans Serif'  Font.Style = []  OldCreateOrder = False  PixelsPerInch = 96  TextHeight = 13end
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 31 мая 2007, 10:23
 Оценка за ответ: 4
 |  Ответ #3. Отвечает эксперт: Косолапов Дмитрий Юрьевич Здравствуйте, hdrus!Может быть, через MDI-интерфейс? Главным и дочерним окнам достаточно будет установить соотвествующие свойства.
 
 Мини-форум вопросаВсего сообщений: 4; последнее сообщение — 31 мая 2007, 12:13; участников в обсуждении: 2. 
|   | Храмцов Денис (статус: 1-ый класс), 31 мая 2007, 11:00 [#1]:Все бы хорошо только как бы еще главное окно когда оно развернуто привязать к верхней границе экрана |  
|   | min@y™ (статус: Доктор наук), 31 мая 2007, 11:24 [#2]:Я чото не понял, ты мой пример компилил/запускал? Там главная форма в развёрнутом состоянии разве не торчит на верхней границе экрана?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Храмцов Денис (статус: 1-ый класс), 31 мая 2007, 11:47 [#3]:В примере все отлично. Мне по сути нужна была только процедурка обработки собщения WM_GetMinMaxInfo для дочерних окон. Да при запуске форма разворачивается и прилипает к верхней границе только ее можно перемещять, а мне нужно такую возможность отключить. Запусти Делфи7 и посмотри как там привязывается главное окно когда оно развернуто и как ведут себя дочерние.
 |  
|   | min@y™ (статус: Доктор наук), 31 мая 2007, 12:13 [#4]:Взял из DelphiWorld: Заблокировать перемещение формы
 --------------------------------------------------------------------------------
 
 
 Оформил: DeeCo
 Автор: http://www.swissdelphicenter.ch
 
 {....}
 
 private
 procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
 
 {....}
 
 
 {....}
 
 private
 procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
 
 {....}
 
 procedure TForm2.WMNCHitTest(var Message: TWMNCHitTest);
 begin
 inherited;
 
 with Message do
 begin
 if Result = HTCAPTION then
 Result := HTNOWHERE;
 end;
 end;
 
 Остаётся только поставить условие там:
 
 if (WindowState = wsMaximized)
 then with Message do
 begin
 if Result = HTCAPTION then
 Result := HTNOWHERE;
 end;
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |