Шаг 116 - Добавление свойств к элементу

IPolyCtl - это интерфейс, который содержит методы и свойства. Самый простой способ добавить свойство к этому интерфейсу заключается в выборе меню Add Property из ClassView.

116_1.gif (2985 b)

Появляется диалоговое окно Add Property to Interface, которое позволяет ввести информацию о добавляемых свойствах.

  1. В раскрывающемся списке типов свойств выберите short.
  2. Введите имя свойства "Sides" в поле Property Name. Поскольку производится редактирование имени свойства в поле Implementation будут показываться строки, которые будут добавлены к файлу IDL.
  3. Нажмите OK, чтобы закончить процедуру добавления свойства.

116_2.gif (5090 b)

Программа 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.


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