Шаг 99 - Создание элементов управления с ATL

Давайте создадим приложение AtlControl на основе Atl Com AppWizard. Мы уже знаем из "Шаг 9 - Использование ATL", что нам нужно добавлять ATL объект. Только теперь мы выберем элемент управления.

99_1.gif (5587 b)

Следующее окно нам знакомо в нем нужно установить имена классов. Но если Вы внимательно на него посмотрите то увидите, что появились дополнительные вкладки.

99_2.gif (6338 b)

Нас сейчас интересует вкладка Stock Properties которая позволяет задавать стандартные свойства. Именно стандартные которые вроде как должны быть у каждого элемента

99_3.gif (6062 b)

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

99_4.gif (4734 b)

Щелкнут по свойству Вы увидите в описание в IDL файле добавились описания propput и propget.

interface ICAtlContorl : IDispatch
	{
		[propput, id(DISPID_BACKCOLOR)]
		HRESULT BackColor([in]OLE_COLOR clr);
		[propget, id(DISPID_BACKCOLOR)]
		HRESULT BackColor([out,retval]OLE_COLOR* pclr);
		[propput, id(DISPID_BORDERCOLOR)]
		HRESULT BorderColor([in]OLE_COLOR clr);
		[propget, id(DISPID_BORDERCOLOR)]
		HRESULT BorderColor([out, retval]OLE_COLOR* pclr);
	};

Переменные участвующие в свойствах обьвлены как OLE_COLOR и у нас появилась функция Draw отвечающая за прорисовку элемента управления.

HRESULT OnDraw(ATL_DRAWINFO& di)
	{
		RECT& rc = *(RECT*)di.prcBounds;
		Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom);

		SetTextAlign(di.hdcDraw, TA_CENTER|TA_BASELINE);
		LPCTSTR pszText = _T("ATL 3.0 : CAtlContorl");
		TextOut(di.hdcDraw, 
			(rc.left + rc.right) / 2, 
			(rc.top + rc.bottom) / 2, 
			pszText, 
			lstrlen(pszText));

		return S_OK;
	}

Для свойств создается карта свойств которая начинается с BEGIN_PROP_MAP и заканчивается END_PROP_MAP. А внутри нее находятся макросы для работы со свойствами.

BEGIN_PROP_MAP(CCAtlContorl)
	PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
	PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
	PROP_ENTRY("BackColor", DISPID_BACKCOLOR, CLSID_StockColorPage)
	PROP_ENTRY("BorderColor", DISPID_BORDERCOLOR, CLSID_StockColorPage)
	// Example entries
	// PROP_ENTRY("Property Description", dispid, clsid)
	// PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()

Советую почитать по свойства раздел "Шаг 2 - Свойства (Property) класса", там написана общая идея.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 26.08.2001