Черкасова Н. И. Ч48 Операционные системы: Пособие по выполнению курсовой работы




Скачать 418.08 Kb.
НазваниеЧеркасова Н. И. Ч48 Операционные системы: Пособие по выполнению курсовой работы
страница3/4
ТипРеферат
rykovodstvo.ru > Руководство эксплуатация > Реферат
1   2   3   4
5.5. Структура OWL-программы

OWL-программа как правило состоит из трех выделенных частей:

  1. описания главной функции OwlMain();

  2. описания класса приложения и входящих в него функций;

  3. описания класса главного окна приложения и входящих в него функций.

Главная функция OwlMain() берет на себя управление при запуске приложения, заменяет функцию WinMain() в «классических» приложениях Windows и main() в приложениях DOS.

Функция OwlMain() в качестве параметров получает два аргумента: значение типа int и массив указателей на char. Эти параметры обеспечивают связь программы с командной строкой. Первый параметр указывает количество параметров командной строки, массив указателей представляет сами строковые параметры. Функция возвращает значение типа – результат выполнения приложения (успешное завершение или нет ). Заголовок:

int OwlMain (int argc, char* argv[ ] )

Функция выполняет две основные обязанности:

  1. создает объект приложения класса TApplication или производного от него;

  2. вызывает функцию – элемент Run этого объекта.

Так как библиотека OWL содержит описания классов для реализации практически всех средств Windows, то задача программиста заключается в подборе библиотечных классов для реализации всех свойств приложения и создания на базе библиотечных классов производных, в которых библиотечные функции–члены могут при надобности модифицироваться (замещаться). Во многих случаях библиотечные функции не требуют модификации и тогда используются сами библиотечные классы, создаются их объекты и вызываются для них соответствующие компонентные функции.

Для создания приложения (экземпляра класса) используется класс приложений TApplication производный от класса TModule. Функции этого класса организуют создание главного окна и обрабатывают сообщения.

Базовый класс TModule определяет фундаментальные свойства модулей – приложений и библиотек с исполняемым кодом.

Объект Tapplication – это определение функций и данных приложения, которые без OWL определялись бы глобально.

Класс TApplication имеет два конструктора. Простейший из них:

TApplication(const char*name=0, TModule*& gModule=::Module);

Назначение его - создание нового объекта с именем name. Первому параметру надо передать имя приложения, при создании объекта, второй параметр - это ссылка на адрес приложения (для поиска и, как правило, для второго параметра используется умалчиваемое значение).

TApplication app ( “ Appname”);

TApplication * Papp = new TApplication ( “ Appname1”);

TApplication app1 ; // создается приложение без имени

Таким образом, самое короткое приложение:

int OwlMain (int argc, char* argv[ ] )

{ return TApplication( “ Appname”).Run();}

создает стандартное главное окно (окно по умолчанию), фактически интерфейс приложения.

Приложение и окно – это не одно и тоже. Для задания характеристик и свойств окна приложения нужно вмешиваться в работу функции Run() – компонентной функции класса TApplication. Необходимо создать производный класс приложения от класса Tapplication.

Рассмотрим функцию Run (). Основной задачей этой функции является последовательный вызов других функций, принадлежащих классу TApplication и классу TWindow. Во-первых, эта функция инициализирует приложение, вызывая InitApplication() для первого экземпляра приложения и InitInstance() для всех экземпляров. Во-вторых, если инициализация прошла успешно, вызывается функция MessageLoop() для инициализации цикла обработки сообщений.

Функция InitApplication() вызывается только для первого экземпляра приложения, не выполняет никакой полезной работы, это функция - заглушка, которую можно заместить в прикладном классе функцией с тем же именем, в которую, например, включен запрет для запуска последующих экземпляров данного приложения.

Функция InitInstance() вызывается для всех экземпляров и выполняет чрезвычайно нужные действия. Она вызывает компонентную функцию InitMainWindow(), которая создает новый объект класса TFrameWindow, определяющий характеристики главного окна.

После создания объекта класса TFrameWindow можно обращаться к компонентным функциям этого класса, что и делает функция InitMainWindow(). Она вызывает функции TWindow::Creat() и ShowWindow(), выполняющие создание и показ окна и вызывает компонентную функцию SetMainWindow() , которая объявляет новое окно главным.

Именно на этом этапе можно изменить расположение, размеры и стиль окна. Так как при создании объекта класса TApplication создается объект TFrameWindow - чистое ни к чему не пригодное окно с рамкой, необходимо создать от TframeWindow новый класс и объекты собственного класса (собственные окна).

Класс TFrameWindow является проводным от класса Twindow и наследует огромное количество функций, обеспечивающих общие черты поведения окон, например, функция SetBkgndColor() устанавливает цвет фона окна:

void SetBkgndColor(const Tcolor & color).

Помимо функций в класс TWindow входит ряд данных с элементами, определяющими атрибуты окна: стиль, координаты, размеры.

При описании конструктора производного класса, как правило, вызывается конструктор базового класса.

Прототип конструктора:

TFrameWindow ( TWindow*parent , const char far*title , …).

Первый параметр необходим для задания типа окна на предмет, есть ли у него родители, т.е. если это окно главное, то родителей у него нет и надо передавать 0. Второй параметр позволяет передавать заголовок окна.

Итак, опишем производный класс:

class MyWindow : public TFrameWindow {

public:

MyWindow ( TWindow*parent , const char far*title) :

TFrameWindow ( parent , title) {

SetBkgndColor(COLOR_WINDOWFRAME+1); // задаем цвет окна

Attr.X=100; Attr.Y=100 // задаем координаты окна

Attr.W=250; Attr.H=60 // задаем размеры окна

} // закрываем конструктор

};

Теперь необходимо создать производный класс от TApplication, в котором переопределить (заместить) компонентную функцию класса TApplication - InitMainWindow(), так чтобы она создавала объект не класса TFrameWindow , а нашего производного класса окна MyWindow и объявляла это окно главным:

class myapp : public TApplication {

public:

virtual void InitMainWindow() ;// замещаем функцию в //производном классе

}; // слово virtual можно опустить

void myapp :: InitMainWindow(){

MainWindow = new MyWindow (0, “имя окна приложения“);

}

Здесь MainWindow указатель типа TframeWindow*, объявленный в Tapplication.

Программирование с таблицей отклика

Важным элементом любого приложения Windows является меню, которое позволяет, с помощью выбора пункта меню выполнять определенные действия. Выше было описано создание файла сценария ресурса, в том числе и меню. Однако для того чтобы программа получила от Windows сообщение для выполнения указанного в меню действия, необходимо эти действия в программе прописать. В этом случае используется программирование с таблицей отклика, которая и указывает на функцию класса, вызываемую для выполнения действия.

Для обработки сообщений Windows необходимо в программе предусмотреть следующие действия элемента:

1.Объявление в классе главного окна таблицы отклика (макрос DECLARE_RESPONSE_TABLE с именем конкретного класса в качестве параметра).

2.Сама таблица откликов (макросы DEFINE_RESPONSE_TABLEх и END_RESPONSE_TABLE, а также помещаемые между ними макросы, определяющие конкретные действия).

3.Набор функций, обрабатывающих по заданным алгоритмам описанные в таблице откликов сообщения Windows.

Таблица откликов помещается в любом месте программы, но обязательно в исходном файле. Х – определяет число базовых классов в списке наследования, которые также имеют таблицы отклика, т.е. в объявлении используется макрос DECLARE_RESPONSE_TABLE. Для связи команд меню с функциями предусмотрен макрос EV_COMMAND (EV означает Event - событие). Его параметрами являются – идентификатор команды меню и имя выполняемой функции.

Также необходимо прикрепить (загрузить) ресурс меню в исходный текст программы, что осуществляется с использованием функции AssignMenu (идентификатор меню) в конструкторе класса главного окна.

Следует отметить, что для всех типов ресурсов, кроме создания файла ресурса, требуется выполнить следующие операции:

  1. загрузить с использованием соответствующей ресурсу функцией требуемый ресурс, где параметром функции является идентификатор ресурса;

  2. вызвать обработку ресурса явно или через сообщения Windows с использованием макросов или определенных для данного ресурса функций.

Создание меню приложения представлено в примере КР.

Таким образом, для разработки приложения необходимо выполнить прежде всего действия, описанные ниже.

  • Определить функцию OwlMain(). Внутри функции создается объект приложения класса, производного от Tapplication, и вызывается функция Run(), которая вызывает приведенные выше виртуальные функции для создания объекта.

  • Определить собственный класс приложения, производного от TApplication, в котором следует дать прототипы функций-замещений.

  • Определить класс главного окна приложения, производного от класса окна с рамкой (TFrameWindow). В случае необходимости можно задать параметры окна.

  • Переопределить (в случае необходимости) виртуальные функции класса TApplication.

  • Назначить типовые ресурсы главного окна.

  • Назначить дополнительные ресурсы.

Следует отметить, что подобные действия, хотя и являются обязательными, позволяют создать лишь каркас приложения, фактически конструируя его интерфейс. Для выполнения приложением конкретных задач необходимо сконструировать необходимые функции и разработать соответствующие классы, выполняющие требуемые действия.
5.6. Интерфейс графических устройств GDI. Обработка сообщений WM_PAINT

Ключевым моментом в программировании в Windows является изучение инструментария GDI. Графика дает немедленную визуальную обратную связь для событий, происходящих в программе. Кроме того, в Windows все визуальные элементы, даже текстовые, отображаются графически. Недостаточно только разработать и нарисовать графику программы. Необходимо сформировать код, который может рисовать и перерисовывать выводимую графику по сообщению.

“Графический интерфейс устройства ” (Graphics Device Interface, GDI) – совокупность программных средств Windows, организующих вывод на различные устройства вывода и, прежде всего, на экран, на устройство печати и в файлы всего многообразия графических объектов: текстовых строк, геометрических фигур, растровых изображений. Графическая библиотека GDI предоставляет программисту большое количество функций для построения изображений, для управления режимами вывода, для создания инструментов рисования (кисти, перья, шрифты, палитры).

Однако для успешной работы в приложении недостаточно знать совокупность этих функций, надо знать еще принципы динамического взаимодействия системы с приложением при формировании экранного кадра. Системным средством взаимодействия такого рода является сообщение WM_PAINT (имя сообщения).

Ранее были описаны принципы создания приложения с главным окном и прикрепленным меню. Но чтобы вывести что-то в это окно, надо обработать сообщение WM_PAINT, используя инструменты GDI.

Общее правило рисования заключается в том, что вывод в окно приложения любых графических объектов должен выполняться исключительно в процедуре обработки сообщения WM_PAINT. Только в этом случае содержимое окна не будет теряться при заслонении его другими приложениями.

Обработка сообщения WM_PAINT связана с использованием важнейшего поля данных Windows, называемого контекстом устройства.

Контекст устройства представляет собой некоторый системный ресурс, представляющий связывающее звено между программным кодом и областью рисования. Режимы рисования и характеристики используемых инструментов приложение получает и возможно изменяет их через контекст устройства, т.е. в Windows нет функций вывода непосредственно на устройство – экран, принтер и др. Весь вывод осуществляется с помощью специальной системной структуры или системного ресурса, носящего название контекста устройства. В зависимости от того, в какой области мы хотим рисовать, вывод осуществляется тем или иным контекстом (контекстом рабочей части окна, контекстом всего окна, контекстом экрана, контекстом принтера и т.д.).

Контекст устройства относится к числу системных ресурсов, количество которых в системе ограничено, а работа с такими ресурсами протекает одинаково: сначала надо получить у системы требуемый ресурс, но, закончив с ним работу, – вернуть системе. Таким образом, для того чтобы вывести в окно некоторое изображение, необходимо выполнить следующие действия. Последовательность которых, в сущности, определяется алгоритмом обработки сообщения WM_PAINT для данного приложения:

1) получить у системы контекст устройства для данного приложения (для вывода в окне приложения);

2) изменить при необходимости режимы рисования или характеристики конкретных инструментов;

3) сформировать с помощью графических функций GDI изображение;

4) вернуть Windows занятый у нее контекст устройства.

Библиотека классов OWL обеспечивает поддержку Графического интерфейса Windows (GDI), основанную на классах, наследуемых от базового класса TGDIBase.

Иерархия классов идет по двум главным ветвям: производные классы контекста устройства и производные классы графических объектов.

Классы контекста устройства

TDC - базовый класс контекста устройства;

TWidowDC - доступ (рисование) к целому окну;

TScreenDC - доступ ко всему экрану;

TDesktopDC - рисование на рабочем столе;

TClientDC - рисование в области клиента;

TPaintDC - рисование в окне приложения в ответ на сообщение WM_PAINT, в функции Paint();

TMemoryDC - поддерживает операции GDI с памятью;

TPrintDC - доступ к принтеру;

и т. д.

Контекст устройства - связывающее звено между программным кодом и областью рисования. Надо позаботиться о взаимодействии программы с контекстом устройства. Для этого необходимо создать объект одного из классов контекста устройства и вызывать для этого объекта графические функции GDI, инкапсулированные в данном классе.

Наибольший интерес, безусловно, представляет класс TDC. Это очень большой класс. Все функции GDI имеют соответствующий метод в этом классе, функции, обеспечивающие вывод на экран текстов, фигур и других изображений, создание, выбор и настройку инструментов рисования (графических объектов-перьев, кистей, красок). Класс включает также дескрипторы всех графических объектов. Все производные классы контекста наследуют эти функции.

Примеры вызовов функций для рисования фигур (пусть dc- объект контекста ):

dc.MoveTo(10,20); //установить указатель в точку

dc.LineTo(50,60); //рисование линии

dc.Rectangle(rect) //рисование прямоугольника

dc. FillRect(rect, brush) // рисование прямоугольника с заливкой

dc.Ellipse(rect) //рисование эллипса

dc.TextOut(point, “stroka”) // вывод текста

Рассмотрим более подробно, как происходит обработка сообщения WM_PAINT для OWL-приложений.

Класс TWindow содержит виртуальную функцию Paint (), которую наследует класс TFrameWindow. Эта функция является функцией-заглушкой, в ее определении нет ни одной строки. Эта функция служит для обработки сообщений WM_PAINT. Заместив ее в производном классе разумным содержанием, мы получаем возможность обрабатывать события WM_PAINT. Задача программиста сводится к описанию в замещенной функции Paint() вызовов нужных функций GDI для объекта класса TDC.

Прототип функции-заглушки:

virtual void Paint ( TDC & dc, bool erase, TRect& rect ).

Первый аргумент функции типа ссылки на базовый класс, ему передается объект производного класса TРaintDC (в соответствии с механизмом виртуальных функций).

Второй параметр типа bool – логического типа (введен логический тип 2 байта - в Win16 и 4 байта - в Win32) – флаг стирания фона окна, по умолчанию равен нулю, что означает автоматическое перерисовывание фона окна программами Windows.

Рабочая область передается через параметр rect, который имеет тип Trect - это структура Windows, содержащая координаты прямоугольной области, которая в OWL преобразована в класс. Для создания графических объектов в Paint() используются классы положения и размера, цвета, графических объектов и т.д.

Пример.

void MyWindow::Paint ( TDC& dc , bool , TRect& )

{ TBrush brush(TColor::Black,HS_BDIAGONAL);

TRect rect(10,10, 100, 100);

dc.FillRect(rect, brush);

//TPen pen ( TColor::White, 20);

dc.SelectObject(TPen ( TColor::LtRed, 5));

dc.Rectangle( 180,180,200,200);

dc.SelectObject(TPen ( TColor::LtRed, 1,PS_DASHDOTDOT));

TRect rect1(20, 20, 80, 80);

dc.Ellipse(rect1);

dc.SelectObject(TPen ( TColor::LtYellow, 5));

rect1+=TSize(20,0);

dc.Ellipse(rect1);

dc.RestoreObjects();// восстановление всего контекста

}

Следует отметить особенности вывода битовых матриц в Windows. Нет функций непосредственного вывода растровых изображений на экран (даже через контекст окна). Можно копировать изображения с одного устройства на другое устройство, используя соответствующие контексты. Функции BitBlt() - для копирования без изменения масштаба и StretchBlt() – для копирования с уменьшением или с увеличением. Устройство приемник – окно, псевдоустройство источник – участок оперативной памяти по своим возможностям, совместимым с экраном. Сначала надо поместить изображение на псевдоустройство, с ним связан контекст класса TMemoryDC , а затем скопировать его в окно. Поэтому в программе битовая матрица сначала помещается в контекст устройства памяти, а лишь затем в окно. Необходимо в обязательном порядке удалить объект битовой матрицы, что и сделано с явным объявлением деструктора в классе главного окна.

Для проверки правильности вводимых значений в конструкторах классов диалога создаются следующие объекты - объект класса TEdit ( в качестве параметров конструктора: указатель на класс диалогового окна, идентификатор поля ввода и длина передаваемой через буфер строки) и объект класса фильтра контроля TFilterValidator, позволяющий вводить только цифры.
6.Примерное содержание курсовой работы

6.1.Техническое задание

Разработать приложение, выводящее в окно графики стандартных функций.

В меню ввести следующие пункты: «О программе», «Выход», «Ввод размеров осей координат», «Очистка», пункт меню, изменяющий цвет графиков, а также создать объект плавающего меню, в котором можно выбрать масштаб вывода графиков. Создать собственную иконку и курсор для приложения, а также выполнение пунктов меню с помощью “горячих” клавиш.
6.2. Исходный код приложения

Текст файла .cpp
#include

#include "kr.h"

#include

#include

#include

#include

#include

#include
typedef struct{char X[10]; char Y[10];} CharConst; //структура буфера обмена

CharConst Const; //структурная переменная для буфера обмена

const dx=50; //шаг по осям координат

char title1[]="sin X";

char title2[]="cos X";

char title3[]="|x|";
enum COLOR{RED=CM_RED,BLUE=CM_BLUE,GREEN=CM_GREEN,BLACK=CM_BLACK,

MAGENTA=CM_MAGENTA}color;
//Класс MyApp приложения производный от TApplication

class MyApp:public TApplication

{

public:

void InitMainWindow(); //Замещаем функцию InitMainWindow

};
//Класс MyWindow главного окна производный от TFrameWindow

class MyWindow:public TFrameWindow

{

double sine[930],cosine[930];

bool sinIs,cosIs,line; //индикаторы наличия данных для графиков

int k; //переменная масштаба графиков

TMenu* menu; //Объявляем указатель на объект основного меню

TPopupMenu popupMenu; //создаем объект плавающего меню

virtual void SetupWindow(); //замещаем функции

virtual void CleanupWindow();

void Paint(TDC&,bool,TRect&); //определяем функцию Paint

void CmInput(); //функции

void CmClean();

void CmAbout(); //для откликов

void CmSin(); //на пункты основного

void CmCos(); //меню

void CmLine();

void Cm200(); //на пункты

void Cm100(); //плавающего

void Cm50(); //меню

void CmRed();

void CmBlue();

void CmGreen();

void CmBlack();

void CmMagenta();

void CmRead();

void EvRButtonDown(UINT,TPoint&);

public:

MyWindow(TWindow*parent, const char far* title); //конструктор

DECLARE_RESPONSE_TABLE(MyWindow); //объявляем

};

DEFINE_RESPONSE_TABLE1(MyWindow, TFrameWindow) //описываем табл откликов

EV_COMMAND(CM_INPUT,CmInput), //макросы

EV_COMMAND(CM_CLEAN,CmClean),

EV_COMMAND(CM_ABOUT,CmAbout),

EV_COMMAND(CM_SIN,CmSin),

EV_COMMAND(CM_COS,CmCos),

EV_COMMAND(CM_LINE,CmLine),

EV_COMMAND(CM_200,Cm200),

EV_COMMAND(CM_100,Cm100),

EV_COMMAND(CM_50,Cm50),

EV_COMMAND (CM_RED,CmRed),

EV_COMMAND (CM_BLUE,CmBlue),

EV_COMMAND (CM_GREEN,CmGreen),

EV_COMMAND (CM_BLACK,CmBlack),

EV_COMMAND (CM_MAGENTA,CmMagenta),

EV_COMMAND (CM_READ,CmRead),

EV_WM_RBUTTONDOWN,

