МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
Національний університет «Львівська політехніка»
ІЕПТ ім. В’ячеслава Чорновола
Кафедра загальної екології та
екоінформаційних систем
КУРСОВИЙ ПРОЕКТ
З дисципліни:
«Системне програмування та операційні системи»
на тему:
“ Проектування системи редагування текстової інформації ”
Львів – 2013
ЗМІСТ
Вступ……………………………………………………………………………….3
Формулювання задачі……………………………………………………...5
Методи та засоби розв’язання задачі…………………………………...6
Клас вікон…………………………………………………………….6
Створення вікна……………………………………………………...9
Головна функція додатка…………………………………………..11
Полоса прокрутки…………………………………………………..12
Створення полоси прокрутки……………………………………...13
Повідомлення від полоси прокрутки……………………………...14
Керування полосою прокрутки………..…………………………..15
Створення списку…………………………………………………..16
Вивід у вікно……………………………………………………..…17
Функції виводу тексту…………………………………………….18
Меню……………………………………………………………….19
Створення меню…………………………………………………...20
Вставка елементів в меню………………………………………...21
Видалення елементів з меню……………………………………...22
Акселератори………………………………………………………24
Алгоритм ров’язування задачі………………………………..................26
Програма та її опис……………………………………………………….28
Призначення програми………………………………….................28
Мова програмування на якій написана програма………………..28
Програмні засоби, необхідні для реалізації програми…………...28
Технічні засоби, необхідні для реалізації програми……………..28
Інструкція користувачеві……………………………………...................30
Контрольний приклад та аналіз результатів комп’ютерної реалізації програми…………………………………………………………………...32
Меню файл відкрити (File)………………………………………...32
Меню редагування (Edit)…………………………………………..32
Меню View……………………………………………….................33
Справка до програми (Help)…………………………….................33
Висновок………………………………………………………………………….34
Список використаної літератури………………………………………………..35
Додатки…………………………………………………………………………...36
Додаток 1…………………………………………………………………………36
Додаток 2…………………………………………………………………………38
Додаток 3…………………………………………………………………………47
Додаток 4…………………………………………………………………………49
Додаток 5…………………………………………………………………………51
ВСТУП
Метою даної курсової роботи є створення навчальної програми на тему “Проектування системи редагування текстової інформації”, яка може бути використана для редагування будь-якої текстової інформації.
Виконання даної курсової роботи є закріплення теоретичних знань та практичних навичок програмування, набутих при вивченні дисципліни “Системне програмування та операційні системи”. В ході виконання курсової роботи студенти повинні навчитися самостійно працювати з літературою, розробляти алгоритми та програми на мові програмування С++, Asembler.
С — мінімалістична мова програмування. Серед її головних цілей: можливість прямолінійної реалізації компіляції, використовуючи відносно простий компілятор, забезпечити низькорівневий доступ до оперативної пам'яті, формувати лише декілька інструкцій машинної мови для кожного елементу мови, і не вимагати обширної динамічної підтримки. У резальтаті, код С придатний для більшості системного програмного забезпечення, котре традиційно писалося на аcемблері.
Незважаючи на її низькорівневі можливості, мова проектувалася для машинно-незалежного програмування. Сумісна зі стандартами та машинно-незалежно написана програма на С може легко компілюватися на великій кількості апаратних платформ та операційних систем з мінімальними змінами. Мова стала доступною для великої кількості платформ, від вбудованих мікроконтроллерів до суперкомп'ютерів.
Моя програма написана на мові програмування C++. Працює вона наступним чином : ми вибираємо відповідний пункт меню і виконується відповідна команда. У цій пояснювальній зписці я описую такі розділи : аналіз складання алгоритму – тут я в деталях представляю усі методи, функції і їх особливості, які я використала для написання цієї програми. Нступним пунктом буде написання блок- схеми. По блок –схемі написати програму легше. До того ж якщо є блок-схема, то програму можна написати на довільній мові програмування. Принцип же однаковий. Різниця тільки в синтаксисі самої мови. Наступний розділ це загальна структура програми. І в кінці я роблю певні висновки.
1. Формулювання задачі
Проектування системи редагування текстової інформації:
1) програма повинна бути реалізована на мові С/С++, Assembler;
2) програма повинна працювати під керуванням операційної системи
Windows;
3) програма повинна мати інтерфейс у вигляді вікон та меню для вибору
режимів роботи програми;
4) керування режимами роботи програми виконати за допомогою
клавіатури та миші.
2. Методи та засоби розв’язання задачі
Програми для Windows називають додатками. Користувач з додатком взаємодіє через вікна наступних видів:
Вікно додатка. Воно організовує роботу, з'являється першим при запуску і закривається разом з припиненням роботи додатка.
MDI-вікна. Вони служать для одночасної обробки декількох документів.
Вікно допомоги. Воно більшою мірою працює під управлінням операційної системи, чим під управлінням додатка.
Діалогове вікно. Воно забезпечує оперативний обмін даними між користувачем і додатком.
Для розробника вікно є сукупністю великої кількості елементів, що функціонують під управлінням додатка і операційної системи.
З погляду мови програмування, вікна - це об'єкти над якими виконують дії. Об'єкт належить опреділеному класу (типові), який описує безліч даних (параметрів стану вікна) і метод (функцію) зміни цих даних.
Головне вікно має подвійні рамки, що обрамували, заголовок, різні кнопки, смугу меню, панель інструментів з кнопками, смуги перегляду, рядок стану і ін. Ці елементи також є вікнами, мають свої дані і метод їх зміни, тобто належать до класів вікон.
2.1 Клас вікон
Для створення вікна операційній системі вказують, до якого класу воно належить. Якщо до моменту створення вікна операційною системою відомий клас створюваного вікна (наприклад, це визначений в системі або зареєстрований поточним або іншим застосуванням клас), то можна скористатися ім'ям цього класу. Інакше потрібно створити новий клас (описати функцію вікна і набір використовуваних ресурсів) і зареєструвати його.
Опис використовуваних класом вікон pесурсів:
Набір використовуваних ресурсів класу задають в структурі типа WNDCLASS. Ця структура описана таким чином: typedef struct
{ UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hlnstance;
HICON hlcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;} WNDCLASS;
Наприклад, якщо описана структура цього типа: WNDCLASS wc;
то привласнюють певні значення її полям. Призначення полів цієї структури:
style набуває значень. Наприклад:
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
- lpfnWndProc вказує на функцію вікна. Вона розглядається нижче.
- cbClsExtra дорівнює кількості додаткових байт класу.
- cbWndExtra дорівнює кількості додаткових байт вікна цього класу.
- hInstance вказує на дескриптор поточного застосування.
- hIcon вказує на ймення піктограма (ікони), в яку перетворюється вікно при мінімізації. Ресурс ікони завантажують функцією LoadIcon:
HICON Loadlcon( HINSTANCE hlnst, LPCTSTR lplconName);
Параметр lplconName вказує на рядок з ім'ям завантажуваної ікони, а hInst - дескриптор додатка, чий виконуваний код містить завантажуваний ресурс. Для завантаження стандартної ікони hInst прирівнюють NULL, а як lplconName задають одне із значень. Наприклад, наступний оператор встановлює стандартну піктограму вікна додатка: wc.hlcon = Loadlcon( NULL, IDI_APPLICAT!ON );
В разі аварійного завершення функція повертає NULL і при згортанні вікон цього класу операційна система як іконки використовує логотип Windows.
- hCursor задає вид курсора миші при його проходженні над вікном.Ресурс курсора завантажують функцією LoadCursor:
HCURSOR LoadCursor( HINSTANCE hInst, LPCTSTR lpCursorName);
Параметр lpCursorName вказує на рядок з ім'ям завантажуваного ресурсу, а hInst - дескриптор додатка, чий виконуваний код містить завантажуваний ресурс. Для завантаження стандартного курсора hInst прирівнюють NULL, а як lpCursorName задають одне із значень. Наприклад, наступного оператора задає курсор у вигляді стандартной стрілки:
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
В разі аварійного завершення функція повертає NULL і вікно запозичуватиме курсор передування по руху миші вікна.
Функції LoadIcon і LoadCursor завантажують ресурс іконки або курсора, тільки якщо ресурс не був завантажений; інакше вибирають дескриптор загруженного ресурсу.
- hbrBackground задає дескриптор грона зафарбування фону вікна. В якості кисті можна використовувати "чисті" кольори або піктограму. Частіше використовують значення системного кольору. Кольори перетворять в типа HBRUSH. Наприклад, слідуючий оператор встановлює системний колір зафарбування фону:
wc.hbrBackground = (HBRUSH)( COLOR_WINDOW+1);
Система сама видаляє гроно фону при звільненні класу. Якщо вказати NULL, то додаток само повинен фарбувати фон вікон. Для оприділення необхідності зафарбування додаток обробляє повідомлення WM_ERASEBKGND або перевіряє поле fErase структури PAINTSTRUCT, заповненою функцією BeginPaint.
- lpszMenuName вказує на ресурс головного меню вікон цього класа. Якщо задати NULL, вікна цього класу не мають заданого по умовчанню меню. Наприклад:
wc.lpszMenuName = (LPCTSTR)NULL;
- 1pszClassName вказує на текстовий рядок, що містить ім'я реєстрованого класу вікон, наприклад: wc.lpszClassName = szName;
Для реєстрації класу вікон зручно використовувати функцію слідуючого вигляду:
int RegClass( WNDPROC Proc, LPCTSTR szName){ WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.cbClsExtra = wc.cbWndExtra = 0;
wc.lpfnWndProc = Proc; wc.hlnstance = hlnstance;
wc.hlcon = Loadlcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = (LPCTSTR)NULL;
wc.lpszClassName = szName;
return RegisterClass(&wc); }
Формальними параметрами цієї функції є покажчики на функцію вікна і рядок з ім'ям класу. Ім'я, список формальних параметрів і тип повернення функції можуть бути будь-якими іншими. Головне, щоб додатку після реєстрації були доступні ім'я зареєстрованого класу, а операційній системі - функція вікна цього класу.
2.2 Створення вікон
Для створення вікна викликають функцію CreateWindow. Вона створює вікно, що перекривається, тимчасове або дочірнє, і встановлює початкове значення деяких його параметрів.
Призначення аргументів виклику цієї функції:
- lpClassName вказує на зареєстрований функцією RegisterClass або визначеного операційною системою класу.
- dwStyle задає стиль вікна. Стиль вікон окремо розглянемо нижче.
x — координата лівого краю вікна в пікселях. Для тимчасових вікон x відлічують від лівого краю екрану робочої зони батьківського вікна. Якщо для перекриваючого вікна із стилем WSJVISIBLE як x задатиконстанту CW_USEDEFAULT, Windows встановлює не обов’язково нульову позицію за умовчанням для лівого верхнього кута вікна і ігнорує координату біля верхнього краю вікна. Для тимчасового дочірнього вікна така позиція за умовчанням рівна (0, 0).
- nWidth - ширина вікна в пікселях. Для вікон можна, що перекриваються, задати рівною CW_USEDEFAULT. В цьому випадку система встановлює ненульові значення ширини і висоти за умовчанням і ігнорує задану висоту nHeight вікна. Ширина і висота тимчасового і дочірнього вікна за умовчанням дорівнюють нулю.
- hWndParent може вказувати тільки на ініційоване вікно. Дескриптор вікна-батька обов'язково вказують при створенні дочірнього вікна. Дескриптор вікна-власника для тимчасового вікна вказувати необов'язково.
- hMenu - дескриптор меню або ідентифікатор створюваного дочірнього вікна.
Меню вікна, що перекривається або тимчасового, можна задати трьома способами:
1) у класі вікон вказують ім'я меню, і всі вікна цього класу можуть користуватися цим меню;
2) ім'я меню вказують як аргумент функції CreateWindow, і потрібне вікно користуватиметься цим меню, ігноруючи меню класу;
30 меню створюють в процесі або після створення вікна.
У першому і третьому випадках аргумент hMenu рівний NULL.
Якщо створюється дочірнє вікно, то аргументом hMenu задають Ідентифікатор цього вікна (цілочисельну константу).
Перед створенням вікна функція CreateWindow посилає код повідомлення WM_CREATE функції створюваного вікна. Вона потім обробляє повернуте функцією вікна значення і створює вікно, якщо це значення дорівнює 0, або не створює вікна, якщо значення рівне -1. Відповідно функція CreateWindow повертає дескриптор створеного вікна або NULL.
2.3 Головна функція додатка
Додатки завжди описують функцію з ім'ям WinMain. Вона отримує управління при запуску додатка, виконує властиві звичайним функціям дії, реєструє класи вікон, створює вікна, опитує чергу повідомлень і розподіляє свої повідомлення.
Приклад опису функції WinMain: int WINAPI WinMain( HINSTANCE hlnstance
HINSTANCE hPrevlnstance, LPSTR lpszCmdLine, int nCmdShow) { MSG msg; HWND hwnd;
if (!RegClass(WndProc, szClassName)) return FALSE; hwnd = CreateWindow(szClassName, "Приклад Г
WS_OVERLAPPEDWINDOW
CW_USEDEFAULT, CW USEDEFAULT
CW_USEDEFAULT, CW_USEDEFAULT
0, 0, hlnstance,NULL); if (!hwnd) return FALSE; ShowWindow( hwnd, SW_SHOWMAXIMIZED); UpdateWindow(hwnd); while (GetMessage(&msg, 0,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam;
}
Ім'я, тип повернення і список формальних параметрів функції опреділеними вимогами Windows API. Модифікатор WINAPI вказує на те, що функція при отриманні аргументів сама повинна виправити порядок розташування аргументів в стеку.
Параметр hInstance від операційної системи отримує дескриптор поточного екземпляра додатка. Параметр hPrevlnstance в 16-разрядних застосуваннях вказує на активний попередній екземпляр додатка або NULL. У додатках Win32 він завжди рівний NULL і по ньому неможливо дізнатися про існування інших активних екземплярів цього застосування. Параметр lpszCmdLine вказує на рядок з аргументами командного рядка запуску додатка. При звичайному запуску цей параметр рівний NULL. Параметр nCmdShow передає додатку спосіб початкового відображення вікна.
У тілі функції WinMain описані змінні msg і hwnd. Змінна msg призначена для тимчасового зберігання повідомлень при їх отриманні і розподілі. Змінна hwnd зберігає дескриптор створеного вікна.
2.4 Полоса прокрутки
Полоса прокрутки широко використовують для проглядання вмісту документа, який не поміщається у вікні. Такі смуги бувають тільки горизонтальні або вертикальні. Вони розташовуються відповідно в нижній і правій частці вікна. Поняття смуга прокрутки не обмежується смугою перегляду. Воно в спільному випадку є безліччю вікон класу scrollbar різного призначення. Найбільш складний різновид вікон класу "scrollbar" представляють полоси перегляду.
Смуга перегляду складається з декількох об'єктів, що мають різне призначення. Уявимо, що у вікні відображує якийсь документ.
Якщо встановити курсор миші на верхню "кнопку з трикутником" смуги перегляду і натискувати ліву клавішу миші, документ у вікні зрушується вниз на один "рядок". Якщо ж аналогічним чином натискувати на нижню "кнопку з трикутником", документ зрушується на один "рядок" вгору. Повзунок при цьому стрибком зрушується відповідно на одну "позицію" вгору або вниз.
Якщо встановити курсор миші в область смуги перегляду між повзунком і верхньою кнопкою і натискувати на ліву клавішу миші, документ зрушується вниз на одну "сторінку". Якщо клацнути лівою кнопкою миші в області між повзунком і нижньою кнопкою, документ зрушиться на одну "сторінку" вгору. Повзунок при цьому стрибком зміщується відповідно на одну "сторінку"вверх або вниз.
Повзунок можна плавно переміщати мишею вздовж смуги прокрутки. В процесі переміщення вміст вікна переміщається або відображається у позиції повзунка.
Таким чином, залежно від виду дії миші смуга прокрутки може давати 7 різних повідомлень батьківському вікну.
Горизонтальна смуга перегляду складається з тих же об'єктів, що і вертикальна. Вона забезпечує згортку документа в горизонтальному напрямі.
Існують і менш звичні види смуг прокрутки. Наприклад, це смуга прокрутки стилю SBS_SIZEBOX.
2.5 Створення смуги прокрутки
Існує 3 способи створення смуги прокрутки:
1. Смугу прокрутки можна створити за допомогою виклику функціїCreateWindow. Цей спосіб аналогічний способу, використовуваному пристворенні кнопок або статичних органів управління. Першим аргументом виклику функції CreateWindow вказують "scrollbar", а другим —NULL (заголовок вікна не використовується). Дескриптор смуги прокрутки використовують функції управління смугами прокрутки. Кількість і різновид смуг, що створюються в такий спосіб, нічим не обмежено.
2. При створенні будь-якого вікна за допомогою функції CreateWindowможна вказати, що вікно має горизонтальну, вертикальну або обидві полоси перегляду. Для того, щоб біля вікна з'явилися вертикальна чигоризонтальна смуги перегляду, при створенні вікна в третьому параметрі функції CreateWindow вказують стиль WS_VSCROLL чи WS_HSCROLL. Наприклад:
hwnd = CreateWindow(szClassName, szWindowTitle
WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_,HSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hlnstance, NULL);
3. Деякі органи управління також можуть мати смуги перегляду.Примітка! У другому і третьому способах дескриптори для смуг
перегляду не створюються.
2.6 Повідомлення від смуги прокрутки
Горизонтальні смуги прокрутки функції батьківського вікна посилають повідомлення WM_HSCROLL, а вертикальні - повідомлення WM_VSCROLL. При цьому молодше слово параметра wParam містить код досконалої дії, старше слово - поточну позицію повзунка, а lParam вказує на дескриптор смуги прокрутки.
Наступна таблиця перераховує імена код дій і пояснення до них:
Код дії
Пояснення дії
SB_ENDSCROLL
Віджата клавіша миші (кінець роботи із смугою прокрутки)
SB__LINELEFT
Зрушення вікна уздовж документа вліво (вгору) на одиницю
SB_LINERIGHT
Зрушення вікна уздовж документа управо (вниз) на одиницю
SB_PAGELEFT
Зрушення вікна уздовж документа вліво (вгору) на сторінку
SB_PAGERIGHT
Зрушення вікна уздовж документа управо (вниз) на сторінку
SBTHUMBPOSITION
Повзунок зупинився після плавного руху. Поточна позиція повзунка равна HIWORD(wParam)
SB_THUMBTRACK
Повзунок плавно рухається. Поточна позиція повзунка рівна HIWORD(wParam)
SB_TOP
Зрушення вліво (вгору) в початок документа
SB_BOTTOM
Зрушення управо (вниз) в кінець документа
2.7 Керування смугою прокрутки
Позиція nPos повзунка може набувати значень із заданого діапазона [nMin, nMax]. Найлівіша для горизонтальної смуги або сама верхня для вертикальної смуги позиції повзунка відповідають мінімальному значенню nMin. Відповідно в найправішому або самому нижньому положенні значення позиції рівне nMax.
Функції управління станом смуг прокрутки не викликають для смуг, створених третім способом. Якщо смуга прокрутки створена першим способом, то при виклику цих функцій першим аргументом вказують дескриптор смуги. Інакше першим аргументом указують дескриптор вікна, якому належить смуга перегляду. Другими аргументом завжди указують вид смуги. Допустимі значення для другого аргументу перераховані в наступній таблиці:
Значення
Вид смуги
SB_CTL
Смуга прокрутки. Першим аргументом є дескриптор смуги прокрутки
SB HORZ
Стандартна горизонтальна смуга проглядання вікна
SB_VERT
Стандартна вертикальна смуга проглядання вікна
Для встановки діапазону смуги прокрутки викликають функцію SetScroIlRange: BOOL SetScrollRange( HWND hwnd, int nBar, int nMin, int nMax, BOOL bRedraw);
Вона встановлює мінімальне і максимальне значення позиції повзунка заданої смуги прокрутки. В разі успішної установки повернуте значення відмінне від нуля.
При nMin=nMax смуга зникає. Такій ситуації потрібно уникати при управлінні станом смуг прокрутки. Аргумент bRedraw, якщо не дорівнює нулю, вказує на необхідність перемальовування смуги.
2.8 Створення списку
Списки рядків створюють на базі класу "listbox". Рядки в списку нумерує операційна система, і номер першого рядка дорівнює 0. Списки можуть бути одноколоночні і багатоколоночні, з вертикальною (для одноколоночних списків) і горизонтальною (для багатоколоночних списків) смугою перегляду. При створенні списку першим аргументом функції CreateWindow є покажчик на рядок "listbox", а третій аргумент задають за допомогою таблиці. Наприклад:
#define ID_LIST 111
hListBox = CreateWindow("listbox", NULL
WS_CHILD | WS_VISIBLE | LBS_STANDARD |
LBS_WANTKEYBOARDINPUT
30, 30, 200,100, hwnd, (HMENU) ID_LIST, hlnst, NULL);
Другий аргумент функції має бути вказаний як NULL. Додатково до стилів вікна WS_CHILD і WS_VISIBLE вказують стилі списка, імена яких мають префікс LBS_.
2.9 Вивід у вікно
Вивід у вікна володіє лавою особливостей.
Не можна користуватися функціями виведення бібліотеки компілятора,оскільки вони пристосовані для виводу в одне і єдине вікно. В операційній системі Windows додатка виводять одночасно в різні вікна. Система сама вирішує всі проблеми, пов'язані з можливим перекриттям або переміщенням цих вікон. З цим пов'язане те, що у вікно прагнуть виводити в одному місці додатки - при обробці повідомлення WM_PAINT. Додаток описують так, щоб під час вступу повідомлення WM_PAINT функція вікна могла перемальовувати все вікно або будь-яку його задану частину.
Інтерфейс графічних пристроїв (Graphics Device Interface -GDI) системи відкриває доступ до великої кількості функцій вивода. Додатки, звертаючись до функцій GDI, працюють не з фізичними пристроями виводу, а з логічними. Тобто опис вибору функцій не залежить від фізичного способу відображення. GDI передає повідомлення про вивід драйверу пристрою виводу. Драйвер працює з фізичним пристроєм і при управлінні виведенням враховує його обмежені можливості і апаратні особливості. Завдяки цьому додатки здатні працювати з будь-яким пристроєм вивода, драйвер якого встановлений в системі. У цьому розділі розглядаються функції і параметри виводу у вікно на екрані відеомонітора. Но не всі фізичні пристрої виводу здатні підтримувати ті режими, в яких працює відеомонітор. Тому, описуючи послідовність операцій виводу, наприклад на принтер, слід враховувати можливості встановленого принтера.
Параметри виводу встановлюють в контексті відображення з допомогою функцій GDI. Контекст відображення - це структура даних, яка містить характеристики пристрою виводу і покажчики на вибрані інструменти малювання. Функції GDI використовують тільки вибрані в контекст відображення параметри і інструменти малювання. Наприклад, для малювання лінії деякої товщини в контекст відображення застосування повинне вибрати перо цієї товщини.
Дескриптор контексту відображення служить першим аргументом виклику всіх функцій, пов'язаних з виводом у вікно.
2.10 Функції виведення тексту
Функція TextOut виводить символьний рядок у вказаній позиції, дотримуючи вибрані атрибути контексту відображення.
Функція TextOut оголошена таким чином: BOOL TextOut( HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cbString );
Параметри цієї функції:
nXStart задає логічну х-координату операції виводу.
nYStart задає логічну у-координату операції виводу.
lpString указує на рядок, який буде виведений.
cbString дорівнює кількості символів в рядку, що виводиться.
Функція TextOut заданий рядок виводить усередині уявного прямокутника, сформованого вічками символів строки, що виводиться. Координати nXStart і nYStart, залежно від режиму вирівнювання, визначають різні точки цього прямокутника.
Функція SetTextAlign вибирає режим вирівнювання тексту в контекст відображення: UINT SetTextAlign( HDC hdc, UINT fMode);
Параметр fMode задає режим вирівнювання і визначається при допомозі трьох груп. прапорів. Символічні імена прапорів починаються з префікса TA_.
2.11 Меню
Меню використовують для вибору команд і зміни режимів роботи додатка. Рядки меню відображають назву розділу меню або сенс пов'язаної з рядком команди. Якщо рядок пов'язаний з командою, при її виборі додаток отримує повідомлення WM_COMMAND і ідентифікатор цієї команди.
Основним елементом меню, що відображується, є рядок або графічний об'єкт. Тут розглядаються тільки рядки. Вони в текстовому вигляді відображують назви розділів або команд меню, а також клавіш швидкого доступу. Рядок може бути відмічена галочкою або іншим чином. Такий рядок використовується як прапорець або перемикач, що змінює режим роботи додатка. Якщо при виборі рядка на екрані повинна з'явитися діалогова панель, до слова справа додають багатокрапку. Заблоковані рядки меню відображують сірим кольором.
Будь-яке вікно, що перекривається або тимчасове, може мати меню. Головне меню знаходиться нижчим за заголовок вікна, і його рядки розташовані в одну або декілька ліній. При виборі рядка головного меню, як правило, активізується розділ меню. Розділом меню є тимчасове меню.
Рядки тимчасового меню розташовані в один або декілька стовбчиків. Якщо тимчасове меню може з'являтися в будь-якому місці робочої області, то воно називається плаваючим. В деяких випадках зручніше застосовувати плаваюче меню. Вони "спливають" після клацання зазвичай правої клавіші миші, і місце "спливання" неважко зв'язати з координатами курсору миші. Тоді легко вибрати потрібний рядок меню. Крім того, по координатах курсору миші можна визначити об'єкт, по зображення якого було зроблено клацання, і задати залежний від цього об'єкту набір рядків меню.
Якщо вікно має системне меню, то воно розташоване зліва від тексту заголовка вікна.
За способом створення розрізняють статичне і динамічне меню. Статичне меню створюють до запуску і не змінюють в процесі роботи додатка. Динамічне меню створюють в процесі роботи додатка. Динамічне меню після створення можна змінювати або залишити незмінним. Робота з рядками статичних і динамічних меню нічим не відрізняється. Тут розглядуються способи створення тільки динамічних меню.
2.12 Створення меню
Алгоритм створення меню в спільному випадку містить наступні кроки:
Створення порожнього меню hMenu.
Вставка елементу в меню hMenu.
Крок 2 повторюваний стільки раз, скільки елементів містить меню hMenu.
Цей алгоритм дозволяє створювати багаторівневе меню. Наприклад, елемент, що вставляється на 2-му кроці, може вказувати на вже створене тимчасове меню. Причому будь-який елемент останнього також може вказувати на тимчасове меню.
Меню спочатку створюють тільки в пам'яті. Існують функції, котрі операційній системі вказують, яке меню створене, якому вікну воно належить і коли його відображувати. Розгленемо ці функції.
Функція CreateMenu створює порожнє головне меню вікна: HMENU CreateMenu(VOID);
В разі успішного виконання функція CreateMenu повертає дескриптор створеного головного меню, інакше - NULL.
Функція CreatePopupMenu створює порожнє тимчасове меню: HMENU CreatePopupMenu(VOID);
В разі успішного виконання функція CreatePopupMenu повертає дескриптор створеного тимчасового меню, інакше - NULL.
Функція SetMenu підключає головне меню hMenu до вікна hwnd: BOOL SetMenu(HWND hwnd, HMENU hMenu);
Вона видаляє попереднє меню, але не руйнує його. Якщо ж hMenu= NULL, то тільки віддаляється головне меню. В разі успішного підключення функція повертає ненульове значення.
Після змін в меню, незалежно від стану вікна hwnd, для перемальовування смуги меню потрібно викликати функцію DrawMenuBar: void WINAPI DrawMenuBar(HWND hwnd);
Вона перемальовувала смугу меню вікна hwnd.
Таким чином, алгоритм підключення головного меню до вікна і відображення смуги меню містить наступні кроки:
Створення головного меню. Цей крок повністю збігається з алгоритмом створення меню.
Підключення головного меню до вікна.
Перемальовування смуги меню вікна.
Після цього роботу з меню забезпечує операційна система.
Додаток в створене меню може вставляти нові елементи або видаляти старі, а також може змінювати або спитає поточне становище будь-якого елементу.
2.13 Вставка елементів в меню
Функція InsertMenuItem вставляє елемент в меню hMenu: BOOL insertMenultem(HMENU hMenu, UINT ultem
BOOL ffiyPosition, LPMENUITEMINFO lpmii);
Значення аргументу uItem залежить від значення fflyPosition. При fByPosition=FALSE значення uItem дорівнює ідентифікатору команди елементу, що вставляється, інакше - позиції того елементу в меню, перед яким потрібно вставити новий елемент. Якщо меню містить n елементи і потрібно вставити новий елемент останнім, то номер позиції прирівнюють n (n=0, 1, 2 . ..).
Параметр lpmii вказує на структуру типа MENUITEMINFO, яка вже містить інформацію про елемент, що вставляється.
В разі успішної вставки елементу функція повертає ненульове значення.
2.14 Видалення елементів з меню
Функція DeleteMenu видаляє елемент з меню і звільняє всі пов'язані з ним ресурси. Якщо елемент, що видаляється, указує на тимчасове меню, то функція DeleteMenu видаляє і це тимчасове меню. Прототип функції: BOOL DeleteMenu( HMENU hMenu, UINT uPosition, UINT uFlags);
Параметри:
hMenu - дескриптор змінного меню.
uPosition визначає елемент, що видаляється. Його значення зв'язане з значенням параметра uFlags.
uFIags задає спосіб тлумачення параметра uPosition. Якщоuflags=mf_bycommand (значення за умовчанням), то значення uPosition дорівнює ідентифікатору команди елементу, що видаляється. Якщо ж uFlags=MF_BYPOSITION, те значення uPosition рівне позиції удаленого елементу в меню. В разі успішного видалення функція повертає ненульове значення.
Функція RemoveMenu видаляє елемент з меню, не руйнуючи зв’язані з ним ресурси. Ці ресурси можна використовувати надалі. Прототип функції: BOOL RemoveMenu( HMENU hMenu, UINT uPosition, UINT uFlags);
Параметри функції RemoveMenu подібні до параметрів функції DeleteMenu. B випадку успішного видалення елементу RemoveMenu возвращает ненульове значення.
Для руйнування меню викликають функцію DestroyMenu: BOOL DestroyMenu( HMENU hMenu);
Ця функція руйнує задане меню і звільняє ресурси, які меню займає. Цю функцію вікна викликають для руйнування тих меню, які вони створили, але не підключили до себе. Підключені Меню автоматично руйнуються при руйнуванні вікна.
В разі успішного руйнування функція повертає ненульове значення.
Повідомлення WM_INITMENU
Повідомлення WM_INITMENU поступає перед відображенням головного меню. Параметр wParam дорівнює дескриптору меню. Якщо повідомлення WM_INITMENU обробляють, то повертають 0. Обробка зазвичай зводиться до зміни стану елементів меню.
Повідомлення WM_INITMENUPOPUP
Це повідомлення поступає перед відображенням тимчасового меню.
Параметр wParam дорівнює дескриптору меню. Молодше слово параметра lParam дорівнює позиції цього меню в меню верхнього рівня, старше слово lParam дорівнює 1 для системного меню і 0 - для звичайного. Якщо це повідомлення обробляють, то повертають 0. Обробка зазвичай зводиться до зміни стану елементів меню.
Повідомлення WM_COMMAND
Це повідомлення поступає після вибору рядка меню. Молодше слово параметра wParam дорівнює ідентифікатору вибраної команди, а старше слово дорівнює 0. Після обробки повідомлення повертають 0.
Повідомлення WM_MENUSELECT
Повідомлення WM_MENUSELECT поступає в процесі переміщення курсору меню по рядках меню. Молодше слово параметра wParam рівно ідентифікатору команди або позиції рядка (якщо при виборі рядка відображується тимчасове меню), а старше слово містить ті, флажки що складаються елементів меню з наступної таблиці:
Значення
Стан елементу
MF CHECKED
Відмічений
MF DISABLED
Заблокований
MF GRAYED
Недоступний
MF HILITE
Висвічений
MF MOUSESELECT
Вибраний мишею
MF POPUP
Відкриває тимчасове меню
MF_SYSMENU
Належить системному меню вікна. Параметр LParam містить дескриптор цього меню
Якщо старше слово wParam містить 0xFFFF і lParam=NULL, то Windows закрив меню. Параметр lParam містить дескриптор меню, по якому переміщається курсор.
Якщо це повідомлення обробляють, то повертають 0.
2.15 Акселератори
Для швидкого доступу до команд використовують акселератори. Їх інколи називають "клавішами швидкого виклику" команд меню. Дійсно ж акселератори можуть бути пов'язані з будь-якими командами.
Під час вступу повідомлення WM_COMMAND від акселератора молодше слово параметра wParam містить ідентифікатор зв'язаною з акселератором команди, а старше слово wParam дорівнює 1.
Операційна система широко використовує акселератори. Наприклад, стандартне системне меню практично будь-якого вікна містить рядок "Закрить AIt+F4" і команда цього рядка пов'язана з акселератором Alt+F4. Тобто одночасне натиснення клавіш Alt і F4 рівноцінно вибору рядка "Закрить Alt+F4" системного меню активного вікна.
Додаток всі використовувані акселератори повинно записати в одну таблицю і працювати з дескриптором цієї таблиці. Для роботи з таблицею існує декілька функцій.
Функція CreateAcceleratorTable створює таблицю акселераторів: HACCEL CreateAcceleratorTabie( LPACCEL lpaccl, int cEntries ); Тут lpaccl - покажчик на масив структур типа ACCEL, який містить описи акселераторів, а cEntries - кількість структур в масиві lpaccl. B випадку успішного створення функція повертає дескриптор створеної таблиці, інакше - NULL.
Кожну створену функцією CreateAcceleratorTable таблицю потрібно руйнувати до завершення роботи додатка. Для цього викликають функцію DestroyAcceleratorTable.
3. Алгоритм розв'язування задачі
4.1 Призначення програми
Програма призначена для відкриття, редагування, створення текстових файлів. Програма демонстративно може використовуватись у школах, інститутах при вивченні даного матеріалу.
Мови програмування, на яких написана програма
Програма написана на мові програмування С. Вибір даної мови зумовлений завданням проекту.
Мова C була створена на початку 70-х рр. Денісом Рітчі, який працював в компанії Bell Telephone Laboratories. C була розроблена як мова для програмування операційної системи Unix. З того часу мова пройшла великий шлях розвитку, і на сьогоднішній день існує понад 17 різних компіляторів мови C.
В лютому 1987 р. фірма Borland International заявила про створення компілятора Turbo C, який став одним з найкращих компіляторів того часу.
Програмні засоби, необхідні для реалізації програми
Для нормальної роботи програми необхідні самі мінімальні потреби: кольоровий монітор з підтримкою текстового режиму, при збереженні результатів на диску повинне бути вільне місце і диск не повинен бути захищений від запису; маніпулятор типу „миша” та клавіатура – для управління програмою; процесор від 100 Hz; оперативна пам’ять – від 64 К.
Технічні засоби, необхідні для реалізації програми
Нормальну роботу програми забезпечує операційна система Windows. Перед запуском програми в оперативну пам’ять повинен бути завантажений драйвер маніпулятора „миші” (інакше управління програмою за