Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];

Вниз

Работа с окнами как в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.059 c
11-1156091877
Vladimir Kladov
2006-08-20 20:37
2007.04.22
вопрос по free pascal


15-1175255744
antonn
2007-03-30 15:55
2007.04.22
вопросик по php/html


2-1175629090
likenoother
2007-04-03 23:38
2007.04.22
домножение


11-1154888270
Александра
2006-08-06 22:17
2007.04.22
OnFocus для EditBox


15-1174847687
RASkov
2007-03-25 22:34
2007.04.22
Нужно срочно





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский