Borland C для Windows

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

ПРОГРАМУВАННЯ ДЛЯ WINDOWS НА BORLAND C + +

1. Введення

Мета даного посібника - полегшити засвоєння програмування для Windows на BORLAND C + + і сприяти поширенню бібліотеки OWL (Object Windows Library), яка добре продумана і використання якої явно вимальовує гідності об'єктно-орієнтованого програмування - інкапсуляції, успадкування та поліморфізму.

Посібник прив'язане до лекційного курсу "Технологія програмування", вимагаючи знань викладених на лекціях основ об'єктно-орієнтованого програмування на C + + і призначено як керівництво до лабораторних робіт з цього лекційному курсу.

Посібник орієнтований на покрокову розробку за комп'ютером нескладних Windows-додатків, в процесі якої здійснюється їх дослідження шляхом порівняння різних варіантів реалізації, зміни параметрів членів-функцій і значень членів-даних використовуваних класів.

У створюваних Windows-додатках використовується дуже незначна, але базова частина OWL бібліотеки, активне засвоєння якої сприяє зняттю бар'єра, і, як сподіваються автори, викличе задоволення від першого знайомства з завоювала світ Windows.

1.1. Введення, редагування і запуск Windows-програми

Borland C + + для Windows

Щоб ввести вихідний текст програми, відкомпілювати і побачити на екрані вікно Windows-програми, необхідно виконати наступні дії:

1) Зробіть подвійне клацання лівої клавіші миші (або натискання ENTER) на піктограмі Borland C + +. З'явиться вікно компілятора BC4.

2) Клацання лівої клавіші миші на елементі меню Project (або перехід до рядка меню шляхом натиснення F10, пошук і висвітлення елемента Project за допомогою клавіш ¬ і ®. Розкрити Project за допомогою клавіші ENTER).

3) Клацання мишею на команді New project (або вибрати даний пункт меню за допомогою клавіш і ¯ і натиснути ENTER). У подальшому для стислості будемо говорити, що потрібно виконати команду Project | New project (команду New project з меню Project).

Borland C + + для Windows

Таким чином, буде виконана команда створення нового проекту і на екрані з'явиться наступний діалог.

Borland C + + для Windows

4) Клацання мишею на кнопці Browse Borland C + + для Windows для перегляду каталогу.

5) Скориставшись лінійкою прокрутки, знайти ім'я необхідного каталогу і зробити на ньому подвійне клацання лівої клавіші миші.

Borland C + + для Windows

6) У полі File Name ввести ім'я проекту з розширенням. Ide, потім натиснути ENTER.

7) Натисніть кнопку Advanced Borland C + + для Windows і зніміть прапорці rc і def в діалозі Advanced Options, потім натисніть OK.

Borland C + + для Windows

8) У діалозі створення проекту натисніть кнопку OK.

9) Зробіть подвійний клік лівою кнопкою миші на імені файлу з розширенням cpp у вікні створеного проекту, в результаті чого відкриється вікно для редагування тексту програми.

Borland C + + для Windows

10) Введіть вихідний текст програми.

11) Для компіляції та виконання натисніть Ctrl-F9.

12) Якщо отримані повідомлення про помилки, то виправте їх і проведіть компіляцію заново. Якщо помилки відсутні, то на екрані з'явиться вікно Вашого Windows-програми. Здійсніть діалог з додатком, використовуючи мишу.

1.2. Основні прийоми редагування тексту в інтегрованому середовищі BORLAND C + +

1.2.1. Копіювання і видалення частини тексту у вікні редагування

Для копіювання тексту з однієї його частини в іншу виконуються наступні дії:

1) Виділити копійований текст:

а) Підвести курсор до початку копируемого тексту.

б) Натиснути і утримувати клавішу Shift.

в) Використовуючи клавіші управління курсором, виділити текст.

г) Відпустити Shift.

2) Занести виділений текст в буфер обміну (Clipboard) шляхом одночасного натискання Ctrl і Ins або виконання команди Edit | Copy.

3) Перевести курсор до місця вставки тексту.

4) Перенести текст з буфера в редактор шляхом одночасного натискання Shift і Ins або виконання Edit | Paste.

1.2.2. Копіювання вмісту раніше створеного cpp-файлу у вікно редагування

Для копіювання виконайте наступні дії:

1) Виконайте команду File | Open.

2) У діалоговому вікні виберіть потрібний файл і натисніть OK. Відкриється вікно з вмістом зазначеного файлу.

3) За допомогою вищеописаних дій виділіть необхідний фрагмент тексту або виконайте Edit | Select All для виділення всього тексту в вікні редагування.

4) Виконайте Edit | Copy або натисніть Ctrl-Ins для копіювання виділеного тексту в буфер обміну.

5) Якщо відкритий файл більше не потрібен, закрийте вікно. Це робиться подвійним клацанням лівої кнопки миші на кнопці системного меню вікна. Можна зробити один клацання миші і в меню вибрати Close.

6) Виконайте Edit | Paste або натисніть Shift-Ins для вставки тексту з буфера у вікно редагування.

2. Створення найпростішого додатка

Для засвоєння роботи з компілятором BORLAND C + + створимо кілька варіантів найпростішого Windows-програми, яка створює вікно з заголовком. Заголовок вікна містить напис "Hello, Windows!" Або "Hello, Hello!". Вікно також містить кнопки мінімізації та максимізації, а також системне меню програми.

Borland C + + для Windows

2.1. Створення об'єкта застосування всередині функції OwlMain

При написанні програми будемо працювати з класом TApplication і функцією OwlMain. У даному варіанті програми об'єкт класу TApplication створюється всередині функції OwlMain.

2.1.1. Оригінальний текст програми

# Include

int OwlMain (int, char * [])

{

TApplication app ("Hello, Windows!");

return app.Run ();

}

2.1.2. Пояснення до програми

Заголовний файл owlapplicat.h містить опис класу TApplication (див. Розділ 10.2.).

app - об'єкт класу TApplication. При створенні цього об'єкта використовується неявний виклик конструктора, який встановлює текст заголовка прикладного вікна "Hello, Windows!".

app.Run () - виклик члена-функції класу TApplication для об'єкта app. Функція TApplication:: Run () запускає програму.

2.1.3. Завдання

1) Створити і виконати додаток, переконавшись у правильності функціонування кнопок максимізації та мінімізації вікна.

2) Пересунути вікно в інше місце екрана.

3) Плавно змінити висоту і ширину вікна за допомогою миші.

4) Закрити додаток.

5) Змінити вихідний текст програми, замінивши заголовок вікна на "Hello, Hello!". Переконатися в появі вікна з новим заголовком.

2.1.4. Трохи англійської

an application - додаток

to run - виконуватися

a window - вікно

Windows - назва системи Windows

OWL - Object Windows Library - бібліотека класів Windows

to include - включати

main - основний, головний

to return - повертати, повертатися

2.2. Динамічне створення об'єкту класу TApplication

У цьому варіанті програми об'єкт класу TApplication динамічно створюється у вільній області пам'яті.

2.2.1. Оригінальний текст програми

# Include

int OwlMain (int, char * [])

{

TApplication * app;

app = new TApplication ("Hello Windows!");

return app-> Run ();

}

2.2.2. Пояснення до програми

app - покажчик на об'єкт типу TApplication.

Оператор new виділяє ділянку у вільній області пам'яті під об'єкт класу TApplication. При цьому неявний виклик конструктора ініціалізує об'єкт докладання і встановлює текст заголовка в "Hello, Windows!".

2.2.3. Завдання

Створити і виконати програму.

2.3. Найкоротший варіант Windows-програми

2.3.1. Оригінальний текст програми

# Include

int OwlMain (int, char * [])

{

return TApplication ("Hello Windows!"). Run ();

}

2.3.2. Завдання

Створити додаток і переконатися в його працездатності.

3. Використання класу TFrameWindow для створення головного вікна

Клас TFrameWindow є похідним від TWindow і забезпечує функціонування головного вікна програми.

3.1. Створення об'єкта головного вікна

У наступне додатку член-функція InitMainWindow класу TApplication за допомогою оператора new і конструктора TFrameWindow створює об'єкт - головне вікно програми. Адреса об'єкта поміщається в змінну MainWindow об'єкта застосування.

3.1.1. Вихідний текст програми

# Include

# Include

class TMyApp: public TApplication

{

public:

TMyApp (): TApplication ("Hello Windows !"){};

void InitMainWindow ()

{

MainWindow = new TFrameWindow (0, "Hello, hello !!");

}

};

int OwlMain (int, char * [])

{

return TMyApp (). Run ();

}

3.1.2. Пояснення до програми

Включається заголовний файл owlframewin.h містить опис класу TFrameWindow (див. розділ 10.3.).

Оскільки в даному варіанті програми ми хочемо створити своє власне головне вікно в обхід стандартних методів класу TApplication, ми повинні перевизначити віртуальну функцію InitMainWindow класу TApplication. Для цього ми виводимо новий, вже наш, клас TMyApp, як похідний від класу TApplication і описуємо в ньому віртуальну функцію InitMainWindow.

Тіло конструктора TMyApp пусте, тобто {}. Робота цього конструктора зводиться тільки до виклику конструктора базового класу TApplication, що містить єдиний параметр - текст заголовка головного вікна програми (див. розділ 10.2.2).

Тіло функції InitMainWindow класу TMyApp містить оператор new, який спільно з конструктором TFrameWindow створює екземпляр об'єкту-вікна з новим заголовком "Hello, Hello!". Адреса об'єкта присвоюється змінної MainWindow (див. розділ 10.2.1.), Успадкованої від TApplication.

3.1.3. Завдання

1) Створити і виконати програму. Зверніть увагу! Замість заголовка "Hello, Windows!", Заданого конструктором TMyApp, вікно має заголовок "Hello, Hello!". Це результат роботи перевизначених віртуальної функції TMyApp:: InitMainWindow, яка була викликана після конструктора і змінила текст заголовка на "Hello, Hello!".

2) Змініть тексти заголовків, що використовуються конструкторами TMyApp і TFrameWindow.

3) Змініть статус доступу до членів класу TMyApp на protected або private. Переконайтеся, що з'являться повідомлення про помилки компіляції, так як у функції OwlMain виробляється звернення до тепер вже недоступному конструктору TMyApp.

4) Опишіть конструктор TMyApp поза класом, не забувши додати при його описі оператор прив'язки до класу TMyApp. Переконайтеся в працездатності програми.

5) Опишіть член-функцію InitMainWindow поза класом. Перевірте працездатність програми.

3.2. Зміна положення головного вікна на екрані

Клас TFrameWindow успадковує з класу TWindow (див. розділ 10.4.) Член-дане Attr (див. розділ 10.4.1.). Attr - це структура, яка містить різні атрибути вікна, такі як стиль вікна, позиція на екрані, розмір і т.д.

3.2.1. Варіанти функції InitMainWindow, що використовують Attr

Варіант A:

void InitMainWindow ()

{

MainWindow = new TFrameWindow (0, "Hello, hello !!");

MainWindow-> Attr.X = 5;

MainWindow-> Attr.Y = 15;

MainWindow-> Attr.W = 200;

MainWindow-> Attr.H = 100;

}

Варіант B:

void InitMainWindow ()

{

MainWindow = new TFrameWindow (0, "Hello, hello !!");

MainWindow-> Attr.X = GetSystemMetrics (SM_CXSCREEN) / 8;

MainWindow-> Attr.Y = GetSystemMetrics (SM_CYSCREEN) / 8;

MainWindow-> Attr.W = MainWindow-> Attr.X * 6;

MainWindow-> Attr.H = MainWindow-> Attr.Y * 6;

}

3.2.2. Пояснення до варіантів використання функції InitMainWindow

Покажчик MainWindow вказує на головне вікно програми, створене оператором new і конструктором TFrameWindow. Покажчик використовується для посилання на елементи структури Attr головного вікна програми.

X, Y задають положення лівого верхнього кута вікна на екрані.

W і H задають ширину і висоту вікна в пікселах.

Функція GetSystemMetrics повертає значення різних характеристик системи, таких як висота (SM_CYSCREEN) і ширина (SM_CXSCREEN) екрана.

3.2.3. Завдання

1) Створити додаток з варіантом A функції InitMainWindow. Перевірте працездатність програми.

2) Створити додаток з варіантом A написання функції ініціалізації, але з іншими значеннями елементів X, Y, W, H структури Attr.

3) Створити додаток з варіантом B написання функції InitMainWindow. Переконатися, що вікно розміщується в центрі екрану.

3.3. Трохи англійської

Attr - Attribute - атрибут, властивість ознака.

GetSystemMetrics - to Get System Metrics - отримати системні характеристики.

a screen - екран

a frame - рамка

a frame window - обрамила вікно

InitMainWindow - Initialization of Main Window - ініціалізація головного вікна.

to create - створювати

to show - показати

4. Програмування з таблицями відгуку

Одним з ключових моментів роботи Windows-програми є той факт, що робота програми управляється подіями. Прикладом подій в Windows є вибір пункту меню або натискання на кнопку у вікні програми.

Система зберігає інформацію про подію, що відбулася в системній черги повідомлень, а потім передає повідомлення про нього працюючій програмі. При написанні Windows-програми необхідно забезпечити обробку повідомлень, що надходять у програму. Якщо ж цього не зробити, то будь-які дії користувача над вікном програми будуть проігноровані і Ви не зможете працювати з меню і т.д. Нехай, наприклад, у вікні програми була натиснута ліва кнопка миші. У цьому випадку програма отримає повідомлення WM_LBUTTONDOWN. Всі повідомлення Windows, що передаються програмі, представляють собою цілочисельні константи, що починаються з WM_ (Windows Message, тобто повідомлення Windows).

У програмах, написаних із застосуванням OWL, механізм отримання інформації про відбулися в системі події прихований від програміста і забезпечується функціями класу TApplication. Програмісту потрібно тільки описати свої функції, які будуть автоматично викликатися у відповідь на що прийшло в програму повідомлення.

Для того, щоб створити клас, функції якого будуть відгукуватися на прийшли з системи повідомлення, необхідно:

1) Визначити таблицю відгуку для класу. Для цього у визначення класу вставляється рядок

DECLARE_RESPONSE_TABLE ();

замінюється на ім'я того класу, для якого визначається таблиця відгуку. DECLARE_RESPONSE_TABLE - це макрос OWL, який вводить в Ваш клас деякі додаткові елементи, що дозволяють системі автоматично викликати функції-члени класу у відповідь на яке прийшло повідомлення. Таблиця відгуку містить імена повідомлень Windows і адреси функцій, що викликаються при отриманні відповідних повідомлень.

2) Після оголошення класу в текст програми вставляється інший макрос

DEFINE_RESPONSE_TABLEn ([, клас] [, клас ]...);

- Все те ж ім'я класу, для якого Ви будуєте таблицю відгуку. Через кому Ви повинні перерахувати імена базових класів, від яких проводиться спадкування. Число n слід замінити на число базових класів, які теж містять таблиці відгуку.

Відразу ж за текстом макросу необхідно помістити елементи таблиці реакції, розділені комами. Так, якщо Ви хочете обробляти повідомлення про натиснення правої і лівої клавіш миші у вікні Вашого застосування, то в таблицю поміщаються наступні елементи:

EV_WM_LBUTTONDOWN,

EV_WM_RBUTTONDOWN,

які говорять OWL про те, що Ви хочете обробляти повідомлення про натиснення лівої і правої клавіш відповідно. Скажімо EV_WM_LBUTTONDOWN розшифровується, як Event (подія), Windows Message: Left Button Down.

Після опису всіх елементів таблиці реакції запишіть рядок END_RESPONSE_TABLE;

3) Визначте у Вашому класі функції, які будуть отримувати управління, якщо в системі відбудеться бажане подія. У нашому прикладі - це дві функції

void EvLButtonDown (UINT, TPoint &),

void EvRButtonDown (UINT, TPoint &)

Перший аргумент визначає клавіші-модифікатори, які були натиснуті на клавіатурі одночасно з натисненням однієї з кнопок миші. Другий аргумент визначає координати точки вікна, в якій було вироблено натискання. У тіло цих функцій можна вставити код, який реалізує деякі дії під час отримання відповідних повідомлень Windows.

При написанні функцій відгуку необхідно пам'ятати наступне:

1) Функція відгуку викликається OWL автоматично і тільки тоді, коли відбудеться заданий подія. Наприклад, функція EvLButtonDown викликається тільки тоді, коли користувач натисне ліву кнопку миші всередині вікна програми.

2) У додатку може бути кілька класів, які мають свої таблиці реакції. Клас реагує тільки на призначені для нього повідомлення системи.

3) Імена та параметри функцій, що відповідають на системні повідомлення, зумовлені. Це означає, що на кожне повідомлення відповідає строго певна функція з певним ім'ям. Тобто, якщо Ви хочете обробляти натискання лівої кнопки миші, то в класі необхідно визначити функцію з ім'ям EvLButtonDown.

4.1. Відгук на натискання лівої і правої клавіш миші

Нижченаведене Windows-додаток створює прикладне вікно і очікує натискання правої або лівої кнопки миші. При натисканні будь-якої з цих клавіш всередині вікна з'являється панель повідомлення, що вказує, яка клавіша була натиснута. Після натискання на кнопку OK панель зникає, а додаток буде чекати нового натискання на клавіші миші.

4.1.1 Вихідний текст програми.

# Include

# Include

class TMyWindow: public TFrameWindow

{

public:

TMyWindow (char * title): TFrameWindow (0, title)

{}

protected:

void EvLButtonDown (UINT, TPoint &);

void EvRButtonDown (UINT, TPoint &);

DECLARE_RESPONSE_TABLE (TMyWindow);

};

DEFINE_RESPONSE_TABLE1 (TMyWindow, TFrameWindow)

EV_WM_LBUTTONDOWN,

EV_WM_RBUTTONDOWN,

END_RESPONSE_TABLE;

void TMyWindow:: EvLButtonDown (UINT, TPoint &)

{

MessageBox ("You have divssed the LEFT mouse button", "Message dispatched", MB_OK | MB_ICONINFORMATION);

}

void TMyWindow:: EvRButtonDown (UINT, TPoint &)

{

MessageBox ("You have divssed the RIGHT mouse button", "Message dispatched", MB_OK | MB_ICONINFORMATION);

}

class TMyApp: public TApplication

{

public:

TMyApp (): TApplication ()

{}

void InitMainWindow ()

{

EnableCtl3d ();

MainWindow = new TMyWindow ("Click Me !!!!!");

}

};

int OwlMain (int, char * [])

{

TMyApp app;

return app.Run ();

}

4.1.2. Пояснення до програми

Клас TMyWin описує прикладне вікно, як головне вікно програми і тому породжується від класу TFrameWindow.

Крім опису конструктора клас містить оголошення стандартних функцій відгуку EvLButtonDown і EvRButtonDown, а так само оголошення таблиці відгуку для класу.

Слідом за описом класу розташовується опис таблиці відгуку на повідомлення від лівої і правої клавіш миші.

Функції відгуку описані поза класом. Тіло кожної з цих функцій містить єдиний виклик функції MessageBox, яку TMyWin успадковує від TFrameWindow. Аргументи функції MessageBox задають текст повідомлення, заголовок панелі і стиль вікна повідомлення. Стилі MB_OK і MB_ICONINFORMATION дають нам діалогову панель з кнопкою OK і піктограмою "Information":

Borland C + + для Windows

Тіло функції TMyApp:: InitMainWindow містить виклик функції EnableCtl3d (), яка дозволяє додатком використовувати тривимірні діалоги. Ви можете закоментувати виклик цієї функції і порівняти отримані результати.

4.1.3. Завдання

1) Створити і виконати програму. Поекспериментувати з додатком, натискаючи кнопки миші в його вікні.

2) Змініть аргументи у викликах функції MessageBox. Переконайтеся в зміні зовнішнього вигляду панелі повідомлення.

3) Закомментіруйте рядок EV_VM_RBUTTONDOWN в таблиці елементів відгуку. Поясніть змінилося поведінка програми.

4.1.4. Трохи англійської

a button - кнопка

down - вниз

left - вліво, лівий

right - правий

an event - подія

a message - повідомлення

a response - відповідь

a table - таблиця

to declare - оголосити

to define - описати

a box - блок, панель

5. Висновок графіки в Windows

Висновок текстової чи графічної інформації в Windows пов'язаний з контекстом пристрою DC. Робоча зона вікна пов'язується з контекстом пристрою TClientDC. Перед виведенням інформації ми повинні створити контекст пристрою, передавши йому ідентифікатор вікна і вибрати в нім набір необхідних графічних об'єктів, таких як перо (TPen), кисть (TBrush) і т. д. Необхідно також подбати про колір виведених об'єктів. Створений контекст дозволяє нам малювати тільки всередині робочої області вікна, не зачіпаючи при цьому ні інші вікна, ні межі самого вікна. Наявність в системі такого класу, як TDC, робить доступними понад 150 функцій, пов'язаних із виведенням віконної графіки. Ці функції дозволяють використовувати різні об'єкти-інструменти (перо, пензель, шрифт і т. д.), виводити текст і малювати різні фігури.

5.1. Висновок координат точки натискання лівої клавіші миші

Нижченаведене додаток відгукується на клацання лівої кнопки миші, виводячи в робочій зоні вікна координати покажчика миші в блакитному кольорі.

Borland C + + для Windows

5.1.1. Вихідний текст програми

# Include

# Include

# Include

class TMyWindow: public TFrameWindow

{

public:

TMyWindow (char * title): TFrameWindow (0, title)

{}

protected:

void EvLButtonDown (UINT, TPoint &);

DECLARE_RESPONSE_TABLE (TMyWindow);

};

DEFINE_RESPONSE_TABLE1 (TMyWindow, TFrameWindow)

EV_WM_LBUTTONDOWN,

END_RESPONSE_TABLE;

void TMyWindow:: EvLButtonDown (UINT, TPoint & point)

{

TClientDC dc (HWindow);

TColor forecolor (TColor:: LtCyan);

dc.SetTextColor (forecolor);

char buf [20];

wsprintf (buf, "[% d,% d]", point.x, point.y);

dc.TextOut (point.x, point.y, buf);

}

class TMyApp: public TApplication

{

public:

TMyApp (): TApplication ()

{}

void InitMainWindow ()

{

MainWindow = new TMyWindow ("Use the left mouse button");

}

};

int OwlMain (int, char * [])

{

TMyApp app;

return app.Run ();

}

5.1.2. Пояснення до програми

Заголовний файл owldc.h містить опис сласса TDC і його похідних класів.

Клас TMyWin породжується від TFrameWindow і описує головне вікно програми. Крім опису конструктора клас містить оголошення функції відгуку EvLButtonDown на повідомлення, що надходить при натисненні лівої кнопки миші, опис якої становить найбільший інтерес.

При описі EvLButtonDown вказано ім'я тільки другого параметра, так як нам необхідно знати тільки координати покажчика миші в момент натискання її лівої кнопки.

На початку тіла функції створюється об'єкт контексту робочого області головного вікна програми (Client area DC). Надалі об'єкт використовується для посилання на функцію установки кольору тексту SetTextColor і функцію виведення тексту у вікно TextOut. Дані функції є членами класу TClientDC і успадковані ним від класу TDC (див. розділ 10.5.1).

Об'єкт forecolor класу TColor використовується для установки кольору шрифту в контексті вікна.

Функція wsprintf перетворює цілочисельні значення координат x, y в їх символьний подання в рядку str. Отримана рядок виводиться у вікно функцією TextOut в позиції покажчика миші на екрані.

Клас TMyApp описує клас програми, з якого у функції OwlMain створюється об'єкт app. У класі описана функція InitMainWindow, створює головне вікно програми на базі класу TMyWin.

5.1.3. Завдання

1) Створити і виконати програму. Поекспериментувати з додатком, пересуваючи курсор миші в робочій зоні вікна і натискаючи на її ліву клавішу.

2) Переписати текст програми, використовуючи для виведення тексту інші кольори, наприклад Black, Gray, LtCyan, LtGray, TtGreen, LtMagenta, LtRed, LtYellow, White.

3) Змініть текст додатка, формуючи колір тексту, як сукупність випадкових значень його компонент - червоного, зеленого та блакитного. Для цього замініть

TColor forecolor (TColor:: LtBlue) на

TColor forecolor (random (255), random (255), random (255)).

Для використання random в початок програми вставте

# Include

5.1.4. Трохи англійської

TDC - Type Device Context - тип контексту пристрої

a device - пристрій

a color - колір

to set - встановлювати

SetTextColor - to Set a Text Color - встановити колір тексту

a point - точка

6. Оновлення вмісту вікна

Великим досягненням Windows є перекриваються вікна. Працюючи із системою, Ви можете побачити на екрані кілька вікон, накладених один на одного. Ви можете вибрати одне з таких вікон і зрушити його убік. У результаті на екрані з'явиться вміст вікон заднього плану. Але не слід думати, що Windows зберігає масив пікселів кожного з вікон, щоб відображати їх на екрані, навпаки, вона доручає додаткам самим відновлювати свої вікна.

Якщо вміст вікна потребує відновлення, Windows посилає додатку-власнику вікна повідомлення WM_PAINT. Якщо програма має функцію відгуку на це повідомлення, то функція буде активізовано і перемалюють вікно, відновивши його зовнішній вигляд.

Отже, коректне Windows-додаток повинен здійснювати вивід у вікно програми лише через віртуальну функцію Paint, що спричинюється при приході WM_PAINT.

Ви можете легко переконатися у сказаному, запустивши додаток, представлене в розділі 5.1.1. Помістіть над вікном цього додатка будь-яке інше прикладне вікно і видаліть його - робоча область вікна не відновиться. Так і повинно бути, оскільки цей додаток не має функції Paint.

Зверніть увагу! Сама функція Paint не є функцією відгуку на повідомлення і для неї не треба включати макрос повідомлення в таблицю відгуків. Paint необхідно тільки визначити у класі, похідному від TWindow або TFrameWindow.

6.1. Малювання у вікні за допомогою Paint

Нижченаведене додаток видає в робочу зону вікна блакитний прямокутник з вписаним в нього зеленим еліпсом. Висновок здійснює функція Paint.

6.1.1. Оригінальний текст програми

# Include

# Include

# Include

class TMyWin: public TFrameWindow

{

public:

TPoint pn, pk;

TMyWin (): TFrameWindow (0, "The Paint function")

{

pn.x = 100;

pn.y = 50;

pk.x = 300;

pk.y = 200;

}

void Paint (TDC &, BOOL, TRect &);

};

void TMyWin:: Paint (TDC & dc, BOOL, TRect &)

{

TColor color (TColor:: LtBlue);

TPen pen1 (color);

dc.SelectObject (pen1);

dc.Rectangle (pn, pk);

TPen pen2 (TColor:: LtGreen);

dc.SelectObject (pen2);

dc.Ellipse (pn, pk);

}

class TMyApp: public TApplication

{

public:

TMyApp (): TApplication ()

{}

void InitMainWindow ()

{

MainWindow = new TMyWin ();

}

};

int OwlMain (int, char * [])

{

TMyApp app;

return app.Run ();

}

6.1.2. Пояснення до програми

Клас TMyWin описує головне вікно програми. Члени-дані pn і pk - об'єкти класу TPoint - призначені для зберігання координат лівого верхнього і правого нижнього кутів прямокутника.

Конструктор TMyWin, конструюючи вікно програми, ініціалізує значення pn і pk.

Оголошення класу також містить прототип функції Paint. Оператори, які працюють у теле Paint, використовують контекст пристрою dc, рухаючись їй при виклику.

6.1.3. Завдання

1) Створити і виконати програму. Перевірити його роботу, змінюючи розміри прикладного вікна.

2) Змінити функціонування Paint, помістивши в її тіло оператори

pk.x + = 25;

pk.y + = 15;

Поекспериментуйте з додатком і поясніть поведінку прикладного вікна.

6.1.4. Трохи англійської

to paint - фарбувати, перефарбовувати, малювати

a rectangle - прямокутник

an ellipse - еліпс

to select - вибирати

SelectObject - to Select an Object - вибрати об'єкт

7. Створення меню

Вікна майже кожного додатки містять рядок меню, вибравши яке, ми отримуємо список команд. Будь-яку з цих команд можна виконати, зробивши клацання на ній лівою клавішею миші. При цьому Windows надсилає відповідне повідомлення з додатком. Якщо програма має відповідну функцію відгуку, то воно зможе відреагувати на команду меню.

В описі таблиці відгуку необхідно для кожної команди меню вставити макрос виду

EV_COMMAND (MENU_ITEM_ID,),

де MENU_ITEM_ID - константних ідентифікатор пункту меню,

- Ім'я функції відгуку, яка буде активізуватися при виборі пункту меню із заданим ідентифікатором. На відміну від функцій реакції на системні повідомлення, функція відгуку на команду меню може мати будь-яке ім'я.

Зверніть увагу. Для розробки даної програми необхідно створити файл ресурсів з розширенням. Rc, в якому буде зберігатися опис ресурсу меню програми, і файл з розширенням. Rh, в якому будуть збережені константні ідентифікатори пунктів меню. Немає необхідності створювати дані файли вручну. Для цього ми скористаємося програмою Resource Workshop.

7.1. Створення ресурсів програми за допомогою Resource Workshop T>

1. Запустіть компілятор. Для цього активізуйте піктограму Borland C + +.

2. Виконайте команду Project | New project.

3. Як було описано раніше, виберіть ім'я та шлях до створюваного проекту.

4. Виберіть Advanced у діалозі New project. Потім у панелі, що з'явилася зніміть прапорець def і встановіть прапорець rc. Завершіть створення проекту натисканням OK.

5. У результаті Ваших дій має з'явитися вікно проекту, що містить два файли: один з розширенням. Cpp, інший - з розширенням. Rc, що є файлом ресурсів створюваного проекту.

6. Тепер можна приступити до створення ресурсів нашої програми, а саме, меню. У результаті виконаної роботи Ви повинні будете отримати меню Size і два його пункту - Large і Small. Вони знадобляться нам у програмі, яка буде виводити геометричні фігури різних розмірів за бажанням користувача.

Borland C + + для Windows

7. У вікні проекту виберіть файл з розширенням. Rc. На відміну від cpp-файлів, файли з розширенням. Rc редагуються не в текстовому редакторі, а в спеціалізованому редакторі ресурсів Resource Workshop. У його вікні Ви зможете побачити вміст Вашого rc-файлу, але в даний момент він порожній.

8. Перше, що необхідно зробити - це додати в проект ресурсів файл з розширенням. Rh (resource header, тобто заголовок ресурсів). Це необхідно для того, щоб у своїй програмі Ви могли посилатися на створені ресурси через rh-файл так само, як Ви посилаєтеся на бібліотечні функції компілятора, описані у файлах з розширенням. H.

Для підключення файлу виконайте File | Add to project. У що з'явилася діалогової панелі в полі File type виберіть RH, H header, а в полі File name введіть ім'я свого header-файлу (в описі даної лабораторної роботи було використано ім'я lab3c.rh, яке фігурує в наведених нижче лістингах. Якщо Ви введете ім'я, відмінне від нього, то Ви повинні будете враховувати це при включенні файлу в свою програму). Дайте відповідь Yes на питання про необхідність створення файлу.

Borland C + + для Windows

9. Тепер можна приступити до створення меню нашого застосування. Для цього виконайте наступне:

1) Виконайте команду Resource | New з меню редактора ресурсів.

2) У списку можливих типів ресурсів панелі New resource виберіть MENU.

Borland C + + для Windows

Переконайтеся, що поле Place identifiers in вказує на файл з розширенням. Rh. Поле Place resource in повинно завжди вказувати на Ваш rc-файл. Натисніть OK і Workshop приступить до створення меню.

3) Після виконаних кроків Ви повинні побачити наступне:

Borland C + + для Windows

Що з'явилося вікно є редактор меню. У заголовку Ви бачите назву створеного меню MENU_1. У правому верхньому кутку вікна розташовується поле TEST MENU, яке дозволяє перевірити роботу створюваного меню. Рядок створеного меню містить назву розділу меню Pop-up (що означає спливаючий). При клацанні мишею на даному імені з'являються пункти меню.

4) Нам потрібно отримати пункт меню з ім'ям Size. Для цього клацніть мишею по імені Pop-up в полі тестування меню, або на тому ж імені в описі меню в правому нижньому кутку вікна. Далі, перейдіть в поле Item text і перейменуйте пункт меню з Pop-up в Size. Натисніть Enter і переконайтеся, що поле тестування відобразило перейменований пункт меню.

5) Нам потрібно створити команду меню Small. Для цього в полі тестування або в вікні опису меню виберіть пункт Item. У полі тестування це робиться вибором пункту Size і вибором у меню, що поля Item.

6) Переконайтеся, що поле Item text дійсно містить текст "Item". Перейдіть в це поле і змініть текст на "Small". Перевірте, що у створюваному меню відображається пункт Small.

7) У полі Item Id редактора меню введіть ім'я константного ідентифікатора, який буде передаватися програмі при виборі пункту меню Small. Нехай це буде CM_SIZE_SMALL (CM означає Command, команда).

8) Створимо тепер пункт меню Large. Для початку перевірте, що у вікні опису меню виділений пункт меню Small, тому що створюваний нами новий пункт меню повинен з'явитися під ним. Потім виконайте команду меню редактора Menu | New menu item. Результатом роботи команди буде новий пункт меню, який буде розташований під командою Small. За допомогою описаних вище дій дайте пункту меню ім'я Large і впишіть ідентифікатор команди CM_SIZE_LARGE.

Зверніть увагу! Необхідно вибирати New menu item, а не New menu pop-up, який створює не команду, а пункт меню, який сам містить свої команди і при активізації відкриває вкладене в нього меню.

9) Перевірте, що показує полі тестування створеного Вами меню.

На цьому створення меню програми завершено. Закрийте Workshop і дайте відповідь Yes на пропозицію програми зберегти результат Вашої роботи.

Необхідно також відзначити, що в header-файл, ім'я якого Ви вказали на початку побудови проекту, будуть поміщені імена константних ідентифікаторів пунктів меню CM_SIZE_SMALL і CM_SIZE_LARGE, а також ідентифікатор меню MENU_1, на які Ви будете посилатися при написанні програми.

7.2. Програмування з використанням меню

Нижченаведене додаток використовує команди Small і Large для управління виводу на екран фігур різного розміру.

Borland C + + для Windows

Перш, ніж приводити текст програми покажемо, що ж ми отримали в результаті маніпуляцій над Resource Workshop.

7.2.1. Лістинг rh-файлу

/************************************************* *************************

lab3с.rh

produced by Borland Resource Workshop

************************************************** ************************/

# Define MENU_1 1

# Define CM_SIZE_SMALL 102

# Define CM_SIZE_LARGE 101

7.2.2. Лістинг rc-файлу

/************************************************* *************************

LAB3С.RC

produced by Borland Resource Workshop

************************************************** ************************/

# Include "lab3с.rh"

MENU_1 MENU

{

POPUP "Size"

{

MENUITEM "Small", CM_SIZE_SMALL

MENUITEM "Large", CM_SIZE_LARGE

}

}

Взагалі rc-файл містить в собі текстовий опис ресурсів і, як може здатися, легше написати його за допомогою текстового редактора. Це вірно лише для простих файлів ресурсів. Для написання ж великих програм краще скористатися можливостями Resource Workshop.

7.2.3. Оригінальний текст програми

# Include

# Include

# Include

# Pragma hdrstop

# Include "lab3а.rh"

class TMyWin: public TFrameWindow

{

public:

TPoint pn, pk;

TMyWin (): TFrameWindow (0, "The Paint function")

{

pn.x = 100;

pn.y = 50;

pk.x = 300;

pk.y = 200;

}

protected:

void Paint (TDC &, BOOL, TRect &);

void CmLarge ();

void CmSmall ();

DECLARE_RESPONSE_TABLE (TMyWin);

};

DEFINE_RESPONSE_TABLE1 (TMyWin, TFrameWindow)

EV_COMMAND (CM_SIZE_LARGE, CmLarge),

EV_COMMAND (CM_SIZE_SMALL, CmSmall),

END_RESPONSE_TABLE;

void TMyWin:: Paint (TDC & dc, BOOL, TRect &)

{

TColor color (TColor:: LtBlue);

TPen pen1 (color);

dc.SelectObject (pen1);

dc.Rectangle (pn, pk);

TPen pen2 (TColor:: LtGreen);

dc.SelectObject (pen2);

dc.Ellipse (pn, pk);

}

void TMyWin:: CmLarge ()

{

pk.x = 500;

pk.y = 400;

Invalidate ();

}

void TMyWin:: CmSmall ()

{

pk.x = 150;

pk.y = 100;

Invalidate ();

}

class TMyApp: public TApplication

{

public:

TMyApp (): TApplication ()

{}

void InitMainWindow ()

{

MainWindow = new TMyWin ();

MainWindow-> AssignMenu (MENU_1);

}

};

int OwlMain (int, char * [])

{

TMyApp app;

return app.Run ();

}

7.2.4. Пояснення до програми

Клас TMyWin містить оголошення членів-функцій Paint, CmLarge, CmSmall.

Опис таблиці реакції показує, що у відповідь на вибір команди меню Small з ідентифікатором CM_SIZE_SMALL буде викликатися функція CmSmall. Аналогічно для команди Large. При її виборі буде викликана CmLarge. Ще раз підкреслимо, що для команд меню немає стандартних функцій відгуку, як це було з системними повідомленнями Windows, тобто в макросі Ви можете вказати ім'я будь-якої функції відгуку, головне, щоб вона не приймала і не повертала значень.

Опис функції Paint цілком збігається з її текстом в попередньому розділі.

Функції відгуку на повідомлення меню змінюють координати правого нижнього кута прямокутника і викликають інкапсульованого в TFrameWindow функцію Invalidate, яка змушує Windows оновити вікно програми. Виклик цієї функції говорить системі, що вікно вимагає оновлення і та посилає додатком повідомлення WM_PAINT.

7.3. Завдання

1) Створити і виконати програму.

2) Видаліть виклик функції Invalidate в одній з функцій відгуку. Поясніть зміни в логіці роботи програми.

3) Створіть додаткове меню Color з командами Black і Red, які повинні змінювати колір виводяться на екрані фігур.

8. Керуючі компоненти Windows

Розглянемо кілька управляючих компонент Windows, що полегшують діалог з додатком.

Перший компонент - це лінійка прокручування. Вона може бути розташована у вікні програми і представляє собою вертикальну або горизонтальну смугу з повзунком. Повзунок можна пересунути, зачепивши його покажчиком миші та перетягнувши вздовж смуги прокручування.

Borland C + + для Windows

Лінійка створюється як об'єкт класу TScrollBar в конструкторі вікна додатка. Конструктору TScrollBar передаються координати і розміри створюваної лінійки, а так само тип лінійки - горизонтальна або вертикальна.

Покажемо, як використовувати в додатку вертикальну лінійку прокрутки.

Під час переміщення повзунка вертикальна лінійка генерує повідомляючі повідомлення WM_VSCROLL. Ви можете перехопити і обробити ці повідомлення, оголосивши в класі-власника такої лінійки функцію відгуку EvVScroll і доповнивши таблицю відгуку класу макросом EV_WM_VSCROLL. Функція буде викликатися при зміні положення повзунка на лінійці.

При створенні лінійки надайте адресу сконструйованого об'єкта вказівником. У результаті Ви отримаєте доступ до різноманітного набору функцій об'єкта. Наприклад, з'явиться можливість позиціонувати повзунок з програми, отримувати позицію повзунка і змінювати масштаб лінійки (за замовчуванням позиція повзунка на лінійці змінюється від 0 до 100).

Все сказане вище справедливо і для горизонтальної лінійки прокручування, але для реакції на її повідомлення потрібно функція EvHScroll і макрос EV_WM_HSCROLL.

Тепер приділимо увагу іншому компоненту візуального інтерфейсу Windows - кнопці.

Кнопка може бути розташована у вікні програми і являє собою прямокутник з написом. Кнопка реагує на клацання мишею видачею який повідомляє повідомлення. Вона створюється в конструкторі вікна програми, як об'єкт класу TButton.

Конструктору TButton передається адреса об'єкту-вікна, в якому Ви хочете розмістити кнопку, текст напису на кнопці, її координати і розмір. Конструктору також передається константних ідентифікатор кнопки. Даний ідентифікатор збігається з ідентифікатором який повідомляє повідомлення, що генерується кнопкою при натисканні.

Реакція на натискання кнопки реалізується аналогічно реакції на вибір команди меню: Ви описуєте функцію реакції (ім'я функції довільна) на натискання кнопки і ставите в таблицю реакції макрос

EV_COMMAND (BUTTON_ID, UserName)

з ідентифікатором кнопки і ім'ям функції відгуку.

Додаток може мати кілька кнопок з різними ідентифікаторами і для кожної кнопки потрібно створити свою функцію відгуку і додати елемент до таблиці реакцій.

Якщо Ви хочете реагувати тільки на натискання кнопки, ніяк не змінюючи її характеристик, то привласнювати вказівником адресу створеного об'єкта-кнопки не потрібно.

8.1. Зміна розміру виведеної графіки за допомогою лінійки прокрутки

У наступне додатку в прикладному вікні видається блакитний прямокутник з вписаним в нього еліпсом. У вікні створюється вертикальна лінійка прокрутки. Переміщуючи повзунок лінійки, можна плавно змінювати розміри виведених геометричних фігур в деякому фіксованому діапазоні.

8.1.1. Вихідний текст програми

# Include

# Include

# Include

# Include

class TMyWin: public TFrameWindow

{

public:

TPoint pn, pk;

TScrollBar * sb;

TMyWin (): TFrameWindow (0, "The Paint function")

{

sb = new TScrollBar (this, 1,350,100,20,125, FALSE);

pn.x = 100;

pn.y = 40;

pk.x = 300;

pk.y = pn.y;

}

protected:

void Paint (TDC &, BOOL, TRect &);

void EvVScroll (UINT, UINT, HWND);

DECLARE_RESPONSE_TABLE (TMyWin);

};

DEFINE_RESPONSE_TABLE1 (TMyWin, TFrameWindow)

EV_WM_VSCROLL,

END_RESPONSE_TABLE;

void TMyWin:: Paint (TDC & dc, BOOL, TRect &)

{

TColor color (TColor:: LtBlue);

TPen pen1 (color);

dc.SelectObject (pen1);

dc.Rectangle (pn, pk);

TPen pen2 (TColor:: LtGreen);

dc.SelectObject (pen2);

dc.Ellipse (pn, pk);

}

void TMyWin:: EvVScroll (UINT scrollcode, UINT thumbPos, HWND hwnd)

{

TFrameWindow:: EvVScroll (scrollcode, thumbPos, hwnd);

InvalidateRect (TRect (pn, pk));

pk.y = pn.y + sb-> GetPosition () * 2;

UpdateWindow ();

}

class TMyApp: public TApplication

{

public:

TMyApp (): TApplication ()

{}

void InitMainWindow ()

{

MainWindow = new TMyWin ();

}

};

int OwlMain (int, char * [])

{

TMyApp app;

return app.Run ();

}

8.1.2. Пояснення до програми

Заголовний файл owlscrollba.h містить опис класу TScrollBar і його членів-функцій. Опис класу TMyWin містить оголошення точок (об'єктів класу TPoint) для лівого верхнього і правого нижнього кутів прямокутника. У класі додатково оголошено об'єкт класу TScrollBar, що представляє собою вертикальну лінійку прокрутки. TMyWin містить також функцію відгуку EvVScroll на повідомлення від лінійки прокрутки і перевизначення функцію Paint.

У тілі конструктора TMyWin створюється лінійка прокрутки і задаються початкові значення координат двох кутів прямокутника.

Опис таблиці реакцій містить елемент EV_WM_VSCROLL.

Функція EvVScroll викликає однойменну функцію базового класу для забезпечення повної обробки надходять від скроллера повідомлень. Потім функція вимагає перемалювати частину робочої зони вікна для виведення геометричних фігур зі зміненими розмірами. Для отримання положення повзунка на лінійці прокручування використовується функція GetPosition, яка повертає число в діапазоні від 0 до 100. Виклик функції UpdateWindow викликає негайне оновлення вікна програми, посилаючи вікна WM_PAINT в обхід системної черги повідомлень.

8.1.3. Завдання

1) Створити досліджувати роботу програми.

2) Змінити вертикальну лінійку прокрутки на горизонтальну.

3) Дослідити роботу програми, закоментувавши виклик UpdateWindow в тілі EvVScroll.

4) Дослідити роботу програми, видаливши виклик функції InvalidateRect.

5) Змініть таблицю реакції, видаливши в ній EV_WM_VSCROLL. Поясніть поведінку програми.

8.2. Зміна кольору виведеної графіки за допомогою кнопок

У наводиться тут тексті Windows-додатка кольори виводяться на екран геометричних фігур змінюється при натисканні однієї з двох кнопок, розміщених у вікні програми.

8.2.1. Вихідний текст програми.

# Include

# Include

# Include

# Include

# Define CM_BUTTON1 100

# Define CM_BUTTON2 200

class TMyWin: public TFrameWindow

{

public:

TPoint pn, pk;

int nColor;

TMyWin (): TFrameWindow (0, "The Paint function")

{

new TButton (this, CM_BUTTON1, "Palette 1", 350,50,80,30);

new TButton (this, CM_BUTTON2, "Palette 2", 350,100,80,30);

pn.x = 100;

pn.y = 50;

pk.x = 300;

pk.y = 200;

nColor = 1;

}

void Paint (TDC &, BOOL, TRect &);

void CmButton1 ()

{

nColor = 1;

Invalidate ();

UpdateWindow ();

}

void CmButton2 ()

{

nColor = 2;

Invalidate ();

UpdateWindow ();

}

DECLARE_RESPONSE_TABLE (TMyWin);

};

DEFINE_RESPONSE_TABLE1 (TMyWin, TFrameWindow)

EV_COMMAND (CM_BUTTON1, CmButton1),

EV_COMMAND (CM_BUTTON2, CmButton2),

END_RESPONSE_TABLE;

