Для изменения стандартной обработки некоторого сообщения можно изменить метод WndProc или метод диспетчеризации события. Метод MainWndProc фактически не участвует в обработке сообщения, и поэтому изменять его нет смысла. Обработчик события не меняется, а просто создается на этапе конструирования программы.

Наиболее простой неестественный способ изменения - перекрытие метода диспетчеризации. Например, все визуальные компоненты имеют метод Click, осуществляющий диспетчеризацию сообщения WM_CLICK. Если ваш компонент должен реагировать на щелчок мыши, следует перекрыть этот метод:

type TMyControl «
class(TControl)
protected
procedure Click;
override;
end;

TMyControl.Paint; begin inherited; // Стандартная диспетчеризация ... // Нестандартная обработка

end;

Другой пример. Все наследники TGraphicControl и TCustomControl обладают методом Paint. Этот метод не осуществляет диспетчеризацию сообщения WM_PAINT, но вызывается всякий раз, когда должна произойти отрисовка компонента. В классах TGraphicControl и TCustomControl он ничего не делает. Если ваш компонент наследует от одного из этих классов или если его вид отличается от вида его непосредственного предка, вам следует перекрыть этот метод и осуществить нужную отрисовку компонента.

Метод WndProc имеют все визуальные компоненты. Он перекрывается редко-в основном тогда, когда компонент не должен реагировать на сообщения, которые обрабатываются его предком. Дело в том, что этот виртуальный метод получает сообщение до того, как оно будет передано методу Dispatch, который выбирает нужный метод диспетчеризации сообщения. Перекрыв WndProc, вы анализируете сообщение и решаете, производить ли его дальнейшую обработку:

type TMyControl = class(TContorol) protected
procedure WndProc(var Message: TMessage);
override;
end;

procedure TMyControl.WndProc(var Message: TMessage); begin ... // Анализ сообщения - обрабатывать его?

inherited; // -Да, обрабатывать end;

Для удобства анализа сообщений в модуле Messages определены константы от WM_MOUSEFIRST до WM_MOUSELAST, ограничивающие группу сообщений от мыши. Если по каким-либо причинам ваш визуальный компонент не должен реагировать на сообщения от мыши, фильтрация осуществляется так:

procedure TMyControl.WndProc(var Message: TMessage); begin if (Message.Msg < WM__M0USE FIRST) or (Message.Msg > WM_MOUSELAST) then inherited

end;

9.4. Обработка сообщений Windows и компонентных сообщений || Оглавление || 9.4.3. Перехват сообщений


Искусство создания компонентов Delphi



Новости за месяц

  • Август
    2019
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс