Программирование >>  Процедурные приложения 

1 ... 144 145 146 [ 147 ] 148 149 150


ClickIn() и ClickOut().В файле POLYCTL.H в список предков класса CPolyCtl будет добавлен класс CProxy iPolyCtlEvents, а в схему СОМ-интерфейсов будет помещена запись

COM INTERFACE ENTRY IMPL(IConnectionPointContainer)

Кроме того, будет обновлена схема точек подключения класса CPolyCtl:

BEGIN CONNECTION POINT MAP(CPolyCtl) CONNECTION POINT ENTRY(IID IPropertyNotifySink) CONNECTION POINT ENTRY(DIID I PolyCtlEvents) END CONNECTION POINT MAP()

Добавление обработчика сообщения

Обработчик сообщения wm lbuttondown необходим для определения момента, когда пользователь щелкает левой кнопкой мыши на элементе управления. Перейдите на вкладку ClassView, щелкните правой кнопкой мыши на элементе CPolyCtl и выберите из контекстного меню команду AddWindowsMessageHandler. В открывшемся диалоговом окне в левом списке выберите сообщение wm lbuttondown, щелкните на кнопке AddHandler и нажмите кнопку ОК.

В результате в файл POLYCTL.H будет добавлена стандартная реализация метода OnLButtonDown(), а в схеме сообщений класса CPolyCtl появится новая запись:

BEGIN MSG MAP(CPolyCtl)

CHAIN MSG MAP(CComControl<CPolyCtl>)

DEFAULT REFLECTION HANDLER()

MESSAGE HANDLER(WM LB0TTONDOWN, OnLButtonDown)

END MSG MAP()

Внесение изменений в файл POLYCTL.H

Следующим шагом будет внесение некоторых изменений в файл POLYCTL.H, текст которого показан ниже. Дополнения и изменения выделены полужирным шрифтом.

PolyCtl.h: Объявление класса CPolyCtl #ifndef POLYCTL H #define POLYCTL H #include <math.h>

#include resource.h основные константы

#include <atlctl.h> #include PolygonCP.h

/

11 CPolyCtl

class ATL NO VTABLE CPolyCtl :

public CComObjectRootEx<CComSingleThreadModel>,

public CStockPropImpKCPolyCtl, IPolyCtl, SIID IPolyCtl,

SLIBID POLYGONLib>,

public CComControl<CPolyCtl>,

public IPersistStreamInitImpl<CPolyCtl>,

public I01eControlImpl<CPolyCtl>,

public I01eObjectImpl<CPolyCtl>,

public I01eInPlaceActiveObjectImpl<CPolyCtl>,

public IViewObjectExImpKCPolyCtl>,

public I01eInPlaceObjectWindowlessImpl<CPolyCtl>,

public ISupportErrorlnfo,

public IConnectionPointContainerImpl<CPolyCtl>, public IPersistStorageImpl<CPolyCtl>, public ISpecifyPropertyPagesImpl<CPolyCtl>, public IQuickActivateImpl<CPolyCtl>, public IDataObjectImpl<CPolyCtl>,



public IProvideClassInfo2Impl<SCLSID PolyCtl, SDIID IPolyCtlEvents, &LIBID POLYGONLib>,

public IPropertyNotifySinkCP<CPolyCtl>, public CComCoClass<CPolyCtl, SCLSID Po.lyCtl> public CProxy IPolyCtlEvents< CPolyCtl > { public:

CPolyCtl ()

m nSides =6; по умолчанию строится шестиугольник

m clrFillColor = RGB(OxFF, OxFF, 0); желтый цвет заливки

DECLARE REGISTRY RESOURCEID(IDR POLYCTL) DECLARE PROTECT FINAL CONSTRUCT))

BEGIN COM MAP(CPolyCtl)

COM INTERFACE ENTRY(IPolyCtl)

COM INTERFAOE ENTRY(IDispatch)

COM INTERFACE ENTRY(IViewObjectEx)

COM INTERFACE ENTRY(IViewObject2)

COM INTERFACE ENTRY(IViewObject)

COM INTERFACE ENTRY(IDlelnPlaceObjectWindowless) COM INTERFACE ENTRY(I01eInPlaceObject)

COM INTERFACE ENTRY2(IQleWindow, IQlelnPlaceObjectWindowless) COM INTERFACE ENTRY(IOleInPlaceActiveObject)

