Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как в C++ Builder 6 сделать Form2 дочерней по отношению к Form1?

speexz Мыслитель (7826), на голосовании 14 лет назад
Проблема в том, что когда я вызываю форму2 и замораживаю форму1 и затем пытаюсь свернуть форму2, то она сворачивается в левый нижний экран, а форма1 так и стоит на своем месте.
Нужно чтобы они вместе нормально сворачивались, как все окна.
Дополнен 14 лет назад
y-u-r-o-n, они стали вместе сворачиватсья в левый нижний угол экрана.
Мне нужно чтобы они вообще исчезли.
Дополнен 14 лет назад
Roman, нужно на панель задач свернуть, как все окна делают, кроме билдеровских.
Посмотрел как ставить этот обработчик; поставил, но окна все равно не так как надо сворачиваются и разворачиваются.

С помошью Application->Minimize() окна нормально сворачиваются, но
развернуться никак не могут нормально. Пробовал по-разному: не ловить SC_MAXIMIZE, на событии SC_MAXIMIZE вызывать ShowNormal, Application->Restore(), Form2->WindowState и никак.
Дополнен 14 лет назад
Как же в этом C++ сложно. Не то что в автоите. Но пришлось писать в C++
Дополнен 14 лет назад
Блин, решил проблему. Все из-за свитча было.
С сайта тупо взял пример обработки события со свитчем, а с сишный свитч я ниразу не использовал. Надо было просто в конце каждого case ставить break.

Вот конечное решение:

void __fastcall TForm2::OnWMSysCommand( TMessage& aMsg )
{
switch (aMsg.WParam)
{
case SC_MINIMIZE:
Application->Minimize();
break;
case SC_MAXIMIZE:
Application->Restore();
break;
default:
DefaultHandler(&aMsg);
}
}
Голосование за лучший ответ
Roman Гуру (4937) 14 лет назад
Совсем исчезли это как? В рей свернулись просто с экрана исчезли и с панели задач? иль закрылись?

Чтобы исчезли с глаз долой при нажатии кнопки свертывании, нужно отловить событие SC_MINIMIZE и там написать –

ShowWindow(Form1->Handle,SW_HIDE);
ShowWindow(Form2->Handle,SW_HIDE);
чтобы потом вновь отобразить нужно ShowWindow(FormX->Handle,SW_SHOW)

лучше воспользоваться компонентом для свертывание в трей

отлавливать сообщение можно так –

OldWndProc=SetWindowLong(Form1->Handle,GWL_WNDPROC,(long)NewProc) ;

Пример

long OldWndProc;
void NewProc(DWORD hWnd, DWORD uMsg, DWORD wParam, DWORD lParam)
{
CallWindowProc((FARPROC)OldWndProc,(HANDLE)hWnd,uMsg,wParam,lParam);

if (wParam==SC_MINIMIZE && Form1->Handle == (HANDLE)hWnd )
{
ShowWindow(Form1->Handle,SW_HIDE);;
}

}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
OldWndProc=SetWindowLong(Form1->Handle,GWL_WNDPROC,(long)NewProc) ;
}
Похожие вопросы