Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.22;
Скачать: CL | DM;

Вниз

Работа с окнами как в Deplhi IDE   Найти похожие ветки 

 
Kostafey ©   (2007-03-25 15:02) [0]

Подскажите, пожалуйста как организовать взамодействие окон как в Delphi.
Чтобы вверху было онкно с тулбаром и меню, а внизу онка при нажатии на кнопку развернуть
разворачивались бы так, чтобы не закрывать главное(верхнее окно).

Событие нижнего окна:

procedure TFormDogovor.FormResize(Sender: TObject);
begin
 if Top<100 then
 begin
   Top:=100;
   Height:=Height-110;
 end;
end;

если высота верхнего окна 100, то получается для раскрытия окна на весь экран, но если просто
растягивать нижнее окно вверх, то получается сосвсем не красиво.
Может быть можно как-то поймать тот момент, когда WindowState становится wsMaximized ?


 
Belorus ©   (2007-03-25 15:32) [1]

кури Window Messages.


 
Kostafey ©   (2007-03-25 15:38) [2]

> кури Window Messages.

Плин, это что же придется в WinAPI залазить ?


 
Юрий Зотов ©   (2007-03-25 16:08) [3]

См. WM_GETMINMAXINFO


 
Fredy314 ©   (2007-03-25 16:15) [4]

procedure TFormDogovor.FormResize(Sender: TObject);
begin
 If (form1.WindowState = wsMaximized) Then
...


 
Kostafey ©   (2007-03-25 16:18) [5]

> [4] Fredy314 ©   (25.03.07 16:15)

Я тоже так думал.

Ан нет, событие ресайза происходит до того как WindowState принимает значение wsMaximized


 
Fredy314 ©   (2007-03-25 16:21) [6]

проверил вариант из [0] при ресайзе вполне нормальній вариант,только при перемещении окна можно поднять выше.


 
Fredy314 ©   (2007-03-25 16:24) [7]

а onMove для окна нету, видимо придётся всётаки а WinApi


 
Kostafey ©   (2007-03-25 17:00) [8]

> [3] Юрий Зотов ©   (25.03.07 16:08)
> См. WM_GETMINMAXINFO


Подскажите пожалуйста как именно отловить развертывание окна.
А то WM_GETMINMAXINFO много чего еще "ловит"

По крайней мере если посмотреть:

TForm1
 procedure WMUser(var Msg: TMessage);  message WM_GETMINMAXINFO;
...

procedure TForm1.WMUser(var Msg: TMessage);
begin
 showmessage(inttostr(Msg.LParam));
end;


 
Kostafey ©   (2007-03-25 18:05) [9]

Вот получилось. Не знаю как там до кода, но внешне работает как и окна Delphi:


type
 TForm1 = class(TForm)
   BitBtn1: TBitBtn;
   Panel1: TPanel;
   procedure FormResize(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   procedure WMUser(var Msg: TMessage);  message WM_GETMINMAXINFO;
 end;

var
 Form1: TForm1;
 FullSize:boolean=false;
const
 HederFormHeight=100;

implementation

{$R *.dfm}

procedure TForm1.WMUser(var Msg: TMessage);
begin
 if (Msg.LParam=1238916) and (Self.WindowState=wsNormal) then
   begin
     FullSize:=true;
     WindowState:=wsMaximized;
     exit;
   end;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
 if ((WindowState=wsMaximized) and (FullSize)) then
 begin
   Top:=HederFormHeight;
   Height:=Screen.Height-129;
   FullSize:=false;
 end;
end;


Где 1238916-установлено методом научного тыка, 129-высота панели задач.

Попиайте кому не лень.


 
RASkov   (2007-03-25 18:24) [10]

> [9] Kostafey ©   (25.03.07 18:05)

Нифика ниче не работает, а что должно было быть, я так и не понял.... :(

> Попиайте кому не лень.

Так... держи слегонца... :)


 
Kostafey ©   (2007-03-25 18:34) [11]

> Нифика ниче не работает, а что должно было быть, я так и
> не понял.... :(

Понял я почему не работает.
Для каждого окна Msg.LParam нужно свой находить.
В одном случае получилось 1238916 (в экспиремтальной проге), а как к основной задаче вернулся для первого окна
получилось 1238912.
Что это такое и с чем это есть положено пока не понял, но так оставлять нельзя...
Интересно а если эту прогу на другом PC запустить то же число измениться ?...

Копаю дальше...

короче,
> Так... держи слегонца... :)
есть за что.


 
Kostafey ©   (2007-03-25 19:28) [12]

> Msg.LParam=1238916


Оказывается Msg.LParam не число а указатель.
Вопрос в том как из него что-то полезное извлечь


 
Kostafey ©   (2007-03-25 19:57) [13]

Трындец. Подня возился. Решение-то в 2 строчки умещается:


type
 TForm1 = class(TForm)
   BitBtn1: TBitBtn;
   Panel1: TPanel;
 private
   { Private declarations }
 public
   { Public declarations }
   procedure WMUser(var Msg: TWMGetMinMaxInfo);  message WM_GETMINMAXINFO;
 end;

var
 Form1: TForm1;
const
 HederFormHeight=100;

implementation

{$R *.dfm}

procedure TForm1.WMUser(var Msg: TWMGetMinMaxInfo);
begin
 Msg.MinMaxInfo^.ptMaxPosition.Y:=HederFormHeight;
 Msg.MinMaxInfo^.ptMaxSize.Y:=Screen.Height-129;
end;



Страницы: 1 вся ветка

Текущий архив: 2007.04.22;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 2.882 c
2-1175142816
O.O
2007-03-29 08:33
2007.04.22
Количество сгруппированых строк


2-1175626122
Merak
2007-04-03 22:48
2007.04.22
idMappedPortTCP без внешнего прокси


2-1175517371
annn
2007-04-02 16:36
2007.04.22
Процедуры и функции


4-1164296258
Вольный Стрелок
2006-11-23 18:37
2007.04.22
CreateProcess консольной программы


2-1175599129
Rooot
2007-04-03 15:18
2007.04.22
*.my