Форум — Ответы     (  К темам )
 ?  Артём: Как двигать несколько форм сразу (01-04-2003 13:02:00)
Как двигать несколько форм сразу
 Petro (01-04-2003 14:50:49)
Точно также, как и одну — задавая координаты. :)
 Георгий (01-04-2003 18:38:03)
Petro:
я тоже хотел так ответить — но как узнать на сколько передвинул пользователь форму?
 Petro (02-04-2003 06:47:08)
2 Георгий:
Запоминать предыдущие координаты можно в обработчике события... А может это и не нужно — смотря какая постановка задачи.

2 Артем:
В чем, собственно говоря, трабла? 8)
 Георгий (02-04-2003 23:42:51)
"Запоминать предыдущие координаты можно в обработчике события... "
какого события?
 Артём (04-04-2003 12:17:03)
хочу сделать как в винампе
 Fred (06-04-2003 05:20:42)
Передо мной тоже стояла аналогичная проблема. Могу предложить следующий пример совместного перемещения и именеия размеров трех форм.

1. Создай три формы так чтобы высота первой формы приблизительно была равна сумме высот 2-й и 3-й форм.

2. Вставь в главный файл проекта:

#include "frm_1.h" // Это нужно вставить.
#include "frm_2.h" // Это нужно вставить.
#include "frm_3.h" // Это нужно вставить.

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->CreateForm(__classid(TForm2), &Form2);
Application->CreateForm(__classid(TForm3), &Form3);

Form1->WindowProc = Form1->MyWindowProc; // Это нужно вставить.
Form2->WindowProc = Form2->MyWindowProc; // Это нужно вставить.
Form3->WindowProc = Form3->MyWindowProc; // Это нужно вставить.

Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}

3. Создай для каждой формы процедуры:

ФОРМА 1:
void __fastcall TForm1::MyWindowProc(TMessage &msg)
{
WndProc(msg); //---

if( Tag ) return; Tag = 1;

if( msg.Msg==WM_MOVE || msg.Msg==WM_SIZE )
{
if( Form2->Tag == 0 ) Form2->SetBounds( Left+Width, Top, Form2->Width, Form2->Height );
if( Form3->Tag == 0 ) Form3->SetBounds( Left+Width, Top+Form2->Height, Form2->Width, Height-Form2->Height );
}
Tag = 0;
}//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

ФОРМА 2:
void __fastcall TForm2::MyWindowProc(TMessage &msg)
{
WndProc(msg); //---

if( Tag ) return; Tag = 1;

if( msg.Msg==WM_MOVE || msg.Msg==WM_SIZE )
{
if( Form1->Tag == 0 ) Form1->SetBounds( Left-Form1->Width, Top, Form1->Width, Form1->Height );
if( Form3->Tag == 0 ) Form3->SetBounds( Left, Top+Height, Width, Form1->Height — Height );
}

Tag = 0;
}//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

ФОРМА 3:
void __fastcall TForm3::MyWindowProc(TMessage &msg)
{
WndProc(msg); //---

if( Tag ) return; Tag = 1;

if( msg.Msg==WM_MOVE || msg.Msg==WM_SIZE )
{
if( Form1->Tag == 0 ) Form1->SetBounds( Left-Form1->Width, Top-Form2->Height, Form1->Width, Form1->Height );
}

Tag = 0;
}//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


Проверь как работает. У меня замечательно получилось. Программа работает не только на совместное перемещение форм, но и на изменение размеров одной из форм.
 Fred (06-04-2003 05:23:27)
Почему-то в комментарии к фунции WndProc(msg) всякая ахинея вставилась :)