void TMyWin:: Paint (TDC & dc, BOOL, TRect &)

{

TColor color (nColor == 1? TColor:: LtBlue: TColor:: LtYellow);

TPen pen1 (color);

dc.SelectObject (pen1);

dc.Rectangle (pn, pk);

TPen pen2 (nColor == 1? TColor:: Black: TColor:: LtRed);

dc.SelectObject (pen2);

dc.Ellipse (pn, pk);

}

class TMyApp: public TApplication

{

public:

TMyApp (): TApplication ()

{}

void InitMainWindow ()

{

MainWindow = new TMyWin ();

}

};

int OwlMain (int, char * [])

{

TMyApp app;

return app.Run ();

}

8.2.2. Пояснення до програми

Заголовний файл owlbutton.h містить опис класу TButton і його членів.

На початок програми поміщені директиви

# Define CM_BUTTON1 100

# Define CM_BUTTON2 200,

визначають константні ідентифікатори повідомлень, які будуть надсилатися програмі кнопками у відповідь на клацання мишею. CM_BUTTON1 генерується першою кнопкою, CM_BUTTON2 - другий. Можна вибрати інші імена повідомлень, відмінні від CM_BUTTONn і значення констант, відмінні від наведених у програмі, але для того, щоб програма правильно реагувала на повідомлення кнопок, необхідно правильно заповнити таблицю реакцій, передавши в якості аргументів макросам таблиці імена констант і імена функцій відгуку.

Конструктор прикладного вікна створює за допомогою оператора new дві кнопки, передаючи їм у якості аргументів ідентифікатор вікна, ідентифікатор що повідомляє повідомлення, яке буде генерувати кнопка, текст напису на кнопці і координати розміщення кнопки у вікні програми.

Зверніть увагу на те, що адреси створених об'єктів-кнопок не присвоюються вказівниками. Цього не потрібно робити тому, що в програмі немає необхідності посилатися на ці об'єкти.

Функції відгуку на повідомлення кнопок CmButton1 і CmButton2 змінюють ознака кольору геометричних фігур і оголошують про необхідність перемальовування вікна додатка.

Таблиця відгуку конструюється так само, як це робилося при використанні меню. Вона містить ідентифікатори повідомляючих повідомлень, що приходять від кнопок і імена функцій класу прикладного вікна, що відповідають за обробку даних повідомлень.

8.2.3. Завдання.

1) Створити програму та дослідити його роботу.

2) Змінити аргументи конструктора (текст кнопки, координати, розмір і т. д.) TButton однієї з кнопок.

3) Дослідіть роботу додатка, закоментувавши виклик Invalidate в одній з функцій відгуку.

9. Введення і редагування тексту

Дана тема буде присвячена панелям введення і редагування - однієї з найпопулярніших компонент Windows.

Використання панелі вводу та редагування тексту дозволяє додатку ввести і при необхідності відредагувати одну або кілька рядків тексту.

Панель редагування створюється, як об'єкт класу TEdit і може бути розміщена в будь-якому прикладному вікні. Дана панель являє собою стандартний текстовий редактор Windows, в якому доступні всі операції редагування тексту - вставка і заміна тексту, видалення символів і робота з буфером обміну Windows.

Розрізняють два типи панелей редагування - однорядкова і багаторядкова.

Створення панелей редагування і розміщення їх у вікні програми здійснюються аналогічно створення кнопок і смуг прокручування. Об'єкт створюється з класу TEdit. Конструктору об'єкта передається ідентифікатор вікна, в якому буде розміщена панель, константних ідентифікатор панелі, текст, який буде поміщений в редактор і координати панелі у вікні програми. Додатково конструктору передається стиль панелі редагування: TRUE, якщо створюється багаторядкова панель, FALSE, якщо панель - однорядкова (див. розділ 10.7).

9.1. Приклад використання однорядкового текстового редактора для введення і редагування тексту

Наведене в цьому розділі додаток створює однорядковий текстовий редактор і виводить копії цього рядка у вікні програми.

9.1.1. Оригінальний текст програми

# Include

# Include

# Include

# Include

# Include

# Define ID_ONELINER 150

# Define CM_BUTTON 160

# Define TEXTLEN 10

class TMyWin: public TFrameWindow

{

TEdit * oneLiner;

char txt [TEXTLEN];

public:

TMyWin (): TFrameWindow (0, "the TEdit object")

{

- OneLiner = new TEdit (this, ID_ONELINER, "Input one line", 10,10,100,30, TEXTLEN, FALSE);

- New TButton (this, CM_BUTTON, "Update", 10,100,70,25);

- Txt [0] = '';

}

protected:

void CmButton ();

void Paint (TDC &, BOOL, TRect &);

DECLARE_RESPONSE_TABLE (TMyWin);

};

DEFINE_RESPONSE_TABLE1 (TMyWin, TFrameWindow)

EV_COMMAND (CM_BUTTON, CmButton),

END_RESPONSE_TABLE;

void TMyWin:: CmButton ()

{

oneLiner-> GetLine (txt, TEXTLEN, 0);

Invalidate ();

/ / UpdateWindow ();

}

void TMyWin:: Paint (TDC & dc, BOOL, TRect &)

{

- For (int i = 1; iGetLineLength (i-1);

- Txt = new char [lineLength];

- MultiLiner-> GetLine (txt, lineLength, i-1);

- Dc.TextOut (250,50 + i * 20, txt);

- Delete txt;

-}

}

class TMyApp: public TApplication

{

public:

TMyApp (): TApplication (){};

void InitMainWindow ()

- {

- MainWindow = new TMyWin ();

-}

};

int OwlMain (int, char * [])

{

return TMyApp (). Run ();

}

9.2.2. Завдання

1) Порівняйте листинги програм, які приводяться в 9.2.1 і в 9.1.1, приділивши особливу увагу на відмінності в конструюванні однорядковою і многострочной панелей редагування.

2) Створіть і виконайте програму.

3) Створіть елемент меню прикладного вікна, викликає однорядковий або багаторядковий елемент редагування.

9.3. Трохи англійської

to edit - редагувати

GetLine - to get a line - отримати рядок

GetLineLength - to get a line length - отримати довжину рядка

10. Додаток. Класи бібліотеки OWL.

10.1. Ієрархія класів бібліотеки OWL, використовуваних у посібнику

Borland C + + для Windows

10.2. Клас TApplication

Похідний від класу TModule. Використовується для породження класу для об'єкта-додатки Windows.

Клас TApplication містить 7 членів-даних і 35 членів-функцій, із яких у цьому посібнику використовуються:

10.2.1. Член-дане:

TFrameWindow * MainWindow; - - public

Покажчик на головне вікно програми.

10.2.2. Член-функції:

virtual void InitApplication (); - - protected

Виконує будь-яку ініціалізацію, необхідну тільки для першого примірника програми. За замовчуванням InitApplication ніего не виконує.

virtual void InitInstance (); - - - protected

Випоняется для кожного екземпляра додатка. InitInstance викликає InitMainWindow, а потім створює і висвічує на екрані головне вікно шляхом виклику відповідно TWindow:: Create і TWindow:: Show.

virtual int Run (); - - - public

Ініціалізує екземпляр додатку, викликаючи InitApplication для першого примірника і InitInstance для всіх інших. Якщо ініціалізація пройшла успішно, Run викликає MessageLoop і запускає програму.

virtual void InitMainWindow (); - - protected

За замовчуванням InitMainWindow створює узагальнений об'єкт - головне вікно з ім'ям програми в якості заголовка. Для створення необхідного головного вікна необхідно перевизначити InitMainWindow, не забувши зробити посилання в MainWindow на створене головне вікно (класу TFrameWindow).

TAplication (const far * name = 0); - - public

Цей конструктор створює об'єкт класу TApplication.

name - покажчик на назву програми.

Цей конструктор використовується в тілі функції OwlMain.

10.3. Клас TFrameWindow