END_RESPONSE_TABLE;
//класс окна диалога для ввода

class ConstDialog:public TDialog{
TEdit* edit; //указатель на класс TEdit

TValidator* valid; //указатель на базовый класс TValidator

public:

ConstDialog(TWindow*,TResId); //конструктор

void CmAdd();

DECLARE_RESPONSE_TABLE(ConstDialog);};
//функция отклика на пункт меню"Ввод"

void MyWindow::CmInput(){

memset(&Const,0,sizeof(CharConst));// очищаем переменную структуры

new ConstDialog(this,IDD_DIALOG1)->Execute(); //выполняем диалог

Invalidate();

}
//конструктор класса ConstDialog

ConstDialog::ConstDialog(TWindow*parent, TResId resId):

TDialog(parent,resId)

{

valid=new TFilterValidator("0-9"); //Создаем объект фильтра контроля

edit=new TEdit(this,IDC_EDIT1,sizeof(char)*10); //создаем управляющий объект

edit->SetValidator(valid); //назначаем этот контроль для управляющего объекта

edit=new TEdit(this,IDC_EDIT2,sizeof(char)*10);

valid=new TFilterValidator("0-9");

edit->SetValidator(valid);

TransferBuffer=&Const; //назначили буфером обмена

memset(&Const,0,sizeof(CharConst)); //очищаем переменную структуры

}

//oписание таблицы откликов класса ConstDialog

DEFINE_RESPONSE_TABLE1(ConstDialog,TDialog)

EV_COMMAND(IDC_BUTTON1,CmAdd),

END_RESPONSE_TABLE;
//функция отклика на нажатие кнопки

void ConstDialog::CmAdd()

{

TransferData(tdGetData); //перенос содержимого буфера диалога

CloseWindow();

}
//конструктор класса MyWindow

MyWindow::MyWindow(TWindow*parent,const char far* title):

TFrameWindow(parent,title)

{ SetBkgndColor(TColor::LtGray);

AssignMenu("MainMenu"); //загрузка меню из файла приложения
sinIs=false; cosIs=false; line=false; //начальные значения идентификаторов

Attr.X=0;Attr.Y=0;Attr.W=1000;Attr.H=800; //координаты и размеры окна

k=50;

popupMenu.AppendMenu(MF_STRING,CM_200,"1.0=200 пикселей"); //формируем

popupMenu.AppendMenu(MF_STRING,CM_100,"1.0=100 пикселей"); //плавающее

popupMenu.AppendMenu(MF_STRING,CM_50,"1.0=50 пикселей"); //меню из 3 пунктов

}
// замещенная функция SetupWindow

void MyWindow::SetupWindow()

{

TWindow::SetupWindow(); //вызываем замещенную функцию

menu=new TMenu(HWindow); //создаем объект класса TMenu

}
// замещенная функция CleanupWindow

void MyWindow::CleanupWindow()

{ delete menu; //удаляем созданный ранее объект меню

TWindow::CleanupWindow(); //вызываем исходную функцию

}
void MyWindow::CmRead(){

new TDialog(this,IDD_DIALOG2)->Execute();}
void MyWindow::CmAbout()

{

MessageBox("Вывод графиков стандартных функций","О программе",

MB_ICONINFORMATION);

}
void MyWindow::CmClean()

{

for(int i=60;i<930;i++)

{ sine[i]=0; //очистить массив данных

cosine[i]=0;}

sinIs=false; //сбросить индекатор

cosIs=false;

line=false;

menu->CheckMenuItem(CM_SIN,MF_UNCHECKED); //снять маркер

menu->CheckMenuItem(CM_COS,MF_UNCHECKED);

menu->CheckMenuItem(CM_LINE,MF_UNCHECKED);

Invalidate();

}

void MyWindow::CmSin()

{

int state=menu->GetMenuState(CM_SIN,MF_BYCOMMAND);

if(state==MF_UNCHECKED) //если этот пункт меню не выбран

{

for(int i=60;i<930;i++) //образовать массив данных

sine[i]=sin((double)i/40);

sinIs=true; //установить индекатор

menu->CheckMenuItem(CM_SIN,MF_CHECKED); //пометить команду меню

Invalidate();

}

else{

for(int i=60;i<930;i++)

sine[i]=0; //очистить массив данных

sinIs=false; //сбросить индекатор

menu->CheckMenuItem(CM_SIN,MF_UNCHECKED); //снять маркер

Invalidate(); //перерисовать окно (без этого графика)

}

}

void MyWindow::CmCos()

{

int state=menu->GetMenuState(CM_COS,MF_BYCOMMAND);

if(state==MF_UNCHECKED)

{

for(int i=60;i<930;i++)

cosine[i]=cos((double)i/20);

cosIs=true;

menu->CheckMenuItem(CM_COS,MF_CHECKED);

Invalidate();

}

else{

for(int i=60;i<930;i++)

cosine[i]=0;

cosIs=false;

menu->CheckMenuItem(CM_COS,MF_UNCHECKED);

Invalidate();

}

}
void MyWindow::CmLine()

