В продолжение темы о создании собственных компонентов wxWidgets решил написать
эту заметку. Касается наш сегодняшний разговор обработки событий от мыши, а
точнее, захвату мыши компонентом при нажатии. Что есть захват мыши? Это когда
наш компонент продолжает обрабатывать события, поступающие при передвижении
курсора мыши, даже когда сам курсор находится вне компонента. Для начала
создадим простенький компонент и хост-приложение для него:
Итак, что же у нас получилось. У нас получился новый компонент, который при
перемещении над ним курсора мыши отображает координаты мыши.
Для того
чтобы наш компонент продолжал обрабатывать событие wxEVT_MOTION
даже когда курсор находится вне компонента нам необходимо добавить пару
обработчиков – обработчики нажатия и отжатия левой кнопки мыши.
MouseCaptureTestCtrl.h
...
class MouseCaptureTestControl : public wxControl
{
DECLARE_EVENT_TABLE()
...
void OnLeftMouseDown(wxMouseEvent & event);
void OnLeftMouseUp(wxMouseEvent & event);
};
...
Когда пользователь нажимает левой кнопкой мыши на компоненте, происходит захват
мыши, и пока кнопка не будет отжата, компонент будет отрисовывать новые значения
координат мыши при перемещении курсора. Такой функционал может быть востребован
при разработке, например, графических редакторов, когда курсор мыши может
выходить за пределы области рисования. Вот это мы сейчас и рассмотрим на
простеньком примере.
Итак, что у нас получилось. Мы создали новый класс MyLine и
добавили в наш компонент массив объектов этого класса. При нажатии кнопки мыши
мы запоминаем координату, где было произведено нажатие, а пи отжатии добавляем в
массив новую линию, концы которой соответствуют точке нажатия и отжатия кнопки
мыши. Ну и сам компонент отрисовывает все линии в обработчике события
wxEVT_PAINT.
Все это чудесно, но чего-то не хватает. А не хватает у нас отрисовки создаваемой
линии в процессе перемещения курсора при нажатой левой кнопке. Для того чтобы
добавить эту отрисовку нужно дописать несколько строк:
Ну вот, как видно, линия продолжает отрисовываться даже когда курсор находится
за пределами компонента, что, собственно, и нужно было продемонстрировать.
При разработке CMS S.Builder наша команда
активно использовала AJAX. Теперь вот решили поделиться накопленным
опытом. Начнем с этого хабратопика. Не буду здесь затрагивать различные
фреймворки и библиотеки. Свой код всегда роднее. Для работы с AJAX-ом в
S.Builder написана библиотека
sbAJAX. Можете качать и пользоваться :). В этом файле есть функция
sbEvalJS. Для тех, кто не знает, объясню. При подгрузке через AJAX и вставке
на страницу HTML-кода, содержащего JavaScript, JavaScript выполняться не будет
или полезут баги. Эта функция как раз решает поставленную задачу.
Хотя наш обзор немного запоздал, оригинальный Dojo 1.2 вышел в релизной
версии ещё 6-го октября, но сейчас мы наверстаем упущенное. И так, Dojo Toolkit — это самая мощная и
гибкая ajax-библиотека из всех, что есть на рынке, она активно развивается и
имеет большое комьюнити. Кстати, это самое комьюнити, совместно с компанией
Sitepen, имеет ещё несколько проектов, среди которых и Cometd и некоторые
другие, не менее интересные, о которых мы скоро вам расскажем. Сегодня же все
внимание на флагманский продукт —
Dojo
1.2.
Если вы профессиональный веб-разработчик и постоянно имеете дело с
разработкой и отладкой сложных AJAX приложений, то наверняка знаете и
используете Firebug — плагин для браузера
Firefox, предназначенный для отладки и исследования веб-приложений. Текущая его
версия, 1.2х достаточно стабильная и функциональна, чтобы помочь в 99% проблем,
которые могут возникнуть при разработке. Но и этот инструмент не лишён если не
недостатков, то некоторых фич, которые могли бы облегчить работу. И даже
идеальный инструмент можно сделать ещё более идеальным, как бы это не звучало.