Delphi World - WM_ACTIVATE
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
WM_ACTIVATE

Сообщение посылается, когда окно переводится в активное или неактивное состояние. Сначала посылается окну, переходящему в неактивное состояние, а потом - активируемому.

Параметры:

  • Active - показывает состояние, приобретаемое окном, а именно активизируется или деактивизируется окно. Тип параметра Word
    • WA_ACTIVE - окно активизируется не щелчком мыши
    • WA_CLICKACTIVE - окно активизируется щелчком мыши
    • WA_INACTIVE - окно деактивизируется
  • ActiveWindow - дескриптор, который указывает на окно, из которого фокус переключился на данное окно, если оно активируется, или на окно, в которое передается управление, если данное окно деактивируется. Тип параметра HWND
  • Result - возвращаемое значение. Если приложение обрабатывает это сообщение, оно должно возвращать нуль. Тип параметра Integer
  • Minimized - свидетельствует о том, что окно минимизировано. Тип параметра WordBool

Действие по умолчанию

Если активируемое окно не свернуто, то оно получает фокус.

Примечания

Если окно активируется щелчком мыши, оно получает также сообщение WM_MOUSEACTIVATE.

Давайте рассмотрим пример использования этого сообщения. Например у нас есть GroupBox собственного производства. Его состав таков: на заднем плане находится панель (компонент класса TPanel). Его свойство BevelOuter установлено в bvLowered, а свойство BevelInner равно bvRaised - в итоге получается такая вогнутая каемка, как показана на рисунке. Сверху на эту панель была вынесена ещё одна, которая является заголовочной и по сценарию её цвет должен меняться вместе с заголовочной полосой, в зависимости от того становиться ли главное окно приложения активным или неактивным. У этой панели свойство BevelOuter установлено в bvRaised, а свойство BevelInner равно bvNone. На эту панель выносится метка (компонент TLabel), её свойству Align присваиваем alClient, а свойству Alignment - taCenter, чтобы метка выравнилась по всей области панели, а её заголовок находился в центре.

Как же заставить панель изменять цвет?

Сначала нужно в частных объявлениях объявить процедуру обработки данного сообщения


private
  { Private declarations }
  procedure wmActivate (var Msg:TWMACTIVATE);
  message wm_Activate;

В области реализации (implementation) её нужно описать так


procedure TForm1.WMActivate (var Msg:TWMActivate);
begin
  {если окно получило фокус ввода по щелчку мыши или как иначе...}
  if (Msg.Active = WA_ACTIVE) or (Msg.Active = WA_CLICKACTIVE)then
  begin
    {...тогда цвет панели делаем равным цвету активной заголовочной полосы окна}
    Panel1.Color := clActiveCaption
  {иначе...}
  else
    {...цвет панели будет соответствовать НЕактивной заголовочной полосе окна}
    Panel1.Color := clInactiveCaption;
  inherited;
end;

Если из главного окна вызывается другое, и мы хотим в тот момент, когда оно теряет фокус ввода - минимизировать его, нужно код реализации процедуры немного изменить:


procedure TForm1.WMActivate (var Msg:TWMActivate);
begin
  if (Msg.Active = WA_ACTIVE) or (Msg.Active = WA_CLICKACTIVE)then
  begin
    Panel1.Color := clActiveCaption;
    {сворачиваем второстепенное окно, когда оно теряет фокус ввода}
    ShowWindow(Msg.ActiveWindow, sw_minimize);
  end
  else
  begin
    Panel1.Color := clInactiveCaption;
    {восстанавливаем второстепенное окно, когда оно активизируется}
    ShowWindow(Msg.ActiveWindow, sw_restore);
  end;
  inherited;
end;

Обратите внимание на ключевое слово inherited, которое позволяет посланное сообщение обработать процедуре класса предка.

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования