Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Паппас К., Мюррей У. - Visual C++ 6. Руководство разработчика - 2000

.pdf
Скачиваний:
289
Добавлен:
13.08.2013
Размер:
4.96 Mб
Скачать

//TODO: Поместите здесь вызовы РХ_-функций для каждого

//постоянного пользовательского свойства. ;

//Цвет элемента управления меняется на светло-серый

PX_Color(pPX, _T("HitTDCtrl"), m_hitTDCtrl, RGB(200, 200, 200)); }

Эта функция отвечает за инициализацию переменной m_hitTDCtrl, которой присваивается значение, соответствующее светло-серому цвету. Функция рх_соlоr () осуществляет обмен данными между переменной m_hitTDCtrl и свойством HitTDCtrl.

Мастер классов создал стандартные реализации функций OnLButtonDown() и OnLButtonUp()

.Ниже показано, какие изменения вносятся в эти функции.

Функция OnLButtonDown() получает контекст устройства для рисования и вызывает функцию HitTDCtrl(), осуществляющую вывод текущих значений времени и даты. После отпускания левой кнопки мыши функция OnLButtonUp() вызывает функцию InvalidateControl(), что является сигналом системе послать элементу управления сообщение wm_paint.

void CTDCtrlCtrl::OnLButtonDown(DINT nFlags, CPoint point) { // TODO: Здесь добавьте собственный код обработчика

CDC* pdc;

//Отображение даты к времени pdc = GetDC() ; HitTDCtrl(pdc); ReleaseDC(pdc);

COleControl::OnLButtonDown(nFlags, point); }

void CTDCtrlCtrl::OnLButtonUp(OINT nFlags, CPoint point)

{

//TODO: Здесь добавьте собственный код обработчика

InvalidateControl(); COleControl::OnLButtonUp(nFlags, point); }

Ниже показан код функции HitTDCtrl(),который следует добавить в конец файла TDCTRLCTL.CPP:

void CTDCtrlCtrl::HitTDCtrl(CDC* pdc)

{

CBrush* pOldBrush;

CBrush hitBrush (TranslateColor(m_hitTDCtrl)); CRect re;

TEXTMETRIC tm; struct tm *date_time; time_t timer;

//Устанавливается прозрачный фон pdc->SetBkMode(TRANSPARENT); GetClientRect(re);

pQldBrush = pdc->SelectObject(ShitBrush);

//Рисование прямоугольника с заливкой pdc->Rectangle(re);

//Получение даты и времени time(Stimer);

date_tirae = localtime(stimer);

const CStringS strtime = asctime(date_time);

// Получение информации о шрифте и вывод надписи pdc->GetTextMetrics (Ј.tm); pdc->SetTextAlign(TA_CENTER | TA_TOP); pdc->ExtTextOut((re.left + re.right) /2,

(re.top + re.bottom - tm.tmHeight) /2, ETO__CLIPPED, re, strtime, strtime.GetLengthO - I, NULL); pdc->SelectObject(pOldBrush);

}

Цвет кисти определяется на основании переменной m_hitTDCtrl, которая была модифицирована в функции DoPropExchange(). Заливке подвергается вся область элемента

431

управления. Значения даты и времени запрашиваются с применением стандартных функций языка С — time() и localtime().

Тестирование элемента управления TDCtrl

Для тестирования окончательной версии элемента управления TDCtrl воспользуемся программой MicrosoftWord. Вызовите окно вставки объектов и выберите из списка элемент управления TDCtrl. После вставки в документ элемент управления можно масштабировать

(рис. 22.13).

Рис. 22.13. Измененные размеры элемента управления TDCtrl

432

Рис. 22.14. После щелчка мыши на элементе управления в нем отображаются время и дата

Теперь наведите указатель мыши на элемент управления и щелкните левой кнопкой мыши, в результате чего желтый цвет прямоугольной области будет заменен серым и в ней отобразятся текущие значения времени и даты (рис. 22.14).

433

Глава 23. СОМ и ATL

Создание ATL-проекта Polygon

o Модификация шаблона

oТестирование элемента управления ATL на Web-странице

Впредыдущих двух главах говорилось о том, что технологии OLE и ActiveX основаны на модели компонентных объектов — СОМ. Как вы помните, СОМ определяет механизмы предоставления объектом своих свойств и методов, а также принципы межзадачного взаимодействия объектов и контейнеров. В этой главе вы познакомитесь с библиотекой активных шаблонов — ATL (ActiveTemplateLibrary), с помощью которой можно легко создавать СОМ-объекты, элементы управления ActiveXи многое другое. ATLтакже содержит встроенные средства поддержки большинства базовых интерфейсов СОМ.

Мы создадим простое ATL-приложение, в котором будут совмещены возможности сгенерированного шаблонного проекта Polygonи элемента управления ActiveX, разработанного нами в предыдущей главе. Затем мы встроим полученный СОМ-объект в HTML-документ, который можно просматривать с помощью броузера InternetExplorer.

Создание ATL-проекта Polygon

ATL-проекты создаются с помощью мастера ATLCOMAppWizard. Делается это следующим образом.

1.В окне компилятора VisualC++ в меню Fileвыберите команду Newи в открывшемся диалоговом окне перейдите на вкладку Projects.

2.Выберите элемент ATLCOMAppWizard.

3.В качестве имени проекта введите Polygon(рис. 23.1).

После щелчка на кнопке ОК откроется окно мастера ATLCOMAppWizard(рис. 23.2).

Рис. 23.1. Выбор типа проекта

434

Рис. 23.2. Окно мастера ATL-проекта

В группе опций ServerType установите переключатель DynamicLinkLibrary (DLL) и щелкните на кнопке Finish. Откроется окно NewProjectInformation с итоговой информацией о создаваемом ATL-проекте (рис. 23.3).

435

Рис. 23.3. Диалоговое окно New Project Information

Щелкните на кнопке ОК, чтобы запустить процесс генерирования кода программы.

Пока что мастер создал лишь оболочку проекта, в которую необходимо добавить один или несколько элементов управления. Это можно сделать с помощью мастера ATL-объектов, который вызывается по команде NewATLObject... из меню Insert(рис. 23.4).

Рис. 23.4. Мастер ATL Object Wizard позволяет добавлять в ATL-проект различные элементы управления

В окне мастера в списке Category выберите элемент Controls, затем в списке Objects— элемент FullControl и щелкните на кнопке Next. В открывшемся диалоговом окне вам представится возможность задать различные параметры конфигурации создаваемого

436

элемента управления. Сначала на вкладке Names в поле ShortName введите имя объекта — Polyctl. Все остальные поля будут автоматически инициализированы самим мастером (рис. 23.5).

Рис. 23.5. В окне свойств можно установить характеристики элеменета управления

Теперь перейдите на вкладку Attributes и установите опции Support ISupportErrorInfo и Support Connection Points (рис. 23.6).

Рис. 23.6. На вкладке Attributes устанавливаются служебные опции

Далее активизируйте вкладку StockProperties и выберите свойство FillColor, которое будет поддерживаться элементом управления (рис. 23.7).

Щелкните на кнопке ОК, после чего мастер добавит в проект код элемента управления.

Процесс завершен, и теперь в меню Build можно выбрать команду Build или RebuildAll для компиляции проекта. По окончании компиляции задайте в меню Tools команду ActiveXControlTestContainer, чтобы протестировать созданный элемент управления.

437

Рис. 23.7. На вкладке Stock Properties выбираются базовые свойства, подддерживаемые элементом управления

В окне контейнера в меню Edit выберите команду InsertNewControl, в открывшемся диалоговом окне InsertControl найдите класс PolyCtl, после чего нажмите кнопку ОК.

Этот элемент управления не будет выполнять никаких функций до тех пор, пока мы не свяжем с ним различные свойства и события.

Модификация шаблона

Далее необходимо внести некоторые изменения в сгенерированный мастером

ATLCOMAppWizard шаблон проекта Polygon.

Добавление свойства

Свойства элемента управления реализуются посредством интерфейса iPolyCtl. Чтобы добавить новое свойство, в окне компилятора VisualC++ перейдите на вкладку ClassView, выберите интерфейс IPolyCtl и щелкните правой кнопкой мыши, после чего в открывшемся контекстном меню выберите команду AddProperty.... На экране появится диалоговое окно

AddPropertytoInterface(рис. 23.9).

438

Рис. 23.9. В окне Add to Property to Interface можно добавить к элементу управления новое свойство

Из списка PropertyType выберите тип данных short, затем в поле PropertyName введите имя свойства Sides и щелкните на кнопке ОК. Компилятор MIDL(программа, которая создает файлы с расширением IDL) сгенерирует методы get_Sides()и put_sides(),управляющие получением и установкой значения данного свойства. Прототипы этих функций добавляются в файл POLYCTL.H, а их базовые реализации — в файл POLYCTL.CPP. Мы к ним еще вернемся.

Реализация точек подключения

Для нашего проекта также необходим интерфейс точек подключения (connectionpoints), формирующий канал передачи сообщений между элементом управления и его контейнером. СОМ-объект может иметь несколько точек подключения и, кроме того, должен реализовывать интерфейс контейнера точек подключения — iConnectionPointContainer.

Прежде всего нам нужно добавить к интерфейсу диспетчеризации событий _IPolyCtlEventsдва метода — clickin() и ClickOut(), которые сигнализируют о том, что щелчок мышью выполнен соответственно внутри и вне многоугольника, рисуемого в элементе управления. Перейдите на вкладку ClassView, щелкните правой кнопкой мыши на элементе _IPolyCtlEventsи выберите из контекстного меню команду AddMethod. В открывшемся диалоговом окне AddMethodtoInterface в списке ReturnType укажите тип возвращаемого значения void, в поле MethodName введите имя метода Clickin, а в поле Parameters задайте описание входных параметров х и у, как показано на рис. 23.10. Повторите эту процедуру для метода ClickOut.

Строки с описанием данных методов будут добавлены в файл POLYGON. IDL— библиотеку типов элемента управления. Прежде чем переходить к следующему шагу, скомпилируйте библиотеку типов, щелкнув на имени указанного файла на вкладке FileView и выбрав в контекстном меню команду CompilePOLYGON.IDL.

Далее на вкладке ClassViewщелкните правой кнопкой мыши на элементе CPolyCtl и выберите из контекстного меню команду ImplementConnectionPoint. В открывшемся одноименном диалоговом окне (рис. 23.11) должна содержаться единственная вкладка POLYGONLib(это название библиотеки типов элемента управления). В списке Interfaces перечисляются интерфейсы диспетчеризации, описанные в данной библиотеке. В нашем случае такой

439

интерфейс один: _lPolyCtlEvents. В поле Filename указано имя файла (POLYGONCP.H), в который будет помещен специальный код, управляющий транспортировкой сообщений между элементом управления и контейнером. Поставьте метку напротив интерфейса_IPolyCtlEventsи нажмите кнопку ОК

Рис. 23.10. Окно Add Method to Interface

Рис. 23.11. Окно Implement Connection Point

В результате выполненных действий будет создан файл POLYGONCP.H, содержащий реализацию класса CProxy_iPolyCtlEvents, потомка класса iConnectionPointlmpl, и двух его методов, Fire_ClickIn() и Fire_ClickOut(), управляющих вызовом упоминавшихся ранее методов

440

Соседние файлы в предмете Программирование на C++