Давайте создадим приложение AtlControl на основе Atl Com AppWizard. Мы уже знаем из "Шаг 9 - Использование ATL", что нам нужно добавлять ATL объект. Только теперь мы выберем элемент управления.
Следующее окно нам знакомо в нем нужно установить имена классов. Но если Вы внимательно на него посмотрите то увидите, что появились дополнительные вкладки.
Нас сейчас интересует вкладка Stock Properties которая позволяет задавать стандартные свойства. Именно стандартные которые вроде как должны быть у каждого элемента
Давайте добавим цвет рамки и цвет фона. Выбираете слева, нажимаете на стрелку вправо и в правом окне появляться свойства. Теперь можно нажать OK. Вы должны увидеть что появились переменные в которых будет храниться значения и появились свойства.
Щелкнут по свойству Вы увидите в описание в 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) класса", там написана общая идея.