{

int state=menu->GetMenuState(CM_LINE,MF_BYCOMMAND);

if(state==MF_UNCHECKED)

{

line=true;

menu->CheckMenuItem(CM_LINE,MF_CHECKED);

Invalidate();

}

else{

line=false;

menu->CheckMenuItem(CM_LINE,MF_UNCHECKED);

Invalidate();

}

}
void MyWindow ::CmRed()

{ color=RED;

Invalidate();

}
void MyWindow ::CmBlue()

{ color=BLUE;

Invalidate();

}
void MyWindow ::CmGreen()

{ color=GREEN;

Invalidate();

}
void MyWindow ::CmBlack()

{ color=BLACK;

Invalidate();

}
void MyWindow ::CmMagenta()

{ color=MAGENTA;

Invalidate();

}
void MyWindow::Cm200()

{

k=200;

Invalidate();}

void MyWindow::Cm100()

{

k=100;

Invalidate();}

void MyWindow::Cm50()

{

k=50;

Invalidate();}
void MyWindow::EvRButtonDown(UINT,TPoint&point) //функция обработки сообщений от правой клавиши мыши

{

TRect rect;

GetWindowRect(rect); //получим текущие координаты главного окна

point+=rect.TopLeft(); //смещаем точку вывода меню

popupMenu.TrackPopupMenu(TPM_LEFTALIGN,point,0,HWindow); //отобразим плавающее меню

}

void MyApp::InitMainWindow()

{

MyWindow* myWin=new MyWindow(0,"курсовая работа"); //создаем объект класса MyWindow

SetMainWindow(myWin); //объявляем новое окно главным

myWin->SetIcon(this,IDI_ICON1);

myWin->SetIconSm(this,IDI_ICON1);

myWin->SetCursor(this,IDC_CURSOR1);

}
//замещенная функция Paint

void MyWindow::Paint(TDC&dc,bool,TRect&)

{

dc.SetBkMode(TColor::LtGray);

int a=atoi(Const.X)*50;

int b=atoi(Const.Y)*50;

int i;

char ticks [10][2]; //массив цифр под осями Х и У

TFont font("Times New Roman",14); //создаем шрифт

dc.SelectObject(font); //выбираем его в контекст устройства

int y0=Attr.H/2-20;

int x0=Attr.W/2+2;
/*вывод оси x*/

dc.MoveTo(Attr.W-950+b,y0);

dc.LineTo(Attr.W-50-b,y0);
dc.TextOut(Attr.W-50-b-10,y0+10,"X");

/*вывод стрелки по оси x*/

dc.MoveTo(Attr.W-50-b,y0);

dc.LineTo(Attr.W-50-b-10,y0-5);

dc.LineTo(Attr.W-50-b-10,y0+5);

dc.LineTo(Attr.W-50-b,y0);
/*вывод оси y*/

dc.MoveTo(x0,Attr.H-700+a);

dc.LineTo(x0,Attr.H-100-a);
dc.TextOut(x0-15,Attr.H-700+a,"Y");

/*вывод стрелки по оси y*/

dc.MoveTo(x0,Attr.H-700+a);

dc.LineTo(x0+5,Attr.H-700+a+10);

dc.LineTo(x0-5,Attr.H-700+a+10);

dc.LineTo(x0,Attr.H-700+a);
/*вывод рисок по оси х*/

for(i=0;i<=8-b/50;i++)

{ dc.MoveTo(x0+dx*i,y0-2);

dc.LineTo(x0+dx*i,y0+2);

dc.MoveTo(x0-dx*i,y0-2);

dc.LineTo(x0-dx*i,y0+2);

//вывод чисел под рисками

wsprintf(ticks[i],"%d",i); //преобразуем цифры в символы

dc.TextOut(x0-2+dx*i,y0+5,ticks[i]); //выводим цифры под осью

if(i!=0)

{

dc.TextOut(x0-dx*i,y0+5,ticks[i]);

dc.TextOut(x0-5-dx*i,y0+5,"-");

}

}
//вывод рисок по оси y

for(i=0;i<6-a/50;i++)

{

dc.MoveTo(x0-2,y0+dx*i);

dc.LineTo(x0+2,y0+dx*i);

dc.MoveTo(x0-2,y0-dx*i);

dc.LineTo(x0+2,y0-dx*i);

//вывод чисел под рисками

wsprintf(ticks[i],"%d",i);

if(i!=0)

{dc.TextOut(x0+5,y0-5-dx*i,ticks[i]);

dc.TextOut(x0+10,y0-5+dx*i,ticks[i]);

dc.TextOut(x0+5,y0-5+dx*i,"-");}

}
TColor PenColor=TColor::LtBlue; //создаем перо синего цвета

if(color==RED)PenColor=TColor::LtRed;

else

if(color==BLUE)PenColor=TColor::LtBlue;

else

if(color==GREEN) PenColor=TColor::LtGreen;

else

if(color==BLACK)PenColor=TColor::Black;

else

if(color==MAGENTA)PenColor=TColor::LtMagenta;

TPen myPen(PenColor,2);

dc.SelectObject(myPen);
TColor PenColor1=TColor::LtMagenta;

if(color==RED)PenColor1=TColor::LtRed;

else

if(color==BLUE)PenColor1=TColor::LtBlue;

else

if(color==GREEN) PenColor1=TColor::LtGreen;

else

if(color==BLACK)PenColor1=TColor::Black;

else

if(color==MAGENTA)PenColor1=TColor::LtMagenta;

TPen myPen1(PenColor1,2);

dc.SelectObject(myPen1);
if(line==true)

{ dc.MoveTo(x0,y0);

dc.LineTo(x0+100+k,y0-100-k);

dc.MoveTo(x0,y0);

dc.LineTo(x0-100-k,y0-100-k);

TFont font1("Arial",20,0,500);

dc.SelectObject(font1);

TColor prevColor=dc.SetTextColor(TColor::Black);

dc.TextOut(x0+30+k,y0-70-k,title3);}
if(sinIs==true)

{ for(int i=60+b;i<930-b;i++)

dc.SetPixel(i,y0-(int)(sine[i]*k),PenColor);

TFont font1("Arial",22);

dc.SelectObject(font1);

TColor prevColor=dc.SetTextColor(TColor::Black);

dc.TextOut(x0+290-b,y0-25-k,title1);}

if(cosIs==true)

{ for(int i=60+b;i<930-b;i++)

dc.SetPixel(i,y0-(int)(cosine[i]*k),PenColor1);

TFont font1("Arial",22);

dc.SelectObject(font1);

TColor prevColor=dc.SetTextColor(TColor::Black);

dc.TextOut(x0+290-b,y0+5+k,title2);}

}

