WTL Wizards

Об авторе
Проекты
Новости
Скачать
Резюме



  1. Зачем
  2. Application Wizard'ы
    1. Визард проекта со сплиттером
      1. Закладка настроек проектов
      2. Закладка настроек сплиттера
      3. Закладка настроек дочерних окон
  3. Class Wizard'ы
    1. Визард диалога
    2. Визард субклассирования контрола
    3. Визард наследования контрола WTL
  4. Заключение

Зачем

У библиотеки WTL есть один недостаток. Это отсутствие поддержки со стороны средств разработки. Я уже представил свой продукт WTL Helper. Сейчас я решил добавить к нему еще несколько визардов, которые могут помочь при работе с WTL.

Application Wizard'ы

После инсталляции в списке визардов для создания проектов появится новый шаблон.


Визард проекта со сплиттером

Запустив его вы увидите следующее:

Закладка настроек проектов



Среди главных отличий, который были внесены по сравнению с обычным визардом - это отсутствие типа приложения диалога, а также по умолчанию стоит генерация .cpp файлов. Я также убрал страницу Overview, поскольку считаю, что она  лишняя.

Закладка настроек сплиттера


На данной закладке вы можете выбрать некоторые опции для сплиттера.

Расположение сплиттера: Вертикальный - это значит, что полоска сплиттера расположена вертикально, то есть дочерние окна расположены слева и справа от разделительной полосы. Горизонтальный - полоса сплиттера расположена горизонтально.

Стиль сплиттера:
Пропорциональный - означает, что размеры каждого из дочерних окон ( и соответственно позиция полосы сплиттера) будут изменяться пропорционально изменению размеров окна сплиттера.
Выравнивание по левому (для горизонтального сплиттера по верхнему) краю - означает, что при изменении размеров сплиттера будет изменяться размер дочернего окна правее (ниже) разделительной полосы, а соотвественно дочернее окно, которое левее (выше) - будет оставаться неизменным.
Выравнивание по правому краю работает аналогично выравниванию по левому краю, за исключеним, того, что неизменными остаются правое (нижнее) дочерние окна, а изменяют размеры левое (верхнее).
Здесь следует отметить одну особенность. Если вы не укажите позицию сплиттера, то на старте приложения при пропорциональном  или правом  выравнивании позиция сплиттера будет примыкать к левому краю (при пропорциональном) либо к правому краю (при правом ), в то время как при левостороннем выравнивании позиция сплиттера будет посередине.

Начальная позиция сплиттера
В этом application wizard'е можно установить начальную позицию разделительной полосы. Можно установить как относительное, так и абсолютное значение расстояния до левого (верхнего) края. Для это генерируется функция
void CMainFrame::SetSplitterPos(int iPos)
{
    if (iPos < -1)
    {
        RECT rc;
m_wndSplitter.GetClientRect(&rc);
        iPos = (rc.right - rc.left) / (-iPos);
    }
    m_wndSplitter.SetSplitterPos(iPos);
}
Если передать в функцию отрицательное значение, то будет устанавливаться относительное положенее разделительной полосы, иначе абсолютное.
Для установки положения сплиттера используется дополнительное сообщение, которое с помощью PostMessage посылается окну. Это сделано потому, что при создании сплиттер имеет нулевые размеры (если конечно не задать его самостоятельно), и не может корректно устанавливать положение разделительной полосы (это связано с реализацией CSplitterImpl). Свои размеры он получит после обработки сообщения WM_SIZE для окна-рамки (Frame window). Именно поэтому используется PostMessage, так как он просто добавляет сообщение в очередь сообщений, и, следовательно, обработчик его вызовется после обработчика сообщения WM_SIZE. Именно в этом обработчике правильно устанавливать позицию разделительной полосы.

Закладка настроек дочерних окон


Как видно из рисунка, параллельно настраивается 2 дочерних окна, поэтому я все буду описывать на примере первого окна.
Использование контейнера:
Если установить галочку Use Pane Container, то тогда в качестве дочернего окна будет использоваться объект класса CPaneContainer, а само view будет создано в нем. Для него можно задать 2 опции: показывать кнопку (крестик) для закрытия, а также положение горизонтальное (по умолчанию) или вертикальное. Если вы будете установить показ кнопки закрытия, то будет сгенерирован код, который при нажатии на неё закроет текущее дочернее окно и переведет сплиттер в режим показа только одного окна.

С названием класса view надеюсь все понятно.
 
Базовый контрол для view.
По умолчанию стоит, чтобы базовым контролом было обычное окно, но можно сделать, чтобы был один с стандартных контролов, например Edit, ListView и так далее либо HTML страница.

Базовый класс для view
Это класс, от которого будет наследоваться на класс view. Для обычного окна - это CWindowImpl, для диалога - CDialogImpl, либо любой другой из списка.

Хостинг ActiveX
Поставьте галочку, чтобы для окна был включена возможность хостинга ActiveX компонентов.

Class Wizard'ы

После инсталляции диалог, который вызывается на Project->Add Class будет иметь следующий вид
Visual C++ Add class dialogue
Visual C++ add class dialog on WTL folder

Как можно заметить на рисунках, добавлено 3 визарда. У них пока одинаковые иконки, так как я не умею рисовать и не придумал ничего лучшего, чем взять их из WTL.
Рассмотрим каждый из визардов.

Визард диалога

Вид диалога для добавления WTL диалога
Short name - это короткое имя, которое будет использоваться для генерации IDD диалога, а также для генерации всех остальных полей. В качестве базового класса может использоваться CDialogImpl, CAxDialogImpl, CPropertyPageImpl,CAxPropertyPageImpl. Там есть еще один тип Form View, но отличается немного ресурсом диалога.
Флаг Generate Cpp указывает, что реализация класса будет сделана в cpp файле.
Флаг Add DDX support указывает, что одним из предков будет CWinDataExchange, также будет создана пустая DDX карта и в OnInitDialog и в OnOK будет добавлен метод DoDataExchange().
И наконец, флаг  Add dialog resize support добавляет в число предков CDialogResize, создает пустую карту DLGRESIZE и вставляет в OnInitDialog функцию DlgResize_Init.
Перейдем к оставшимся визардам.

Визард субклассирования контрола

Диалог субклассирования контрола
Создает класс, который субклассирует стандартный контрол. То есть новый класс будет иметь вид
class CMyControlClass :
public CWindowImpl<CMyControlClass, CEdit>
При субклассирования обычной эдитки.

Визард наследования контрола WTL

Наследование контрола WTL
Создает потомка от WTL контрола
class CMyScrollImpl :
public CScrollImpl<CMyScrollImpl>
Это пример наследования от CScrollImpl

Заключение

Надеюсь, что эти визарды очень помогут Вам при разработке WTL проектов. Чтобы скачать перейдите на страницу закачек.
Вы можете помочь этому проекту.


Проекты
Hosted by uCoz