C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Про минимизацию окошек..., Про минимизацию окошек...
Kate
Отправлено: 26.11.2003, 11:02


Ученик-кочегар

Группа: Участник
Сообщений: 9



Помогите, пожалуйста, решить такую, вроде бы, простую проблемку:
Неглавные формы приложения (не MDI) минимизируются в нижнюю часть десктопа, а не в панель задач. Хотелось бы минимизировать все приложение. Где это отлавливать?
Guest
Отправлено: 26.11.2003, 13:19


Не зарегистрирован







Application->Minimize();

отлавливать в событии onMinimize
компонента ApplicationEvents

CODE
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   Application->Minimize();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ApplicationEvents1Minimize(TObject *Sender)
{
   ShowMessage("Minimize !");
}
Kate
Отправлено: 27.11.2003, 10:29


Ученик-кочегар

Группа: Участник
Сообщений: 9



Это я как раз пробовала, но событие OnMinimize возникает только при закрытии Главной формы (даже когда компонент ApplicationEvents лежит на другой форме). Еще есть идеи?
Guest
Отправлено: 27.11.2003, 13:09


Не зарегистрирован







Можете воспользоваться компонентом AppEvents из библиотеки RXLib
Разместите его на Form2 и проверяйте событие onActiveFormChange

CODE

void __fastcall TForm2::AppEvents1ActiveFormChange(TObject *Sender)
{
   if(Form2->WindowState == wsMinimized)
                   Form1->Caption = "Form2 minimized !";
}
Kate
Отправлено: 27.11.2003, 13:25


Ученик-кочегар

Группа: Участник
Сообщений: 9



Вы будете смеяться, но опять не то. Дело в том, что, когда я открываю вторую форму, то главной делаю Hide и у меня получается одна форма, так что при ее минимизации переключения между формами не происходит. Хочется, чтобы в этот момент минимизировалось все приложение. Это можно сделать Application->Minimize(), вот только куда вставить вызов?
Guest
Отправлено: 27.11.2003, 15:49


Не зарегистрирован







CODE

void __fastcall TForm2::ApplicationEvents1Message(tagMSG &Msg,
     bool &Handled)
{
   if(Msg.hwnd == Form2->Handle &&
      !Form2->WindowState == wsMinimized &&
      Msg.message == WM_NCLBUTTONDOWN &&
      Msg.wParam == 8)
      {
        Application->Minimize();
      }
}
Kate
Отправлено: 28.11.2003, 12:53


Ученик-кочегар

Группа: Участник
Сообщений: 9



УРА-А-А! З-заработало! biggrin.gif biggrin.gif biggrin.gif
Пребольшое спасибо!

... оказывается осталось еще одно НО:
свернутое окошко так и остается лежать на десктопе в нижнем углу, хоть и неактивным. Как бы его убрать? а то некрасиво как-то.
Если делать Hide(), то, т.к. оно одно, автоматически появляется главное окно.

Отредактировано Kate — 28/11/2003, 14:40
Admin
Отправлено: 29.11.2003, 13:45


Владимир

Группа: Администратор
Сообщений: 1190



Ну если так глобально нужно все посворачивать,
воспользуйтесь EnumWindows

https://rxlib.ru/forums/index.php?ac...3dedd6aabaa0718
Kate
Отправлено: 01.12.2003, 12:20


Ученик-кочегар

Группа: Участник
Сообщений: 9



Admin, спасибо за ссылку — она таки-навела меня на нужную мысль smile.gif.

Я стала разбираться и вставила вызов EnumWindows в предыдущий пример с Message. Все замечательно минимизируется, вот только нужное окошко опять в низ экрана, и тогда неня осенило вставить Handled = true; И все стало как надо. Более того, оказалось достаточно Application->Minimize();
получился такой код:

void __fastcall TEventForm::ApplicationEvents1Message(tagMSG &Msg, bool &Handled)
{
if(Msg.message == WM_NCLBUTTONDOWN && Msg.wParam == 8)
{
Application->Minimize();
Handled = true;
}
}
В результате минимизации всех неосновных окошек минимизируется приложение. Что и требовалось доказать.

Вот только может кто подскажет, где можно найти описание значение tagMSG, а то это условие работает только при нажатии кнопочки минимизации, а при выборе из системного меню окна — нет.
Admin
Отправлено: 01.12.2003, 13:05


Владимир

Группа: Администратор
Сообщений: 1190



Так в help-e в Builder есть.

CODE

tagMsg encodes the information from a Windows message.

Unit

Winuser.h

typedef struct tagMSG {

   HWND        hwnd;
   UINT           message;
   WPARAM     wParam;
   LPARAM      lParam;
   DWORD      time;
   POINT         pt;
} MSG;

Description

The tagMsg type is a structure that holds the details of a Windows message. This is the structure that Windows uses to encode a message, as opposed to the TMessage type, which encodes the parameters that are passed to a Window procedure.

The following table list the fields of the tagMsg structure:

Field Meaning

hwnd The handle of the window to which the message is sent.
message The identifier of the message (the Windows message code).
wParam The wParam of the message.
lParam The lParam of the message.
time The time that the message was sent.
pt The position of the mouse cursor when the message was sent.


И сообщения WM_ лежат в winuser.h,
описание многих их с wParam, lParam тоже есть в help

Вернуться в Вопросы программирования в C++Builder