У графічних код функції гріх і cos використовується для розрахунку очок багатокутник, тому додати включати Math. h, у верхній частині PolyCtl.h:
# включити lt;math.h >
# включити "resource.h" / / Головна символи
Примітка для випуску будує тількиnbsp; Коли ATL COM AppWizard генерує проекту за замовчуванням, вона визначає макрос _ATL_MI&N_CRT. Цей макрос визначається тим, що не приносять в c бібліотеку в код, якщо вам не потрібно. Багатокутник контроль повинен c бібліотеку початковий код ініціалізувати функцій з плаваючою комою. Таким чином, ви повинні видалити макрос _ATL_MIN_CRT , якщо ви хочете побудувати реліз версії. Видалити макрос, натисніть кнопку Настройки меню проекту . У на настройки для: зі списком виберіть Декілька конфігурацій. У виберіть проект configuration(s) змінити діалоговому вікні, що з'явиться виберіть прапорці для всіх чотирьох реліз версії, а потім натисніть кнопку ОК. На вкладці C/c + + виберіть Загальні категорії, а потім видалити _ATL_MIN_CRT з полі препроцесора визначень.
Після того, як розраховуються точки багатокутник, зберігати пункти шляхом додавання масив типу точка в кінці до класу визначення в 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) (hdc, hPen);
hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH);
hOldBrush = об'єкт (HBRUSH) (hdc, hBrush);
Еліпс (hdc, rc.left, rc.top, rc.right, rc.bottom);
/ / Створення і виберіть пензель, який буде використовуватися для заповнення багатокутника
hBrush = CreateSolidBrush(colFore);
Об'єкт (hdc, hBrush);
CalcPoints(rc);
Багатокутник (hdc & m_arrPoint [0], m_nSides);
/ / Виберіть назад старі Перо та пензля і видалити пензель, ми створили
Об'єкт (hdc, hOldPen);
Об'єкт (hdc, hOldBrush);
DeleteObject(hBrush);
повернення S_OK;
}
Тепер вам потрібно додати функцію, називається CalcPoi&nts , який буде обчислення координат лінія intersections.nbsp; Ці розрахунки буде заснований на RECT змінна, яка передається в функцію. Спочатку ви повинні додати визначення CalcPoints на загальнодоступному розділі для IPolyCtl-класу в PolyCtl.h:
voidnbsp; CalcPoints (константа RECT & rc)
Загальнодоступному розділі клас IPolyCtl повинен тепер виглядати наступним чином:
/ / IPolyCtl
готелю:
STDMETHOD(get_Sides) (/ * [з, retval] * / короткий * newVal);
STDMETHOD(put_Sides) (/ * [в] * / шорт-newVal);
voidnbsp; CalcPoints (константа RECT & rc)
Далі введіть реалізації на CalcPoints функції в кінець файлу PolyCtl.cpp:
втрати CPolyCtl::CalcPoints (константа RECTamp; rc)
{
константа подвійний Пі = 3.14159265358979;
ТОЧКА ptCenter;
подвійний dblRadiusx = (rc.right - rc.left) / 2;
подвійний dblRadiusy = (rc.bottom - rc.top) / 2;
подвійний dblAngle = 3 * Пі / 2; / / Початок у верхній
подвійний dblDiff = 2 * pi / m_nSides; / / Кут, кожна сторона буде зробити
ptCenter.x = (rc.left + rc.right) / 2;
ptCenter.y = (rc.top + rc.bottom) / 2;
/ / Обчислити точок для кожної сторони
для (int я = 0; я < m_nSides; i + +)
{
.x m_arrPoint, [i] = (довгий) (dblRadiusx * cos(dblAngle) + ptCenter.x + 0,5);
и 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 змінної, ви не викликають керування Перефарбувати. Якщо перейти до іншого додатка та поверніться до Випробування контейнер , ви побачите, що елемент керування є repainted і зараз має правильне число сторін.
Щоб усунути цю проблему, потрібно додати заклик до 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