Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/55: Рейтинг темы: голосов - 55, средняя оценка - 4.80
17 / 14 / 6
Регистрация: 21.04.2009
Сообщений: 65

Как поймать событие "Maximize" формы?

20.05.2009, 15:10. Показов 10561. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Подскажите пожалуйста, как определить что пользователь нажал кнопку "Maximize", расположенную в правом верхнем углу формы?
Благодарю.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.05.2009, 15:10
Ответы с готовыми решениями:

Как поймать событие нажатия мыши в WebEngineView в QML
Здравствуйте! Имеется следующего вида код в QML: import QtQuick 2.12 import QtWebEngine 1.8 import QtQuick.Controls 1.4 ...

Как у QTreeview поймать событие клика по пустой области (не по Item)?
Добрый день! Требуется при нажатии пользователем в пустой области QTreeView не по Item, снять выделение Item и на основании того, что...

Как "поймать" событие WM_ENTERSIZEMOVE?
Всем Здравствуйте! Я работаю с GLFW, этим и усложняется задача. Собственно там есть событие glfwSetWindowPos, но оно наступает если...

27
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
23.05.2009, 12:28
Студворк — интернет-сервис помощи студентам
проверил на BDS2006 - работает.
0
17 / 14 / 6
Регистрация: 21.04.2009
Сообщений: 65
23.05.2009, 12:50  [ТС]
Цитата Сообщение от VoodooMan Посмотреть сообщение
проверил на BDS2006 - работает.
Блин!!!
Я наверно тупой, но у меня оно не идёт. Вернее идёт но мессаджи "ептели" не появляются, не пойму что я делаю не так....
В общем, спасибо. Если оно у вас работает, значит буду разбираться, искать гдя я ступил.
Как найду какой-нибудь способ отпишусь.
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
23.05.2009, 12:55
mustss, вообще твой код у меня вы кидывал Access Violetion... а когда перенес функцию в cpp, а в хидере только прототип указал, все заработало
0
17 / 14 / 6
Регистрация: 21.04.2009
Сообщений: 65
23.05.2009, 13:06  [ТС]
ну да, я тут читанул ночью книжку одну, там сказано: что в хидере только прототипы и надо указывать и никаких операторов
Я тут в вашем коде убрал из первого условия:
C++
1
&& Message.LParamLo == 0 && Message.LParamHi == 19
после чего прога начала реагировать на события, не так как надо, но раньше она вообще их игнорировала,
где-нибудь кроме хелпа описание этих параметров найти нельзя? А то я английстий хоть и знаю но плохо.
Смотрел в Архангельском, там нашёл только описание самой структуры Message, а какой параметр что значит там не указано....
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
23.05.2009, 13:25
справочник по апи надо искать, там это все описано должно быть, я опытным путем все получал, хотя не пойму, почему у меня нормально работает, а у тебя - нет
0
27 / 27 / 2
Регистрация: 25.01.2011
Сообщений: 45
25.01.2011, 14:57
Маленький комментарий для тех, кто, как я, наткнулся на тему, тупо скопировал код, а он и не работает

Насколько я понял, сообщение SW_MAXIMIZE приходит каждый раз, как меняются координаты левого верхнего угла рабочей области окна. (Какого чёрта оно при этом называется SW_MAXIMIZE, непонятно) При этом в LParamLo лежит его координата по X, а в LParamHi - соответственно по Y. Понятно, что при развёртывании X обнуляется. А вот чему будет равен Y, зависит от многих вещей. От темы оформления, от того, есть ли меню у окна. Так что используйте с осторожностью
У меня получилось где-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void __fastcall TfMain::WndProc(Messages::TMessage &Message)
{
  TCustomForm::WndProc(Message);
 
  if(Message.Msg == SW_MAXIMIZE)
  {
    AnsiString s;
    if (! Message.LParamLo)
    {
      isMax = true;
      s = "Maximize - MSG " + IntToStr(Message.Msg) + " X: " + IntToStr(Message.LParamLo)
         + " Y: " + IntToStr(Message.LParamHi);
      ShowMessage(s.c_str());
    }
    else if (isMax)
    {
      isMax = false;
      s = "Restore - MSG " + IntToStr(Message.Msg) + " X: " + IntToStr(Message.LParamLo)
         + " Y: " + IntToStr(Message.LParamHi);
      ShowMessage(s.c_str());
    }
  }
}
0
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
25.01.2011, 21:06
А по-моему, всё достаточно просто и предельно ясно.
Когда пользователь выполняет так называемое "разворачивание формы" система посылает окну сообщение о перемещении окна (WM_MOVE) и об изменении размера (WM_SIZE).
Когда данные команды будут выполнены окну посылается уведомление о том, что позиция окна была изменена (WM_WINDOWPOSCHANGED).
Вот это сообщение и нужно перехватывать/обрабатывать.

