31244-1 (Borland C++ для Windows), страница 3
Описание файла
Документ из архива "Borland C++ для Windows", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "рефераты, доклады и презентации", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "31244-1"
Текст 3 страницы из документа "31244-1"
Обратите внимание! Сама функция 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
1. Запустите компилятор. Для этого активизируйте пиктограмму Borland C ++.
2. Выполните команду Project|New project.
3. Как было описано ранее, выберите имя и путь к создаваемому проекту.
4. Выберите Advanced в диалоге New project. Затем в появившейся панели снимите флажок def и установите флажок rc. Завершите создание проекта нажатием OK.
5. В результате Ваших действий должно появиться окно проекта, содержащее два файла: один с расширением .cpp, другой - с расширением .rc, являющийся файлом ресурсов создаваемого проекта.
6. Теперь можно приступить к созданию ресурсов нашего приложения, а именно, меню. В результате проделанной работы Вы должны будете получить меню Size и два его пункта - Large и Small. Они понадобятся нам в программе, которая будет выводить геометрические фигуры разных размеров по желанию пользователя.
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 на вопрос о необходимости создания файла.
9. Теперь можно приступить к созданию меню нашего приложения. Для этого выполните следующее:
1) Выполните команду Resource|New из меню редактора ресурсов.
2) В списке возможных типов ресурсов панели New resource выберите MENU.
Убедитесь, что поле Place identifiers in указывает на файл с расширением .rh. Поле Place resource in должно всегда указывать на Ваш rc-файл. Нажмите OK и Workshop приступит к созданию меню.
3) После проделанных шагов Вы должны увидеть следующее:
Появившееся окно представляет собой редактор меню. В заголовке Вы видите название созданного меню 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 для управления выводом на экран фигур разного размера.
Прежде, чем приводить текст программы покажем, что же мы получили в результате манипуляций над 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, облегчающих диалог с приложением.
Первый компонент - это линейка прокрутки. Она может быть расположена в окне приложения и представляет собой вертикальную или горизонтальную полосу с ползунком. Ползунок можно передвинуть, зацепив его указателем мыши и перетащив вдоль полосы прокрутки.
Линейка создается как объект класса TScrollBar в конструкторе окна приложения. Конструктору TScrollBar передаются координаты и размеры создаваемой линейки, а так же тип линейки - горизонтальная или вертикальная.
Покажем, как использовать в приложении вертикальную линейку прокрутки.
Во время перемещения ползунка вертикальная линейка генерирует уведомляющие сообщения WM_VSCROLL. Вы можете перехватить и обработать эти сообщения, объявив в классе-владельце такой линейки функцию отклика EvVScroll и дополнив таблицу отклика класса макросом EV_WM_VSCROLL. Функция будет вызываться при изменении положения ползунка на линейке.