Похідний від TWindow. Управляє поведінкою головного вікна за допомогою керування клавіатурою і обробкою команд меню.

Клас TFrameWindow містить 4 член-даних і 25 член-функцій, із яких у цьому посібнику використовуються:

10.3.1. Член-функції:

virtual BOOL AssignMenu (TResId menuId); - - public

Встановлює Attr.Menu рівним аргументу menuId і видаляє попереднє меню вікна

void SetupWindow (); - - - protected

Викликає TWindow:: SetupWindow () для створення вікон у списку нащадків. SetupWindow () виконує початкову підготовку користувальницького вікна, якщо воно існує, пов'язує меню рамки з ресурсом меню.

TFrameWindow (TWindow * parent, const char far * 0, TWindow * clientWnd = 0, BOOL shrinkToClient = FALSE, TModule * module = 0); - - public

Створює об'єкт-вікно з вікном предком, на яке указиивает parent. Встановлює позиції і поля розмірів структури Attr рівними стандартних значень.

title - ім'я заголовка створюваного вікна.

10.4. Клас TWindow

Похідний від класів TEventHandler і TStreamableBase. Забезпечує специфічну поведінку вікон.

Клас TWindow містить 12 член-даних і 175 член-функцій, з котрих у даному посібнику використовуються:

10.4.1. Член-дані:

TWindowAttr Attr; - - - public

Зберігає структуру TWindowAttr, що містить атрибути створення вікна.

TWindow * parent; - - - public

Вказує на інтерфейсний об'єкт, службовець вікном-предком для даного інтерфейсного об'єкта.

char far * title; - - - public

Указиваетна заголовок вікна.

10.4.2. Член-функції:

TWindow (TWindow * parent, const char far * 0, TModule * module = 0); public

Конструктор класу TWindow. Додає this до списку вікон-нащадків parent, якщо this не 0.

Також встановлює заголовок вікна title і ініціалізує атрибути створення вікна.

virtual BOOL CanClose (); - - - public

Повертає TRUE, якщо асоційований інтерфейсний елемент може бути закритий. Інакше повертає FALSE.

inline TApplicacion * GetApplication (); - - public

Отримує покажчик на об'єкт TApplication, пов'язаний з this.

int MessageBox (const far * text, const char far * caption = 0, UINT type = MB_OK); public

Создет і виводить вікно повідомлень, що містить повідомлення text, заголовок caption і піктограми або кнопки type.

Тип type може містити комбінації констант MB_XXX: IDABORT, IDCANCEL, IDIGNORE, IDNO, IDOK, IDRETRY, IDYES.

virtual void Paint (TDC & dc, BOOL erase, TRect & rect); - public

Викликається базовими класами при реагуванні (відгуку) на повідомлення WM_PAINT.

Paint викликається за допомогою EvPaint і автоматично запрошується системою Windows для повторного виведення вмісту вікна.

dc є контекстом відображення малювання, переданим функціям малювання тек ста і графічного виведення.

Задана посилання на структуру TRect представляє собою обмежує прямокутник області, що вимагає перемальовування.

erase показує, чи потрібно прати фон.

10.5. Клас TDC

Є кореневим класом для допоміжних класів контекстів пристроїв GDI. Клас TDC містить 8 член-даних і 149 член-функцій, із яких у цьому посібнику використовуються:

10.5.1. Член-функції:

inline BOOL Ellipse (int x1, int y1, int x2, int y2); - - public

inline BOOL Ellipse (const TPoint & p1, const TPoint & p2);

Малює і заповнює еліпс в даному контексті, використовуючи вибрані об'єкти - перо і кисть. Центр еліпса - центр би прямокутника. Повертає TRUE, якщо виклик успішний, інакше - FALSE.

inline BOOL Rectangle (int x1, int y1, int x2, int y2); - - public

inline BOOL Rectangle (const TPoint & point, const TSize & size);

inline BOOL Rectangle (const TRect & rect);

Малює і заповнює прямокутник заданого розміру в даному контексті з використанням поточного пера і пензля.

Повертає TRUE при успішному завершенні і FALSE в іншому випадку.

void SelectObject (const TPen & pen); - - public

Вибирає заданий перо в заданому контексті пристрою. Обраний раніше об'єкт зберігається у відповідному елементі даних.

inline virtual TColor SetTextColor (TColor color); - - public Встановлює поточний колір тексту в даному контексті в задане значення color. Колір тексту визначає колір, використовуваний в TDC:: TextOut.

inline virtual BOOL TextOut (int x, int y, const char far * string, int count =- 1); public

inline virtual BOOL TextOut (const TPoint & point, const char far * string, int count =- 1);

Малює до count символів заданої, що закінчується нулем, рядки string в даному контексті пристрою. Якщо count =- 1 (за умолчнію), малюється весь рядок. Аргументи x, y задають логічні координати опорної точки, яка використовується для вирівнювання першого символу.

10.6. Клас TScrollBar

Об'єкти типу TScrollBar представляють самостійні вертикальні і горизонтальні лінійки прокручування. Більшість член-функцій TScrollBar управляють позицією і діапазоном переміщення бігунка лінійки прокручування.

Клас TScrollBar містить 2 член-даних і 18 член-функцій, з яких у даному посібнику використовуються:

10.6.1. Член-функції:

TScrollBar (TWindow * parent, int id, int x, int y, int w, int h, BOOL isHScrollBar, TModule * module = 0); - - - public

Створює і ініціалізує об'єкт типу TScrollBar в заданому вікні з ідентифікатором id, у позиції x, y і розмірами w, h. Якщо isHScrollBar дорівнює TRUE, то створюється горизонтальна лінійка прокрутки, інакше - вертикальна.

inline virtual int GetPosition (); - - public

Повертає поточну позицію бігунка лінійки прокручування.

inline virtual void SetRange (int min, int max); - - public

Встановлює лінійку прокручування в діапазоні від min до max.

10.7. Клас TEdit

Клас TEdit використовується при створенні об'єкта "панель редагування". TEdit є похідним від класу TStatic, який у свою чергу породжений від класу TControl.

Існує два різновиди панелі редагування - однорядкова і багаторядкова. Будучи інтерфейсним елементом, панель редагування дозволяє ввести текст і редагувати його.

Член-функції класу TEdit обробляють текст панелі редагування.

Клас TEdit містить 1 член-дане і 52 член-функції, із яких у цьому посібнику використовуються:

TEdit (TWindow * parent, int id, const char far * text, int x, int y, int w, int h, UINT textlen, BOOL multiline = FALSE, TModule * module = 0); - - public

Конструює панель редагування у вікні parent, задаючи ідентифікатор панелі id, місце розташування x, y і розміри панелі w, h, довжину тексту, що вводиться textlen. Аргумент multiline задає вигляд панелі редагування (однорядкова або багаторядкова).

BOOL GetLine (char far * str, int strSize, int lineNumber); - public

Отримує текстову рядок з номером lineNumber з панелі редагування і повертає її в рядку str, що закінчується нулем.

strSize задає кількість одержуваних символів.

int GetLineLength (int lineNumber); - - public

Повертає кількість символів в рядку, заданої номером lineNumber.

inline int GetNumLines (); - - - public

Повертає кількість рядків, введених в багаторядкових панель редагування. Повертає нуль, якщо текст відсутній.

Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Реферат
101.8кб. | скачати


Схожі роботи:
Розробка програми на мові Borland Object Pascal Ide Borland Delphi
Налаштування локальної мережі і підключення до мережі інтернет для Windows XP і Windows 7
Windows XP - для початківців
Програма Word для Windows
Файлова система для операційної системи Windows
Налаштування файлу підкачки для оптимізації Windows XP
Табличний процесор Microsoft Excel для Windows
Дисперсійний аналіз за допомогою системи MINITAB для WINDOWS
Загальна характеристика табличного процесора Microsoft Excel 97 для Windows
© Усі права захищені
написати до нас