Блог → Как технология WTL меняет мир Windows-программирования

Некоторое время назад разработчики, использующие среду программирования Visual C, начали поговарить о WTL. Это аббривеатура от Windows Template Library, и она представляет из себя набор классов, которые предназначены для конструирования графического интерфейса пользователя. WTL имеет в своей основе другой набор библиотек - ATL (от Active Template Library), и связка WTL+ATL является мощной архитектурой, "заточенной" под создание приложений, и среди её достоинств - высокая скоростью работы и компактность исполняемых файлов.

Разумеется, для использования ATL, хорошо бы знать COM (Component Object Model), ведь ATL - это лишь "обёртка" над СОМ, которая помогает нам избавиться от рутины. То же самое и с WTL - чтобы разобраться в её устройстве, сначала неплохо бы разбираться в Win32 API и GDI. WTL в компании Microsoft разрабатывает группа ATL, и начиная с января 2000 года, библиотека свободно распространяется как часть Microsoft Platform SDK (можно выбрать её в разделе "Source code" при установке SDK).

Из чего же состоит WTL? Она включает в себя набор классов для приложений и "мастер" под названием AppWizard. С помощью этого "визарда" можно легко создать каркас приложения: SDI-, многопоточного SDI-, MDI- или же на основе диалога (dialog-based). MultiSDI-приложение выглядит как несколько экземпляров обычного SDI-приложения, но на самом деле это разные окна одного и того же процесса. Каждое окно связано со своим потоком выполнения (thread). Примером такого приложения может служить Internet Explorer или Word 2000.

Также ваше приложение может иметь элементы управления ActiveX, и может быть СОМ-сервером. На втором шаге мастера AppWizard вы выбираете один из нескольких видов классов-представлений. В WTL нет классов-документов, как в MFC (CDocument), но есть классы-представления (views) и рамки (frames). Набор представлений в WTL и в MFC аналогичен. Можно использовать представление на основе стандартного элемента управления (list box, edit control, list view, tree view или rich edit control), на основе диалога (Form view) или на основе элемента управления ActiveX IE Web Browser, который позволяет загружать и отображать HTML страницы. Можно выбирать, какую панель инструментов будет иметь приложение: простую (toolbar), в стиле IE (rebar), или в стиле Windows СЕ (command bar), позволяющую добавлять окна, отличные от кнопок, в панель инструментов. Также можно добавить строку статуса (status bar).

В WTL много кода, предназначенного для работы с окнами. Классы окон в WTL наследуются от класса CWindow из ATL, так что использовать WTL отдельно от ATL не удастся. Как и в ATL, вам потребуется глобальная переменная _Module, содержащая данные приложения. WTL также добавляет новые макросы обработки сообщений и представляет окна с разделителями (splitter-window) и окна с прокруткой (scroller-window).

Макрос UPDATE_ELEMENT (аналог ON_UPDATE_COMMAND_UI из MFC) управляет состоянием пунктов меню и кнопок тулбара, а технология DDX/DDV позволяет обмениваться данными между элементами управления окна и переменными класса. В библиотеке есть классы для всех стандартных Win32 и Windows 2000 диалогов (common dialogs). Хотя эти классы-обёртки довольно тонки, они упрощают такие задачи как выбор файла, папки, шрифта или цвета и т.п. Причем для некоторых диалогов имеются по несколько классов, так что можно выбрать базовый класс, максимально отвечающий вашим нуждам. Классы для работы с принтерными контекстами устройства позволяют легко добавить в приложение функции печати и предварительного просмотра (print preview).

WTL содержит классы для всех стандартных элементов управления, в том числе и для новых элементов управления W2K. Есть и классы, не относящихся к Win32; такие как панель команд (CommandBarCtrl), кнопка с изображением (CBitmapButton), гиперссылка (CHyperLink), курсор типа "песочные часы" (CWaitCursor) и строка статуса с несколькими панелями (CMultiPane StatusBarCtrl).

Вне зависимости от числа стандартных элементов управления, рано или поздно каждому захочется нарисовать свои. Запросто! Ведь WTL предоставляет простые классы-обёртки для следующих примитивов GDI: контекст рисования (device context), перо (реп), кисть (brush), шрифт (font), битовое изображение (bit map), регион (region), метафайл (metafile) и палитра (palette). Все эти классы очень тонки, но удобны в использовании. Класс-оболочка HDC поддерживает метафайлы и OpenGL, и предоставляет несколько полезных возможностей - в частности, функцию рисования недоступных (деактивированных) пунктов меню и кнопок тулбара.

И, наконец, в библиотеке имеются служебные классы CSize, CPoint, CRect, CString, CRecentDocument List и CFindFile, о назначении которых можно легко догадаться из их названий, это всё клоны соответствующих классов MFC (кроме CFindFile).

Так что же выбрать, WTL или MFC? По стилю использования WTL очень похожа на MFC, поэтому, если вы знакомы с MFC и ATL, вам будет достаточно одного дня на изучение WTL. Так что же выбрать в качестве основы для своего следующего проекта? Приведем краткое сравнение двух библиотек от Microsoft.

Преимущества MFC:
- имеет ClassWizard;
- официально поддерживается Microsoft, имеется море документации;
- поддерживает класс документа (CDocument);
- поддерживает OLE-документы;
- имеет пристыковывающиеся панели /диалоги (Docking Windows);
- имеет более сильную поддержку DDX.

Преимущества WTL:
- базируется на шаблонах (templates), позволяет встраиваться в архитектуру;
- имеет более обширную поддержку элементов управления;
- поддерживает Multi-SDI приложения.

Но основное преимущество WTL - это, конечно же, малый размер исполняемого ЕХЕ-файла или DLL-библиотеки. Размер пустого SDI-приложения WTL при статической сборке - 24 Кб против 230 Кб у MFC. К тому же, приложение не нуждается в runtime DLL'ке (msvcrt.dll, 288 Кб). А при самом популярном нынче способе распространения приложений (т.е. через Интернет), размер становится действительно важен.

Итак, если вы пишете код в WTL, он будет меньше по объёму и более эффективен, и вы будете иметь все преимущества поддержки СОМ в ATL. Если же размер кода для вас не важен, или вы используете библиотеки третьих фирм (например, Stingray), то разумным выбором для вас остается связка MFC+ATL.

Что же дальше? Если вы этого еще не сделали, скачайте WTL или SDK целиком с сайта Miscrosoft. Соберите примеры, поставляемые с WTL, помотрите их код. Ссылок на англоязычные сайты, посвященные WTL, полно на этом сайте. Пока WTL официально не поддерживается и особо не пропагандируется, но она настолько логично расширяет ATL, что порой трудно вспомнить, где заканчивается ATL и начинается WTL. RAD-системы завоевывают все большую популярность, но всегда останется необходимость в написании быстрых компактных приложений. Похоже, что WTL предстоит долгая и насыщенная событиями жизнь.