В грех и cos функций будет использоваться для расчета точек полигонов, поэтому добавьте код прорисовки включают math.h в верхней части PolyCtl.h:
# include lt;math.h >
# include «resource.h» / / Главная символы
Примечание для выпуска строит толькоnbsp; Когда ATL COM AppWizard создает проект по умолчанию, он определяет макроса _ATL_MI&N_CRT. Этот макрос определяется таким образом, чтобы не приносят библиотеки времени выполнения c в ваш код, если оно не требуется. Элемент управления polygon нуждается библиотеки времени выполнения c начальный код для инициализации с плавающей запятой функций. Таким образом необходимо удалить макроса _ATL_MIN_CRT , если вы хотите построить версии выпуска. Чтобы удалить макрос, щелкните Параметры в меню проект . В настройки для: раскрывающийся список, выберите Несколько конфигураций. В конфигурации проекта изменять диалоговое окно Выбор появившемся установите флажки для всех четырех версий выпуска, а затем нажмите кнопку ОК. На вкладке C/C++ выберите категорию Общие , а затем удалите _ATL_MIN_CRT из определения препроцессора текстового поля.
После того, как подсчитываются очки многоугольник, хранения точек путем добавления массива типа POINT в конце определения класса в PolyCtl.h:
OLE_COLOR m_clrFillColor;
короткие m_nSides;
ТОЧКА m_arrPoint [100]
Теперь измените OnDraw функции в PolyCtl.h для соответствия указано ниже. Обратите внимание, удалите вызовы функций в прямоугольник и DrawText. Вы явным образом получить и выберите черное перо и белые кисти. Вам нужно это сделать в случае, если элемент управления выполняется без окон. Если у вас нет собственного окна, не может делать предположения о контексте устройства, вы будете опираясь.
Завершенные OnDraw выглядит как это:
HRESULT CPolyCtl::OnDraw(&ATL_DRAWINFOamp; di)
{
RECT и rc = *(RECT*)di.prcBounds;
HDC hdc = di.hdcDraw;
COLORREF colFore;
HBRUSH hOldBrush, hBrush;
HPEN hOldPen, hPen;
/ / Перевести m_colFore на COLORREF тип
OleTranslateColor (m_clrFillColor, значение NULL и colFore);
/ / Создать и выберите цвета для рисования круга
hPen = (HPEN)GetStockObject(BLACK_PEN);
hOldPen = (HPEN) SelectObject (hdc, hPen);
hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH);
hOldBrush = (HBRUSH) SelectObject (hdc, hBrush);
Эллипс (hdc, rc.left, rc.top, rc.right, rc.bottom);
/ / Создать и выберите объект brush, который будет использоваться для заполнения многоугольника
hBrush = CreateSolidBrush(colFore);
SelectObject (hdc, hBrush);
CalcPoints(rc);
Полигон (hdc и m_arrPoint [0], m_nSides);
/ / Выберите назад старый ручки и кисти и удаление кисти, мы создали
SelectObject (hdc, hOldPen);
SelectObject (hdc, hOldBrush);
DeleteObject(hBrush);
Возвращает значение S_OK;
}
Теперь необходимо добавить функцию, называемый CalcPoi&nts , который будет вычислить координаты линии intersections.nbsp; Эти расчеты будут основываться на RECT переменная, которая передается в функцию. Сначала следует добавить определение CalcPoints в секцию общественной для класса IPolyCtl в PolyCtl.h:
void CalcPoints (const RECT и rc)
Секция общественной IPolyCtl класса должен теперь выглядеть:
/ / IPolyCtl
общественности:
STDMETHOD(get_Sides) (/ * [out, retval] * / короткий * &newVal);
STDMETHOD(put_Sides) (/ * [в] * / короткие newVal);
voidnbsp; CalcPoints (const RECT и rc)
Затем добавьте осуществление CalcPoints функция для конца файла PolyCtl.cpp:
void CPolyCtl::CalcPoints (const RECTamp; rc)
{
const двойной pi = 3,14159265358979;
ТОЧКА ptCenter;
двойной dblRadiusx = (rc.right - rc.left) / 2;
двойной dblRadiusy = (rc.bottom - rc.top) / 2;
двойной dblAngle = 3 * пи / 2; / / Начало в верхней
двойной dblDiff = 2 * Пи / m_nSides; / / Угол каждой стороне будет делать
ptCenter.x = (rc.left + rc.right) / 2;
ptCenter.y = (rc.top + rc.bottom) / 2;
/ / Расчет очков для каждой стороны
для (внутренне I = 0; I < m_nSides; i ++)
{
.x m_arrPoint [i] = (длинный) (dblRadiusx * cos(dblAngle) + ptCenter.x + 0.5);
.y m_arrPoint [i] = (длинный) (dblRadiusy * sin(dblAngle) + ptCenter.y + 0.5);
dblAngle += dblDiff;
}
}
Теперь, инициализировать m_clrFillColor . Выберите Грин — цвет по умолчанию и добавьте эту строку в CPolyCtl Конструктор в PolyCtl.h:
m_clrFillColor = RGB (0, 0xFF, 0)
Конструктор теперь выглядит следующим образом:
CPolyCtl()
{
m_nSides = 3;
m_clrFillColor = RGB (0, 0xFF, 0);
}
Теперь восстановить элемент управления и попробуйте еще раз. Откройте Тестовый контейнер элемента управления ActiveX и вставьте элемент управления. Вы должны увидеть зеленый треугольник в круг. Попробуйте изменить количество Сторон, выполнив следующие действия. Чтобы изменить свойства на двойной интерфейс из в Тестовом контейнере, используйте Вызывать методы:

Обратите внимание, что элемент управления не меняется. Что не так? Хотя вы изменили количество сторон внутри страны, установив m_nSides переменной, не вызывает элемент управления для разрешения перерисовки. Если вы перейти в другое приложение, а затем обратно в Тестовый контейнер , вы увидите, что элемент управления перерисовывается и теперь имеет правильное количество Сторон.
Чтобы исправить эту проблему, необходимо добавить вызов функции FireViewChange , которая определена в IViewObjectExImpl, после того как заданы количество Сторон. Если элемент управления выполняется в своем собственном окне, FireViewChange будет напрямую вызывать InvalidateRect API. Если элемент управления выполняется без окон, InvalidateRect метод будет вызван на интерфейсе узла контейнера. Это заставляет элемент управления для разрешения перерисовки сам.
Новый put_Sides метод заключается в следующем:
STDMETHODIMP CPolyCtl::put_Sides(short newVal)
{
Если (newVal gt; 2 & & newVal < 101)
{
m_nSides = newVal;
FireViewChange();
Возвращает значение S_OK;
}
остальное
возвращение Ошибка (_T ("форма должны иметь между 3 и 100 сторонами"));
}
После того, как вы добавили FireViewChange, восстановить и повторите элемента управления. На этот раз, когда вы измените количество Сторон и нажмите кнопку Invoke, должен появиться элемент управления немедленно изменить.
Далее добавьте событие для элемента управления.
Вернуться к шагу 3 |nbsp; К шагу 5