| - Зачем
- Application Wizard'ы
- Визард проекта со сплиттером
- Закладка настроек проектов
- Закладка настроек сплиттера
- Закладка настроек дочерних окон
- Class Wizard'ы
- Визард диалога
- Визард субклассирования контрола
- Визард наследования контрола WTL
- Заключение
Зачем У библиотеки 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 будет иметь следующий вид Как можно заметить на рисунках, добавлено 3 визарда. У них пока одинаковые иконки, так как я не умею рисовать и не придумал ничего лучшего, чем взять их из 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 контрола class CMyScrollImpl : public CScrollImpl<CMyScrollImpl> Это пример наследования от CScrollImpl Заключение Надеюсь, что эти визарды очень помогут Вам при разработке WTL проектов. Чтобы скачать перейдите на страницу закачек. Вы можете помочь этому проекту.
|
|