Створення власних ActiveX елементів h2>
1. Введення b> p>
Елементів управління ActveX - це файл з розширенням
ОСГ (наприклад, MyButton.OCX), який ви можете використовувати у своєму додатку
Visual C + +. Visual C + + та інші візуальні мови програмування дають вам
можливість включити елемент керування ActiveX у свою програму і користуватися
їм так само, як і стандартним елементом управління Visual C + +. Ви ставите
елемент керування ActiveX у діалогову панель, ставите його властивості та
пов'язуєте код з його подіями. Після того як и створили власний елемент
управління ActiveX, ви ожете передавати його іншим програмістам, які можуть
вводити його в свої програми. p>
Оскільки розширенням файла елемента керування
ActiveX є. ОСГ, то іноді елементи керування ActiveX називають
елементами ОСГ. p>
У цьому розділі ви розробите свій власний елемент
управління ActiveX - MyClock.ОСХ, який виконує завдання виведення поточного
часу. Коли програміст поміщає елемент управління MyClock.ОСХ у форму або
в діалогову панель, MyClock. ОСГ буде безперервно відображати поточний час.
p>
2. Створення проекту h2>
Щоб створити проект елемента керування MyClock.OCX:
p>
1) Виберіть New в меню File. p>
У відповідь Visual C + + виведе діалогову панель New. p>
2) Виберіть закладку Projects діалогової панелі New. p>
3) Виберіть MFC ActiveX ControlWizard зі списку типів
проектів p>
4) Надрукуйте MyClock у вікні Project Name. p>
5) Клацніть на кнопці, яка розташована з правого
сторони вікна Location, і виберіть каталог для проекту. p>
6) Клацніть на кнопці ОК. p>
У відповідь Visual C + + виведе вікно MFC ActiveX
ControlWizard Step 1 of 2 p>
У вікні ActiveX ControlWizard Step 1 залиште все
установки в стані за замовчуванням і клацніть на кнопці Next. p>
У вікні ActiveX ControlWizard Step 2 залиште все
установки в стані за замовчуванням і клацніть на кнопці Finish. p>
У відповідь Visual C + + виведе діалогову панель New Project Information. p>
Клацніть на кнопці ОК в діалогової панелі New Project
Information і виберіть Set Active Configuration в меню Build. P>
У відповідь Visual C + + виведе діалогову панель Set Active Project Configuration. p>
Виберіть MyClock - Win32 Release в діалоговому вікні Set Active Project Configuration і клацніть на кнопці ОК. p>
Це все! Ви завершили створення файлу проекту і
каркасів файлів елемента керування ActiveX MyClock.ОСХ. p>
3. Налаштування значка інструменту
MyClock b> p>
Значок інструменту MyClock відображає літери ОСГ. Вам
потрібно налаштувати елемент управління MyClock таким чином, щоб значок його інструменту
являв собою малюнок годин. Для установки значка інструменту MyClock ви
повинні відредагувати растрове зображення IDB_MYCLOCK. Це зображення було
створено Visual C ++. p>
Щоб вивести растрове зображення IDB_MYCLOCK в
режимі проектування, зробіть наступне: p>
1) Виберіть закладку ResourceView у вікні Project
Workspace, розкрийте пункт MyClock resources, розкрийте пункт Bitmap і двічі
клацніть на пункті IDB_MYCLOCK. p>
У відповідь Visual C + + виведе растрове зображення
IDB_MYCLOCK в режимі проектування. P>
2) Використовуючи візуальні інструменти Visual C + +,
замініть растрове зображення IDB_MYCLOCK букв ОСГ на малюнок найпростіших годин
(коло і дві лінії як стрілок). p>
4. Малювання в елементі управління MyClock h2>
Поки елемент управління MyClock виводить еліпс. Вам
потрібно, щоб MyClock відображав поточний час, так що ви повинні написати
відповідний код: p>
Відкрийте файл MyClockCtl.cpp. p>
Файл MyClockCtl.cpp - це файл реалізації елемента
управління МуСlock, створений для вас Visual C + +; в цьому файлі ви будете писати
свій код для налаштування MyClock. p>
Знайдіть функцію OnDraw () у файлі MyClockCtl.cpp і
напишіть наступний код: p>
void
CMyClockCtrl:: OnDraw (CDC * pdc, const CRect & rcBounds, const CRect &
rcInvalid) ( p>
// TODO: Replace
the following code with your own drawing// code. p>
// Залити елемент управління вибраним кольором.
pdc-> FillRect (rcBounds, CBrush:: FromHandle ((HBRUSH) GetStockObject p>
(WHITE_BRUSH))); char
CurrentTime [30]; struct tm * newtime; long lTime;// Отримати поточний час time (& lTime);
newtime = localtime (& lTime); p>
// Перетворити час в рядок. strcpy (CurrentTime,
asctime (newtime)); p>
// Доповнити рядок одним символом пробілу.
CurrentTime [24] = ''; p>
// Доповнити рядок огранічівающі символом.
CurrentTime [25] = 0; p>
// Вивести поточний час
pdc-> ExtTextOut (rcBounds.left, rcBounds.top, ETO_CLIPPED, rcBounds,
CurrentTime, strlen (CurrentTime), NULL);) p>
5. Висновок поточного часу в
безперервному режимі b> p>
Щоб відображати час безперервно, вам потрібно зробити
наступне: p>
1) Надіслати код, який встановлює таймер з
1000-мілісекундним періодом для елемента керування MyClock. P>
2) Зв'язати код з подією WM_TIMER елемента керування
MyClock. P>
Після установки таймера кожні 1000 мілісекунд
(кожну секунду) Windows буде посилати повідомлення WM_TIMER елементу керування
MyClock, у відповідь на яке буде виконуватися код, який ви зв'яжете з цим
подією елемента керування. Цей код буде просто виводити поточний час, так
що значення часу буде безперервно оновлюватися. p>
Таймер необхідно встановити відразу після створення
елемента керування, так що вам потрібно зв'язати код, що встановлює таймер, з
подією WM_CREATE елемента управління: p>
Виведіть діалогову панель ClassWizard, вибравши
ClassWizard в меню View. На сторінці Message Maps виберіть така подія: p>
Class Name: CMyClockCtrl p>
Object ID:
CMyClockCtrl p>
Message: WM_CREATE p>
Клацніть на кнопці Add Function. p>
У відповідь Visual C + + додасть в клас CMyClockCtrl
функцію-елемент ОпСreate (). p>
Клацніть на кнопці Edit Code в ClassWizard. p>
У відповідь Visual C + + відкриє файл MyClockCtrl.cpp з
функцією OnCreate () в режимі редагування. p>
Напишіть наступний код у функції OnCreate (): p>
int
CMyClockCtrl:: OnCreate (LPCREATESTRUCT lpCreateStruct) (if
(COleControl:: OnCreate (lpCreateStruct) == -1) return -1; p>
// TODO: Add your
specialized creation code here// Встановити таймер. SetTimer (1,
1000, NULL); return 0;) p>
Введений вами код складається з одного оператора,
який викликає функцію SetTimer () для установки таймера з 1000-мілісекундним
періодом: p>
SetTiltier (1, 1000, NULL); p>
Починаючи з цього моменту, кожні 1000 мілісекунд
Windows буде посилати елементу керування повідомлення WM_TIMER. P>
Тепер вам потрібно зв'язати код з подією WM_TIMER: p>
Виберіть ClassWizard в меню View. На сторінці Message
Maps виберіть така подія: p>
Class Name:
CMyClockCtrl p>
Object ID:
CMyClockCtrl p>
Message: WM_TIMER p>
Клацніть на кнопці Add Function. p>
У відповідь Visual C + + додасть в клас CMyClockCtrl
функцію-елемент OnTimer (). p>
Клацніть на кнопці Edit Code в ClassWizard. p>
У відповідь Visual C + + відкриє файл MyClockCtrl.cpp з
функцією OnTimer () в режимі редагування. p>
Напишіть наступний код у функції OnTimerO: p>
void
CMyClockCtrl:: OnTimer (UINT nIDEvent) ( p>
// TODO: Add your
message handler code here and/or call// default// Переключити виклик на функцію OnDraw (). InvalidateControl ()
; COleControl:: OnTimer (nIDEvent);) p>
6. b> Включення b> b> базових b> b> властивостей b> b> < b> у b> ActiveX MyClock b> p>
Базові властивості (Stock properties) - преопределени. p>
Нижче наведений список базових властивостей: p>
Appearance - Зовнішній вигляд (3-х мірний або плоский) p>
BackColor - Колір фону p>
BorderStyle - Стиль рамки p>
Caption - Заголовок p>
Enabled - Стан доступний/недоступний p>
Font - Шрифт p>
ForeColor - Колір переднього плану p>
hWnd - Маркер вікна p>
ReadyState - Стан готовності p>
Text - Текст p>
Для практики включимо дві базових властивості в ActiveX
MyClock: BackColor і ForeColor. P>
Виконайте наступні дії: p>
View -> ClassWizard -> Automation (перевірте,
щоб у вікні Class name встановлено клас CMyClockCtrl) p>
Натисніть на кнопку Add Property p>
Виберіть зі списку BackColor та натисніть OK p>
Також додайте і властивість ForeColor. p>
Елемент керування MyClock має зараз властивості
BackColor і ForeColor, але поки що не використовує значення, які зберігаються в цих
властивості. Вам треба написати код у функції OnDraw (), який виконує цю
завдання: p>
void
CMyClockCtrl:: OnDraw (CDC * pdc, const CRect & rcBounds, const CRect &
rcInvalid) ( p>
// TODO: Replace
the following code with your own drawing// code. p>
// Поставити колір переднього плану (колір тексту) pdc-> SetTextColor (
TranslateColor (GetForeColor ())); p>
// Встановити режим прозорого фону
pdc-> SetBkMode (TRANSPARENT); p>
// Створити кисть на основі значення BackColor CBrush
bkBrush (TranslateColor (GetBackColor ()));
p>
// зафарбувати фон pdc-> FillRect (rcBounds, p>
& bkBrush); char
CurrentTime [30]; struct tm * newtime; long lTime; p>
// Отримати поточний час time (& lTime);
newtime = localtime (& lTime); p>
// Перетворити час в рядок. strcpy (CurrentTime,
asctime (newtime)); p>
// Доповнити рядок одним символом пробілу. CurrentTime [24] = '
'; P>
// Доповнити рядок огранічівающі символом.
CurrentTime [25] = 0; p>
// Вивести поточний час
pdc-> ExtTextOut (rcBounds.left, rcBounds.top, ETO_CLIPPED, rcBounds,
CurrentTime, strlen (CurrentTime), NULL);) p>
Ну от і все, тепер елемент управління MyClock має
властивості BackColor і ForeColor.
p>
7. Включення спеціального властивості в ActiveX MyClock h2>
У багатьох випадках вам знадобиться включити до свого
елемент управління такі властивості, які не входять в список стандартних. Ці
властивості називаються спеціальними. p>
Для прикладу включено до MyClock спеціальне властивість
UpdateInterval - період оновлення: p>
View -> ClassWizard -> Automation (перевірте,
щоб у вікні Class name встановлено клас CMyClockCtrl) p>
Натисніть на кнопку Add Property p>
У вікні External name наберіть UpdateInterval p>
У вікні Type виберіть Long p>
У вікні Variable name повинно бути m_updateinterval p>
У вікні Notification function поставте OnUpdateIntervalChanged p>
перевірте, що в камка Implementation вибрана кнопка Member variable та натисніть OK p>
Тим самим ми визначили, що з властивістю
UpdateInterval буде пов'язана мінлива m_updateinterval і кожного разу, коли
значення властивості UpdateInterval буде іменяться, автоматично виконається
функція OnUpdateIntervalChanged. p>
Тепер треба проініціалізувати властивість
UpdateInterval: p>
Відкрийте файл MyClockCtl.cpp p>
Знайдіть функцію DoPropExchange () і напішіет в ній
наступне: p>
// Ініціалізація властивості UpdateInterval значенням
1000 p>
PX_Long (pPX,
_T ( "UpdateInterval"), m_updateinterval, 1000); p>
Тепер треба модернізувати функції
OnUpdateIntervalChanged: p>
// перевірка на отрізательность p>
if (m_updateinterval <0) p>
( p>
MessageBox (
"This property cannot be negative!" ); p>
m_updateinterval =
1000; p>
) p>
// Установка таймера p>
SetTimer (1,
(UINT) m_updateinterval, NULL); p>
і OnCreate: p>
// Установка таймера p>
SetTimer (1,
(UINT) m_updateinterval, NULL); p>
Ну от і все ActiveX MyClock повністю готовий !!! p>
Список літератури h2>
Для підготовки даної роботи були використані
матеріали з сайту http://www.realcoding.net/
p>