COM INTERFACE ENTRY(I01eControl)

COM INTERFACE ENTRY(IQleObject) COM INTERFACE ENTRY(IPersistStreamlnit)

COM INTERFACE ENTRY2(IPersist, IPersistStreamlnit)

COM INTERFACE ENTRY(ISupportErroriInfo)

COM INTERFACE ENTRY(IConnectionPointContainer) COM INTERFACE ENTRY(ISpecifyPropertyPages)

COM INTERFACE ENTRY(IQuickActivate)

COM INTERFACE ENTRY(IPersistStorage)

COM INTERFACE ENTRY(IDataObject)

COM INTERFACE ENTRY(IProvideClassInfo)

COM INTERFACE ENTRY(IProvideClassInfo2)

COM INTERFACE ENTRY IMPL(IConnectionPointContainer)

END COM MAP()

BEGIN PROP MAP(CPolyCtl)

PROP DATA ENTRY( cx ,m sizeExtent.ex, VT UI4) PROP DATA ENTRY( Gy ,m sizeExtent.cy, VT UI4)

PROP ENTRY( FillColor ,DISPID FILLCOLOR, CLSID StockColorPage)

END PROP MAPt)

BEGIN CONNECTION POINT MAP(CPolyCtl)

CONNECTION POINT ENTRY(IID IPropertyNotifySink) CONNECTION POINT ENTRY(DIID IPolyCtlEvents)

END CONNECTION POINT MAP () BEGIN MSG MAP(CPolyCtl) CHAIN MSG MAP(CComControl<CPolyCtl>) DEFAULT REFLECTION HANDLER() END MSG MAP ()

ISupportErrorlnfo

STDMETHOD(InterfaceSupportsErrorInfo) (REFIID riid)

static const IID* arr[]=

&IID IPolyCtl,



for (int i = 0; i < sizeof(arr)/sizeof(arr[0]);

if (InlineIsEqualGDID(*arr[i], riid))

return S OK; } return S FALSE;

IViewObjectEx

DECLARE VIEW STATUS(VIEWSTATUS SOLIDBKGND VIEWSTATOS OPAQUE)

IPolyCtl public:

STDMETHOD(get Sides)(/*[out,retval]*/ short *pVal);

STDMETHOD(put Sides) </*[in]*/short newVal);

HRESULT OnDraw(ATL DRAWINFOS di);

LRESULT OnLButtonDown(UINT uMsg,

WPARAM wParam, LPARAM IParam, BOOLS bHandled)

OLE COLOR m clrFillColor;

short m nSides; POINT m arrPoint[10];

#endif POLYCTL H

В конструкторе класса CpolyCtl устанавливается, что по умолчанию число сторон многоугольника, рисуемого в элементе управления, равно шести (минимальное - 3, максимальное - 10), а для заливки используется желтый цвет. Для вычисления координат вершин многоугольника потребуются тригонометрические функции, поэтому в проект включается библиотека МАТН.Н.

Стандартные реализации функций OnDraw( ) и OnLButtonDown( ) были удалены из файла, так как мы значительно расширим их и включим в файл POLYCTL.CPP.

Реализация методов элемента управления

Ниже приведен текст файла POLYCTL.CPP. Все дополнения и изменения выделены полужирным шрифтом.

PolyCtl.cpp: Реализация класса CPolyCtl #include stdafx.h #include Polygon. h

#include PolyCtl.h

#include <time.h> #include <string.h>

CPolyCtl

HRESULT CPolyCtl: : OnDraw (ATL DRAHINFO& di) {

struct tm *date time;

time t timer;

static TEXTMETRIC tin;

RECTS rc = *(RECT*)di.prcBounds; HDC hdc = di.hdcDraw;

COLORREF colFore; HBRUSH hOldBrush, hBrush; HPEN hOldPen, hPen;

Приведение переменной m clrFillColor к типу COLORREF OleTranslateColor(m clrFillColor, NULL, ScolFore); Выбор пера и кисти для рисования окружности

hPen - (HPEN)GetStockObject(BLACK PEN); hOldPen = (HPEN)SelectObject (hdc, hPen);

hBrush = (HBRUSH)GetStockObject(WHITE BRUSH);

hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);



1 ... 144 145 146 [ 147 ] 148 149 150

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика