Docsity
Docsity

Подготовься к экзаменам
Подготовься к экзаменам

Учись благодаря многочисленным ресурсам, которые есть на Docsity


Получи баллы для скачивания
Получи баллы для скачивания

Заработай баллы, помогая другим студентам, или приобретай их по тарифом Премиум


Руководства и советы
Руководства и советы

Borland C++ для Windows реферат по информатике , Сочинения из Информатика

Borland C++ для Windows реферат по информатике

Вид: Сочинения

2016/2017

Загружен 11.04.2017

refbank12258
refbank12258 🇷🇺

5

(1)

10 документы

1 / 30

Toggle sidebar

Сопутствующие документы


Частичный предварительный просмотр текста

Скачай Borland C++ для Windows реферат по информатике и еще Сочинения в формате PDF Информатика только на Docsity! ПРОГРАММИРОВАНИЕ ДЛЯ WINDOWS НА BORLAND C++ 1. Введение Цель данного пособия - облегчить усвоение программирования для Windows на BORLAND C++ и способствовать распространению библиотеки OWL (Object Windows Library), которая хорошо продумана и использование которой явно вырисовывает достоинства объектно- ориентированного программирования - инкапсуляции, наследования и полиморфизма. Пособие привязано к лекционному курсу “Технология программирования”, требуя знаний изложенных на лекциях основ объектно-ориентированного программирования на C++ и предназначено как руководство к лабораторным работам по этому лекционному курсу. Пособие ориентировано на пошаговую разработку за компьютером несложных Windows- приложений, в процессе которой осуществляется их исследование путем сравнения различных вариантов реализации, изменения параметров членов-функций и значений членов-данных используемых классов. В создаваемых Windows-приложениях используется очень незначительная, но базовая часть OWL библиотеки, активное усвоение которой способствует снятию барьера, и, как надеются авторы, вызовет удовольствие от первого знакомства с завоевавшей мир Windows. 1.1. Ввод, редактирование и запуск Windows-приложения Чтобы ввести исходный текст программы, откомпилировать и увидеть на экране окно Windows-приложения, необходимо выполнить следующие действия: 1) Сделайте двойной щелчок левой клавиши мыши (или нажатие ENTER) на пиктограмме Borland C++. Появится окно компилятора BC4. 2) Щелчок левой клавиши мыши на элементе меню Project (или переход в строку меню путем нажатия F10, поиск и высвечивание элемента Project с помощью клавиш F 0A C и F 0 A E. Раскрыть Project с помощью клавиши ENTER). 3) Щелчок мышью на команде New project (или выбрать данный пункт меню с помощью клавиш F 0A D и F 0 A F и нажать ENTER). В дальнейшем для краткости будем говорить, что нужно выполнить команду Project|New project (команду New project из меню Project). Таким образом, будет выполнена команда создания нового проекта и на экране появится следующий диалог. 4) Щелчок мышью на кнопке Browse для просмотра каталога. 5) Воспользовавшись линейкой прокрутки, найти имя требуемого каталога и сделать на нем двойной щелчок левой клавиши мыши. 6) В поле File Name ввести имя проекта с расширением .ide, затем нажать ENTER. 7) Нажмите кнопку Advanced и снимите флажки rc и def в появившемся диалоге Advanced Options, затем нажмите OK. 8) В диалоге создания проекта нажмите кнопку OK. 9) Сделайте двойной щелчок левой кнопкой мыши на имени файла с расширением cpp в окне созданного проекта, в результате чего откроется окно для редактирования текста программы. 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 !”. Окно также содержит кнопки минимизации и максимизации, а также системное меню приложения. 2.1. Создание объекта приложения внутри функции OwlMain При написании программы будем работать с классом TApplication и функцией OwlMain. В данном варианте программы объект класса TApplication создается внутри функции OwlMain. 2.1.1. Исходный текст приложения #include <owl\applicat.h> Включаемый заголовочный файл owl\framewin.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 панель исчезает, а приложение будет ждать нового нажатия на клавиши мыши. Нижеследующее приложение откликается на щелчки левой кнопки мыши, выводя в рабочей зоне окна координаты указателя мыши в голубом цвете. 5.1.1. Исходный текст программы #include <owl\applicat.h> #include <owl\framewin.h> #include <owl\dc.h> 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. Пояснение к программе Заголовочный файл owl\dc.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 <stdlib.h> 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 <owl\applicat.h> #include <owl\framewin.h> #include <owl\dc.h> 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() { 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 для управления выводом на экран фигур разного размера. Прежде, чем приводить текст программы покажем, что же мы получили в результате манипуляций над 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 <owl\applicat.h> #include <owl\framewin.h> #include <owl\dc.h> #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::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. Пояснения к программе Заголовочный файл owl\scrollba.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 <owl\applicat.h> #include <owl\framewin.h> #include <owl\button.h> #include <owl\dc.h> #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. Пояснения к программе Заголовочный файл owl\button.h содержит описание класса TButton и его членов. В начало программы помещены директивы #define CM_BUTTON1 100 #define CM_BUTTON2 200, определяющие константные идентификаторы сообщений, которые будут посылаться программе кнопками в ответ на щелчки мышью. CM_BUTTON1 генерируется первой кнопкой, CM_BUTTON2 - второй. Можно выбрать другие имена сообщений, отличные от CM_BUTTONn и значения констант, отличные от приведенных в программе, но для того, чтобы программа правильно реагировала на сообщения кнопок, необходимо правильно заполнить таблицу реакций, передав в качестве аргументов макросам таблицы имена констант и имена функций отклика. Конструктор прикладного окна создает с помощью оператора new две кнопки, передавая им в качестве аргументов идентификатор окна, идентификатор уведомляющего сообщения, которое будет генерировать кнопка, текст надписи на кнопке и координаты размещения кнопки в окне приложения. Обратите внимание на то, что адреса созданных объектов-кнопок не присваиваются указателям. Этого не требуется делать потому, что в программе нет необходимости ссылаться на эти объекты. Функции отклика на сообщения кнопок CmButton1 и CmButton2 изменяют признак цвета геометрических фигур и объявляют о необходимости перерисовки окна приложения. Таблица отклика конструируется так же, как это делалось при использовании меню. Она содержит идентификаторы уведомляющих сообщений, приходящих от кнопок и имена функций класса прикладного окна, отвечающих за обработку данных сообщений. 8.2.3. Задание. текст в элементе редактирования, а затем нажать на кнопку. В результате все изменения в редакторе будут отображены в окне приложения. 9.1.3. Задание 1) Создайте и исследуйте приложение. 2) Поместите в окно приложения еще одну панель редактирования. После нажатия на кнопку приложение должно выводить в свое окно строки из первой и второй панели редактирования. 9.2. Использование многострочного текстового редактора для ввода и редактирования текста. Нижеприведенное Windows-приложение использует многострочную панель редактирования текста. 9.2.1. Исходный текст программы #include <owl\applicat.h> #include <owl\framewin.h> #include <owl\edit.h> #include <owl\button.h> #include <owl\dc.h> #define ID_MULTILINER 150 #define CM_BUTTON 160 class TMyWin: public TFrameWindow { TEdit *multiLiner; char *txt; public: TMyWin(): TFrameWindow(0,"the TEdit object") { - multiLiner=new TEdit(this,ID_MULTILINER,"Input lines",10,10,200,100,0,TRUE); - new TButton(this,CM_BUTTON,"Update",10,130,70,25); } 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() { Invalidate(); //UpdateWindow(); } void TMyWin::Paint(TDC& dc,BOOL,TRect&) { - for (int i=1;i<=multiLiner->GetNumLines();i++) - { - int lineLength= multiLiner->GetLineLength(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, используемых в пособии 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
Docsity logo