|
Вопрос # 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 = 13
- end
-
- 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 = 13
- end
 |
Ответ отправил: 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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|