int OwlMain(int,char*[])

{ return MyApp().Run();}
6.3. Результаты выполнения программы
Окно созданного приложения представлено на рис.3. В данной программе выполняется вывод графиков стандартных функций (синус х, косинус х, модуль х) на экран.

Рис. 7. Окно приложения
Предусмотрена возможность отображения на экране любого сочетания доступных графиков. Для вывода в пункте меню «Графики» необходимо щелкнуть левой клавишей мыши на нужном графике На рис. 4. произведен вывод всех графиков.

Рис. 8. Вывод всех графиков
Вывод графика сопровождается появлением маркера перед соответствующей командой меню, а вторичный выбор этой команды гасит как маркер, так и сам график. В меню &Файл с помощью выбора пункта меню &Очистка все выведенные на экран графики удаляются. На рис. 5 в пункте меню «Графики» выбран только график sin x.

Рис. 9. Вывод графика sin x

Щелчком правой клавиши мыши активизируется плавающее меню, в котором можно выбрать масштаб вывода графиков. На рис. 6 выбран масштаб 100 пикселей.

Рис.10. Вызов плавающего меню
А с помощью пункта меню &Ввод размеров осей на экране появляется диалоговое окно, в котором можно задать значения для изменения длины осей координат. На рис. 11 изображено диалоговое окно для ввода.

Рис.11. Диалоговое окно для ввода размеров осей
Кроме обязательных классов, определяющих интерфейс приложения: класс приложения MyApplication, производный от Tapplication, класс главного окна MyWindow от TframeWindow и главной функции OwlMain(), в программе вводится класс диалога для введения осей размеров в программу.

Сами формы окон диалога разработаны в RW.


Рис.12. Структура классов приложения
7. Примерные задания на курсовую работу

Создать приложение:

  1. выводящее изображение, созданное с помощью RW,ввести пункт меню, для получения увеличенного и уменьшенного изображения, ввести пункт меню, для получения других изображений;

  2. выводящее изображение файла .bmp.;

  3. выводящее изображение файла .bmp и использующее функцию ползунка;

  4. рисующее поверх битовых матриц, выводимых в окне;

  5. выводящее в окне диаграмму статического массива данных, каждый элемент диаграммы представить различными цветами;

  6. выводящее в окне диаграмму динамического массива данных;

  7. выводящее в окне диаграмму динамического массива данных, каждый элемент диаграммы представить различными цветами;

  8. выводящее в окне диаграмму динамического массива данных, каждый элемент диаграммы представить различными цветами, добавить пункт меню, изменяющий цвет диаграммы;

  9. выводящее в окне значения элементов статического массива, умноженного на заданную константу, добавить пункт меню, изменяющий цвет массива;

  10. выводящее в окне значения элементов динамического массива, умноженного на заданную константу;

  11. выводящее в окне значения элементов динамического массива, умноженного на заданную константу, добавить пункт меню, изменяющий цвет массива;

  12. выводящее в окне графики стандартных функций, размеры осей графика заданы;

  13. выводящее в окне графики стандартных функций, размеры осей графика задаются динамически;

  14. выводящее в окне графики стандартных функций, размеры осей графика задаются динамически, добавить пункт меню, изменяющий цвет графика;

  15. выводящее в окне графики произвольных функций;

  16. текстовый редактор.

Дополнения

1. Ввести акселераторы клавиатуры.

2. Ввести в меню дополнительные пункты – “Выход”, “О программе”.

3.Создать собственную иконку и курсор для приложения.
8. Литература

    1. Подбельский В.В. Язык Си++. – М: Финансы и статистика, 1996.

    2. Финогенов К.Г. Прикладное программирование для Windows на Borland C++. – Обнинск: Принтер, 1999.

    3. Сван Т. Программирование для Windows в Borland C++. - М: Бином, 1995.

    4. Черкасова Н.И. Тексты лекций по дисциплине «Операционные системы». Ч.2. - М.: МГТУ ГА, 2003.

    5. Горнец Н.Н., Рощин А.Г., Черкасова Н.И., Половов Р.М., Климова Т.Д Пособие по выполнению курсовых и дипломных проектов и работ. - М.: МГТУ ГА, 2002.