Итак, в заголовочном файле (в области public) объявляем перехват:
C++
1
2
3
4
void virtual __fastcall WMPosChanged(TWMWindowPosChanged &Message);
BEGIN_MESSAGE_MAP
  VCL_MESSAGE_HANDLER(WM_WINDOWPOSCHANGED, TWMWindowPosChanged, WMPosChanged);
END_MESSAGE_MAP(TForm);
Затем, в файле с кодом описываем функцию WMPosChanged:
C++
1
2
3
4
5
6
void __fastcall TForm1::WMPosChanged(TWMWindowPosChanged &Message)
{
  if (WindowState == wsMaximized) {
    ShowMessage("Maximized");
  }
}
Запускаем и радуемся результату...
0
27 / 27 / 2
Регистрация: 25.01.2011
Сообщений: 45
26.01.2011, 14:38
2 MikeSoft: Не работает почему-то... Хотя вот так работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
  TCustomForm::WndProc(Message); 
  static bool isMax = false;
 
  if(Message.Msg == WM_WINDOWPOSCHANGED)
  {
    if (WindowState == wsMaximized)
    {
      if (! isMax)
      {
        isMax = true;
        ShowMessage("Maximized");
      }
    }
    else
    {
      if (isMax)
      {
        isMax = false;
        ShowMessage("Restored");
      }
    }
  }
}
З.Ы. Builder 6, WinXP SP3

Добавлено через 2 часа 39 минут
Ваш вариант мне, к сожалению, не подходит - к моменту прихода WM_WINDOWPOSCHANGED все нужные мне операции уже завершены. Придётся ловить WM_SIZE:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
  TCustomForm::WndProc(Message);
 
  if(Message.Msg == WM_SIZE)
  {
    if
    (
      Message.LParamLo == GetSystemMetrics(SM_CXFULLSCREEN)
      &&
      Message.LParamHi == GetSystemMetrics(SM_CYFULLSCREEN)
    )
      ShowMessage("Max"); 
  }
}
Спасибо за подробные объяснения.

Добавлено через 12 минут
Блин. На самом деле всё ещё проще.
C++
1
2
3
4
5
6
7
void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
  TCustomForm::WndProc(Message);
 
  if (Message.Msg == WM_SIZE && Message.WParam == SIZE_MAXIMIZED)
    ShowMessage("Max");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.01.2011, 14:38

Как поймать событие "ухода" курсора из подчинённой формы (в виде таблицы)
Народ здарова всем! Где можно поймать событие "ухода" курсора с какого-либо поля в сабформе? И как потом "выставить"...

Как поймать событие OnHint?
Я хочу поймать hint на taskbar? Возможно ли это?

Как поймать событие на Combobox?
Добрый день. есть заполненный combobox. autocompletemode = suggestappend autocompletesource = listitems как можно отследить...

Как поймать событие скроллинга в listBox?
Кто-нибудь знает куда копать? События, отвечающего за скроллинг (как горизонтальный, так и вертикальный) у ListBox НЕТ. Тогда как можно...

событие maximize
мне надо чтобы при maximize формы происходило действие,как это сделать?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Сезонность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru