Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Создание обработчика сообщения в элементе ActiveX




В элементах ActiveX сообщения обрабатываются точно так же, как и в остальных программах, — воспользуйтесь ClassWizard и создайте в нашем элементе обработчик для сообщения WM_LBUTTONDOWN.

Метод OnLButtonDown()в коде для элемента ActiveX выглядит так:

void CBoxerCtrl::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: добавьте код обработки сообщения // и/или вызовите обработчик по умолчанию

COleControl::OnLButtonDown(nFlags, point);

}

Мы должны определить, в каком из четырех прямоугольников щелкнул пользователь, и закрасить этот прямоугольник — для этого в заголовочном файле CBoxerCtL.h объявляются четыре новые переменные (они будут выполнять функции флагов):

class CBoxerCtrl: public COleControl {

// Реализация

protected:

CBoxerCtrl();

CRect box1; CRect box2;

CRect box3;

CRect box4;

         boolean fill1;

         boolean fill2;

        boolean fill3;

        boolean fill4;

В конструкторе элемента им присваиваются значения false:

        CBoxerCtrl::CBoxerCtrl()

{

  InitializeIIDs(&IID_DBoxer, &IID_DBoxerEvents);

         fill1 = fill2 = fill3 = fill4 = false;

}

B методе OnLButtonDown() можно установить значения флагов с помощью удобного метода PtInRect() класса CRect. Он возвращает "true" если точка-параметр принадлежит прямоугольнику (в нашем случае прямоугольникам box1-box4):

void CBoxerCtrl::OnLButtonDown(UINT nFlags, CPoint point)

{

fill1 == boxl.PtInRect(point);

fill2 = box2.PtInRect(point);

fill3 = box3.PtInRect(point);

fill4 = box4.PtInRect(polnt);

Invalidate();

        COleControl::OnLButtonDown(nFlags, point);

}

После установки флага для прямоугольника, на котором щелкнул пользователь, мы вызываем перерисовку вида методом Invalidate(). Это приводит к вызовуOnDraw(), в котором проверяются все четыре флага и необходимый прямоугольник закрашивается методом FillSolidRect()класса CDC:

void CBoxerCtrl::OnDraw(

CDC* pdc, const CRect& rcBounds, const CRect& rclnvalid)

{

pdc->FillRect(rcBounds,

CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));

box1 = CRect(rcBounds.left, rcBounds.top, rcBounds.right/2, rcBounds.bottom/2);

box2 = CRect(rcBounds.left, rcBounds.bottom/2, rcBounds.right/2, rcBounds.bottom);

box3 == CRect(rcBounds.right/2, rcBounds.top, rcBounds.right, rcBounds.bottom/2);

box4 = CRect(rcBounds.right/2, rcBounds.bottom/2, rcBounds.right. rcBounds.bottom);

pdc->Rectangle(&box1)

 pdc->Rectangle(&box2)

pdc->Rectangle(&box3)

        pdc->Rectangle(&box4);

        if(fill1) pdc->FillSolidRect(&box1,RGB(0,0,0));

        if(fill2) pdc->FillSolidRect(&box2,RGB(0,0,0));

        if(flll3) pdc->FillSolidRect(&box3,RGB(0,0,0));

        if(fill4) pdc->FillSolidRect(&box,RGB(0,0,0));

}

 Программа готова, можно приступать к тестированию.

Тестирование элемента ActiveX

Чтобы проверить работу элемента Boxer, выполните команду Build > Build Boxer.ocx(управляющие элементы ActiveX получают расширение .осх) — элемент создается и регистрируется в Windows. Затем выполните команду Tools > ActiveX Control Test Container. Запускается чрезвычайно полезная программа "тестовый контейнер"

Выполните в тестовом контейнере команду Edit >- Insert OLE Controlи дважды щелкните на строкеBoxer controlв окне Insert OLE Control. В результате наш элемент ActiveX появится в контейнере.

Щелкните в любом прямоугольнике — он закрашивается черным цветом. Если щелкнуть в другом прямоугольнике, черным станет он.

Элемент работает так, как мыхотели,а сейчас мы попытаемся вставить его в программу.

Использование элемента ActiveX в программе на Visual C++

Давайте посмотрим, как созданный элемент будет работать в программе, написанной на Visual C++. С помощью AppWizard создайте программу на базе диалогового окна и назовите ее Вохегарр. В нее можно вставить элемент типа Boxer - выполните команду Project >- Add To Project > Components and Controls, и откроется окно Components and Controls Gallery. Дважды щелкните на строке Registered ActiveX Controls, чтобы вывести список всех доступных элементов ActiveX.

Выделите строку Boxer Control и нажмите кнопку Insert. Появляется диалоговое окно с вопросом, желаете ли вы вставить элемент в свою программу; нажмите кнопку ОК. Затем откроется окно Confirm Class, сообщающее о создании нового класса СВохег. Снова нажмите кнопку ОК и закройте окно Components and Controls Gallery. Элемент Boxer появится в палитре редактора диалоговых окон. Он представлен кнопкой с буквами ОСХ.

ПОДСКАЗКА: Чтобы изменить внешний вид элемента ActiveX в палитре, дважды щелкните в Visual C++ на идентификаторе растрового ресурса ID_BOXER — значок откроется в редакторе растровых изображений, и вы сможете отредактировать его по своему усмотрению.

Элемент Boxer, как и любой другой управляющий элемент, можно разместить в главном диалоговом окне программы. Запустите программу.

Как видите, элемент ActiveX присутствует в программе и работает так, как ему положено. Вы можете как угодно щелкать на прямоугольниках, и каждый раз выбранный вами прямоугольник будет закрашиваться. Итак, мы успешней создали свой первый элемент ActiveX.

Мы посмотрели, как создать элемент ActiveX и организовать его прорисовку. Однако на этом возможности ActiveX отнюдь не исчерпываются — управляющие элементы могут также обладать событиями, методами и свойствами. Сейчас мы познакомимся с этой темой подробнее.










Последнее изменение этой страницы: 2018-04-12; просмотров: 276.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...