Крок 4: Змінити код малюнка

У графічних код функції гріх і 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 та вставити елемент керування. Ви повинні побачити зелений трикутник у колі. Спробуйте змінити кількість сторін, виконавши наведені нижче дії. Змінити властивості на подвійний інтерфейс з в Контейнері випробування, використовувати Викликати методи:

  1. У Випробування контейнернатисніть кнопку Виклику методів меню .
    Відображається діалогове вікно Виклику методу.

  2. Виберіть версію PropPut сторони власності з Назвою цього методу.

  3. Введіть 5 в полі Значення параметра , натисніть кнопку Встановити значення та натисніть кнопку Invoke.

Зверніть увагу, що елемент керування не зміниться. Що не так? Хоча ви змінили кількість сторін всередині країни, встановивши на 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

Index