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

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

20.05.2009, 15:10. Показов 10716. Ответов 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
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru