IPolyCtl - это интерфейс, который содержит методы и свойства. Самый простой способ добавить свойство к этому интерфейсу заключается в выборе меню Add Property из ClassView.
Появляется диалоговое окно Add Property to Interface, которое позволяет ввести информацию о добавляемых свойствах.
Программа MIDL (которая компилирует .idl файлы) определит метод Get, который возвращает свойство и метод Put, который устанавливает свойство. Когда MIDL компилирует файл она автоматически определяет два метода в интерфейсе put_ и get_ от имени свойства.
Наряду с добавлением необходимых строк к .idl файлу, Add Property to Interface также добавляет прототипы функций Get и Put к описанию класса в PolyCtl.h и добавляет пустую реализацию к PolyCtl.cpp.
Чтобы устанавливать и получать свойство нужно определить место для его хранения. Из FileView откройте PolyCtl.h и добавьте следующую строку в конце описания класса после
m_clrFillColor is defined: short m_nSides;
Теперь Вы можете выполнять методы Get и Put. Будут добавлены функции get_Sides и put_Sides в файл PolyCtl.h. Вы должны добавить код в PolyCtl.cpp:
STDMETHODIMP CPolyCtl::get_Sides(short *pVal) { *pVal = m_nSides; return S_OK; } STDMETHODIMP CPolyCtl::put_Sides(short newVal) { if (newVal > 2 && newVal < 101) { m_nSides = newVal; return S_OK; } else return Error(_T("Shape must have between 3 and 100 sides")); }
Функция get_Sides просто возвращает текущее значение свойства Sides через указатель pVal. В методе put_Sides выполняется проверка, что пользователь устанавливает свойство Sides в допустимое значение. Нужно более 2-х сторон, чтобы можно было изобразить многоугольник, далее можно сделать ограничение по максимуму, к примеру 100 - вполне приемлемое ограничение для максимума. Если будет передано недопустимое значение, то будет использоваться ATL Error для установки подробностей об ошибке в интерфейсе IErrorInfo. Это полезно, если ваш контейнер нуждается в более подробной информации об ошибке, чем возвращается в HRESULT.
Последняя вещь, которую надо сделать для свойства - это инициализация m_nSides. Решим, что треугольник является заданной по умолчанию формой. Добавим строку в конструктор PolyCtl.h:
CPolyCtl() { m_nSides = 3; }
Теперь у нас есть полная реализация свойства Sides.