Приложение
1   2   3   4

Похожие:

Черкасова Н. И. Ч48 Операционные системы: Пособие по выполнению курсовой работы iconМетодические указания по выполнению курсовой работы по дисциплине аудит
При разработке методических указаний по выполнению курсовой работы в основу положены

Черкасова Н. И. Ч48 Операционные системы: Пособие по выполнению курсовой работы iconК выполнению курсовой работы по дисциплине «технология и организация...
В 75 Пособие к выполнению курсовой работы по дисциплине «Технология и организация перевозок». – М.: Мгту га, 2001. 28 с

Черкасова Н. И. Ч48 Операционные системы: Пособие по выполнению курсовой работы iconМетодическое пособие по выполнению курсовой работы
Безопасность систем под давлением: метод пособие к курс работе / А. П. Овчинников. – Самара: Самар гос техн ун-т, 2012. – 77 с.:...

Черкасова Н. И. Ч48 Операционные системы: Пособие по выполнению курсовой работы iconМетодические указания по выполнению курсовой работы Самара, 2012
Технические средства охраны: метод указания по выполнению курсовой работы / Сост. В. Н. Ворожейкин; Самар гос техн ун-т. Самара,...

Черкасова Н. И. Ч48 Операционные системы: Пособие по выполнению курсовой работы iconМетодические рекомендации по выполнению курсовой работы по дисциплине...
Уважаемые студенты, после выбора темы курсовой работы, Вам необходимо позвонить в учебную часть для ее утверждения

Черкасова Н. И. Ч48 Операционные системы: Пособие по выполнению курсовой работы iconМетодические рекомендации по выполнению и оформлению
Профиль и задачи курсовой работы определяются в каждом случае по усмотрению руководителя. Задача методических рекомендаций – помочь...

Черкасова Н. И. Ч48 Операционные системы: Пособие по выполнению курсовой работы iconМетодические рекомендации по выполнению курсовой работы пм. 01 Предоставление турагентских услуг
Методические рекомендации по выполнению курсовой работы являются частью учебно-методического комплекса (умк) по пм. 01 Предоставление...

Черкасова Н. И. Ч48 Операционные системы: Пособие по выполнению курсовой работы iconМетодические рекомендации по выполнению курсовой работы пм. 01 Ведение расчетных операций
Методические рекомендации по выполнению курсовой работы являются частью учебно-методического комплекса (умк) по пм. 01 Ведение расчетных...

Черкасова Н. И. Ч48 Операционные системы: Пособие по выполнению курсовой работы iconМетодические указания по выполнению курсовой работы по дисциплине «Финансовый анализ»
Методические указания по выполнению курсовой работы по дисциплине «Финансовый анализ» / фгбоу во “Нижегородский государственный педагогический...

Черкасова Н. И. Ч48 Операционные системы: Пособие по выполнению курсовой работы iconРуководство по выполнению курсовой работы по дисциплине «Гражданское право (часть общая)»
Руководство по выполнению курсовой работы по дисциплине «Гражданское право (часть общая)» составлена в соответствии с требованиями...

Черкасова Н. И. Ч48 Операционные системы: Пособие по выполнению курсовой работы iconИсследовательская работа «Программное обеспечение операционные системы эв и вм»
Операционная система – это программа, которая запускается сразу. Среди всех системных программ, с которыми приходится иметь дело...

Черкасова Н. И. Ч48 Операционные системы: Пособие по выполнению курсовой работы iconМетодические рекомендации по выполнению курсовой работы студентов,...
Оп «Бизнес-информатика», «Электронный бизнес», «Управление информационной безопасностью», «Системы больших данных»

Черкасова Н. И. Ч48 Операционные системы: Пособие по выполнению курсовой работы iconМетодические указания к выполнению курсовой и дипломной работ по...
Методические указания составлены применительно к выполнению курсовой работы по дисциплине: Экономика и организация производства на...

Черкасова Н. И. Ч48 Операционные системы: Пособие по выполнению курсовой работы iconРабочая программа учебной дисциплины оп. 07 Операционные системы и среды специальность
Содержание учебной дисциплины «Операционные системы и среды» направлено на формирование профессиональных и общих компетенций

Черкасова Н. И. Ч48 Операционные системы: Пособие по выполнению курсовой работы iconЛутин Э. А. Л86 Радиолокационные системы вс: Пособие к изучению дисциплины,...
Л86 Радиолокационные системы вс: Пособие к изучению дисциплины, контрольные задания и задания на курсовой проект.– М.: Мгту га, 2002....

Черкасова Н. И. Ч48 Операционные системы: Пособие по выполнению курсовой работы iconМетодические указания по выполнению курсовой работы по дисциплине «Экономика отрасли»
...


Руководство, инструкция по применению






При копировании материала укажите ссылку © 2018
контакты
rykovodstvo.ru
Поиск