Главная » C++, C++ Builder » Карты сообщений и CBuilder

0

Windows — система, построенная на сообщениях (messages). Сообщения посылаются системой Windows приложениях для информирования их об изменениях состояния, изменениях в среде, действиях пользователя, а также для информирования о том, что какое-то действие приложению необходимо выполнить.

С другой стороны, CBuilder — система, основанная на событиях (events). События генерируются компонентами VCL и системой и передаются в формы приложения и другие объекты через обработчики событий. Эти обработчики вызываются с информацией, необходимой приложению для понимания, что же происходит. Очень многие сообщения Windows завернуты в обложку события в CBuilder. Например, когда система Windows генерирует сообщение LBN_SELCHANGE, которое информирует приложение о том, что пользователь сделал изменения выбора элементов в списке, объект библиотеки VCL TListBox (список) в CBuilder генерирует событие SelectionChange для владельца списка. Добавление  обработчика события SelectionChange  — все, что нужно для обработки низлежащего сообщения Windows LBN_SELCHANGE.

Конечно, не всегда все так просто. Windows содержит  буквально  тысячи  сообщений,  которые могут посылаться в крайне редких случаях. Также некоторые сообщения не доходят до низкого уровня VCL, так как они уже обработаны каким-либо объектом VCL.

Иногда вам понадобится обрабатывать сообщения, для которых нет соответствующего события в объекте VCL, к которому сообщение относится. Замечательный пример этого — объект TForm и сообщение WM_VSCROLL. Сообщение WM_VSCROLL посылается форме, когда происходит щелчок на полосе прокрутки (scrollbar) формы (которая является частью самой формы) в том или ином месте. Есть несколько случаев, когда генерируется это сообщение. Когда пользователь нажимает стрелку вниз или стрелку вверх на полосе прокрутки, сообщение генерируется с кодом SB_LINEUP (для стрелки вверх) и SB_LINEDOWN (для стрелки вниз).  Также  сообщение посылается с кодом SB_PAGEUP, когда  щелчок происходит на самой полосе прокрутки выше указательной кнопки. Есть также много других примеров таких кодов.

Дело, однако, в том, что вы не можете поймать сообщения прокрутки в форме через обработчики событий. Если вы посмотрите на список определенных для  класса VCL TForm событий, вы не найдете там событий OnLineUp или OnPageDown. Если вы хотите определить такие события самостоятельно, то вам придется создавать новый компонент, наследующий от TForm (нетривиальное упражнение) и затем специально проверять на сообщение в компоненте или найти какую-нибудь дыру в системе, чтобы сделать сообщения полосы прокрутки доступными для вас, программиста. Или вы можете использовать карты сообщений.

Карты сообщений очень хорошо знакомы программистам на Borland C++/OWL или Visual C++/MFC, они используются каркасными системами для работы с сообщениями. Вы пишите функцию, присоединяете ее к позиции в карте сообщений, соответствующей нужному сообщению, и ждете, пока система не вызовет функцию в ответ на это сообщение. Карты сообщений далеко не так элегантны, как обработчики событий, хотя они и работают. Гораздо труднее, на самом деле почти невозможно переключать обработчики сообщений во время работы приложения в том виде, в каком это можно сделать для обработчиков событий. Перед тем, как систему карты сообщений, серьезно подумайте, нужно ли вам это.

Ладно, все сказано, так далеко вы вряд ли стали бы читать, если бы у вас не было к тому причины. Карты сообщений действительно позволяют программисту на CBuilder решать  некоторые проблемы, которые иначе решить невозможно. Сравните это с программистами на Visual Basic, имеющими в активе сообщения, которые позволяет обрабатывать эта система, и никаких других. Программистам на Visual Basic частенько приходится прибегать к посторонним компонентам, например Message Blaster VBX, для того, чтобы обрабатывать сообщения, не  определенные внутри Visual Basic. До версии Visual Basic 5.0, по сути, вы не могли определить функцию типа callback для сообщений. Может, CBuilder и не идеал, но это заметный шаг вперед в соревновании в данной области.

В этом примере вы увидите, как реализовать карту сообщений в вашем приложении и как обработать ускользающее сообщение WM_VSCROLL. Мы будем использовать это сообщение для изменения изображения на экране, а также увидим, как отображать информацию в секциях панели состояния.

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

  • Комментарии