Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

OOП

.pdf
Скачиваний:
8
Добавлен:
23.02.2015
Размер:
623 Кб
Скачать
☆

 

 

4.4 Многопользовательский лькулятор

ский калькуляторСледующий.

этап (и последний,акого приложения:ура!) разработкизначения ароля именимногопользователь•пользователя

определяют ункциональнСвойствость

калькулятора. Например,приложения:ус ь калькулятором пользу•

ются два пользователя: root

user причем первый обладаеò всеми правами может

ïî

зоваться всеми

компонентами калькулятора, а второй не может использовать меню

êàëüкулятора.

 

 

 

 

обработчик

Cli k кнопки ok ормы password

 

 

В первую очередь добавим

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

 

ubli : int

a;

 

 

 

 

 

ender, System::EventArgs^ e)

private: System::Void ok Cli k(Sy tem::Obje t^

{

 

if(login->Text=="user" && pass

->Text=="password1")

 

 

DialogResult=System::Windows::Forms::DialogResult::OK;

 

 

{

 

 

 

 

 

 

 

 

 

a=1;

 

 

 

 

 

 

 

 

 

}

if (login->Text=="root" && passwd->Text=="pas word0")

 

 

else{

 

 

 

DialogResult=System::Windows::Forms::DialogResult::OK;

 

 

 

{

 

 

 

 

 

 

 

 

 

a=0;

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

else

 

 

 

 

 

 

 

 

 

{

 

 

 

 

 

 

}

 

}

DialogResult=System::Windows::Forms::DialogResult::Can el;

 

}

 

 

 

 

новая целочисленная глобальная пер менная a, к

Как видно, дополнительно

0,

 

рой присваивается значен

 

сли пользователь вводит имя пользователя root и с то•от

 

етствующий ему пароль,

иливведенаременной a присваивается значение 1, если пользователь

âходит как user. При этом

переменная a имеет атрибут publi , поскольку нам потребуется

 

 

 

 

 

 

 

 

30

 

обращатьсяТеперьê íåéìîäèèç ицируемîðìû Form1обработчик.

события Load ормы Form1

 

private: System::Void Form1 Load(System::Obje t^ sender, System::EventArgs^ e)

{

logo

^ logoform = g new logo();

 

 

 

 

 

d^ passform = g new pas word();

 

 

 

passf

m-

 

();

 

 

 

 

if (pa sform>Show- DialogResult!=System::Wi dows::Forms::DialogResult::OK)

 

 

{

System::Windows::Forms::Appli ation::Exit();

 

 

 

}

 

 

 

swit h (passform->a)

 

 

 

 

 

{

 

se 1:

 

 

 

 

 

 

 

mainmenu->Enabled=false;

 

 

 

 

 

on

 

edit

 

 

 

 

 

 

 

file

 

 

 

 

}

}

fastextbu tons->Enabled=false;

 

 

 

break;

 

 

swit h ase для значения переменной a

В обработчик события добавлена

ормы password. Если эта переменная меет значение 1, то все меню нашего

перемен•

 

 

 

 

для использования. Обратконструкцияте внимание, что

при обращении

 

ой a сн ва указано имя ормы, для которой эта

нн я объявлена. калькулятораОбращение

íедоступныей из рмы Form1 возможно, поскольку мы объявилиперемздесьàтрибутом publi .

 

 

 

5 Программирование гра ики с использованием библиотеки

 

 

 

GDI+

 

 

 

 

 

 

GDI (Graphi s Devi e Interfa e, Graphi al Dev e Interfa e) один из тр¼х основных

компонентов или ¾подсистем¿, вместе с ядром и Windows API, составляющих

пользова•

тельский интер ейс (оконный менеджер GDI) Mi rosoft Windows. GDI это интер ейс 31

Windows для представления гра ческих объектов и передачи

х на устройства отобра•

отображениежения, такиеøðèêàê т ниторыобработкупринтерыпалитры. GDI.

отвечает за отрисовку линий и кривых,

GDI+

потомок подсистемы

GDI являет я улучшенной средой для 2D-гра•

ики, в которую

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

координат с плавающей точкой, градиентн я заливка, внутренняя поддержка таких

ических орматов, как JPEG и PNG, куда лучшая поддержка регионов отсечения с гра•воз

можностью использовать в них координаты с плавающей точкой (а не 16-

целые)

рименения к ним World Transform, преобразования

матрицбитные. п. GDI+

è ïользует ARGB-цвета. Эти

 

 

используютсядвумерныхпользовательском интер ей•

Windows XP, а их присутствиевозможностибазовом гра ическом слое облегчает использование

ñистем вектор ой г а ики.

 

 

 

 

 

 

 

Создание пðиложений Windows Forms с богатыми гра ическими возможностями

треб ет изучения класса Graphi s и других клас ов, пр доставляющих управляемому коду

äîñòóп к Windows GDI+. Класс Graphi s предоñ

 

методы рисования на устройстве

отображения. Такие классы, как Re tangle

Point, инк п улируют элементы GDI+. Класс

Pen используется для

линий

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

класса Brush, используютсярисованиядл заливкè èãóð.

 

 

 

 

Пространство имен System::Drawing обеспечивает доступ к ункциональным воз•

можностям гра ического

GDI+. Пространства имен System::Drawing::Drawing2D,

System::Drawing::Imaging,интерSystem::Drawing::Textейса

обеспечивают дополнительные ункци•

ональные возможности.

 

 

 

 

 

 

 

5.1 Создание объекта Graphi s

 

 

 

 

 

Перед тем как

линии

игуры, отображать текст, выводить изображе•

ния и управлять ими, рисоватьGDI+

необходимо

создать объект Graphi s. Объект Graphi s

представляет поверхность рисования GDI+ и используется для создания гра ических изображений.

Существует несколько способов создания объекта Graphi s. Ниже рассмотрены два способа.

1) Полученèе ссылки на объект Graphi s через объект PaintEventArgs при обработ• ке событ я Paint ормы или элемента управления. Это обычный способ получения ссылки на гра ический объект при создании кода рисования элементов управления.

32

 

Например, создайте обработчик события Paint для ормы Form1. Заголовок унк•

 

ции в коде будет следующим:

 

 

 

private: System::Void Form1_Paint(System::Obje t^ sender, System::Windows::Forms::PaintEventArgs^ e)

 

 

{

 

 

 

 

}

 

 

 

 

Для создания ссылки на объект Graphi s необходимо написать:

 

 

Graphi s ^ g = e->Graphi s;

 

 

 

после чего к переменной g можно применять методы класса Graphi s.

 

 

2) Вызовите метод

элемента управления или ормы, чтобы получить

 

ссылку на объектCreateGraphi, соsтветствующий поверхности рисования этой ормы

 

или элемента управления. Используйте этот подход, если необходимо

íà

 

поверхности уже существующей ормы или элемента управления. Например,совать со•

 

бытии Load ормы Form1 напишите:

 

 

 

^ g;

 

 

 

Graphig = this->CreateGraphi s();

 

 

чтобы рисовать неп средственно на орме Form1. Метод CreateGraphi s можно приме•

 

любому другому элементу ормы, например, для кнопок. Например, добавьте на

нятькуляторк л

кнопку Button задайте значение свойства Name этой кнопки равным paint.

Затем создайте обработчик события

этой кнопки:

 

{

ivate: System::Void paint_Cli k(System::Obje t^ sender, System::EventArgs^ e)

 

Graphi s ^ g;

 

 

g = results1->CreateGraphi s();

 

 

}

при нажатии на кнопку будет создаваться ссылка на бъект Graphi s, соответству•

ющ й поверхности рисования элемента окно расширенного редактора, т.е. рисования

Здесьбуд т возможным в окне редактора.

33

 

 

 

5.2 исованиясоздания объекталиний Graphièãóðs его можно использовать для рисования линий

è èãóð,

тображения текста или изображения и управления ими. Ниже представлены

основныеПослебъекты, используемые объектом Graphi s:

 

 

 

 

класс Pen служит для рисования

линий, контуров и отрисовки других геометри•

 

 

ческих объектов;

 

 

ер игур, изображений и и

 

класс Brush служит для заливки областей, напри

 

 

текста;

абстрактный базовый класс, который не

может быть реализован. Дëÿ

 

 

созданияэтобъекта

 

классы, производные от Brush, такие как

 

 

SolidBrush, TextureBrush"кисть"используютсяLinearGradientBrush;

 

 

 

 

класс Font содержит описание игур, которые должны использоваться при отри•

 

 

овке текста;

 

 

 

 

 

 

структура Color содержит различные цвета;

 

 

 

Методы класса Graphi s были рассмотрены на лекциях.

 

 

 

 

 

Далее рассмотриваются конкретные примеры создания объектов и использование

их для рисования различных гра ических примитивов методами класса Graphi s.

 

 

Pen^

Создание объекта

 

 

 

 

 

 

= g new Pen(Color::Red,1);

 

 

 

 

g->DrawLimypene(mypen,0,0,100,100);

 

 

 

òîë•

Здесь в первой строке

ется объект класса Pen определенного цвета

 

щины л ии (1), которыйсоздàтем используется в методе DrawLine рисования(красный)прям

линии

ñ

координатами

начала (0,0) конца (100,100). Например, добавьте эти две строки

â îá•

работчик события Cli k кнопки paint

 

 

 

 

{

ivate: System::Void paint_Cli k(System::Obje t^ sender, System::EventArgs^ e)

 

 

Graphi s

^ g;

 

 

 

 

 

 

 

= esults1->Cr ateGraphi s(

 

 

 

 

g->DrawLimypene(mypen,0,0,100,100);

 

 

 

 

Pen^

 

= g n w Pen(Color::Red,1);

 

 

 

 

}

 

 

 

 

 

34

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Запустите компиляцию и калькулятор. Вы увидите, что при нажатии кнопки

paint в окне расширенного редактора будет нарисована тонкая красная линия (!!!).

 

 

5.3 Простая анимация

 

 

 

 

местно

Класс Graphi s позволяет не только создавать гр ические примитивы, но

другими методами

 

 

управления

ласса Form реализовывать движесов•

ние гра ического объекта

преде ах ормы. На практике студенты решают подобную

задачу. Ниже рассматриваетсяэлементамиреа изация простого движения объекта по линейному за•

кону в пре ел х элемента pi tureBox.

 

 

 

 

 

Задачà: создать окружность внутри элемента управления pi tureBox. При нажа•

тии на кнопку окружность должна двигаться по прямой F(x)=x и отражаться от границ

элемента pi tureBox.

 

 

 

 

 

 

 

Для решения задачи потребуется добавить на орму Form1 эва элемента управ•

ë íèÿ: Button

Pi tureBox. Пусть значение свойс ва Name кнопки равно paint. Сначала

íåобходимо нар совать окружность внутри элемента Pi tureBox. Для

создадим об•

работчик

события Paint элемента pi tureBox (значение свойства Nameэтого элемента по

умолчанию равно pi tureBox1):

 

 

 

 

float x0,

0, w0, h0;

 

 

 

 

 

 

int hh,ww;

 

 

 

 

 

 

 

 

private: System::Void pi tureBox1_Paint(System::Obje t^ sender, System::Windows::Forms::PaintEventArgs^ e)

{

 

 

w1=w0, h1=h0;

 

 

 

 

 

float

 

 

 

 

 

 

Graphi s

g y1=y0,->Graphi s;

 

 

 

 

 

Pen^ mypenx1=x0,

g new Pen(Color::Blue 1);

 

 

 

 

SolidBrush^

mybrush =

new SolidBrush(Color::Blue);

 

 

 

 

Draw

 

pen,Re tangleF(x1,

y1, w1, h1));

 

 

 

g->FillEllipse(mybrush,Re tangleF(x1, y1, w1, h1));

 

 

 

}

 

и обработчик события

кнопки paint:

 

 

private: System::Void paint_Cli k(System::Obje t^ sender, System::EventArgs^ e)

{

 

 

 

Heig

 

 

 

 

 

hh

 

 

 

 

 

 

 

 

ww

pi tureBox1->Widtht;

 

 

 

 

 

x0

 

 

 

 

 

 

 

 

 

y

 

h0=10;

35

 

w0=10;

 

 

 

 

 

 

 

 

 

 

 

pi tureBox1->Refresh();

 

 

 

 

 

переменных

}

 

В данном случае, при нажатии кнопки paint четырем

 

 

начальные з ачения. Эти переменные задают коордиглобальнымверхнего левого

присваиваютсяугла (x0,y0), также

ширину (w0) и высоту (h0) прямоугольника, внутри кот рого будет

þòñÿ

окружность. Как только этим переменным присвоены значения, они переда•

 

pi tureBox1 Paint

где присваиваются л к льным переменным x1, y1,

нарисованаh1 w1. Кункцию

 

это присвоение произошло, будет нарисовàíà

кружность. Чтобы при

этом ее стало видн

внутри pi tureBox1, к нему

применяетсяww

мет д Refresh(). Также ис•

польз ваны дветолькогл бальные целочислен ые

hh,

которые хранят ширину

è âûñîту элемента pi tureBox1 (они понадобятсяпеременныездне ).

 

 

 

 

Чтобы реализовать движение объекта, нужно изменять его коорди аты с

времени. Для изменения свойств объекта используется элемент

управления Timerтечениемего

событие Ti k

 

 

 

timer1_Ti k(System::Obje t^ sender, System::EventArgs^ e)

private: System::Void

x

{

if(

< 0 ||

x

 

>

ww w

 

 

 

 

 

 

y0+dy

hh-h0) dx=y -dx;y

 

 

 

 

 

x x

 

 

 

 

 

 

 

 

 

 

 

 

y0=y0+dx;y

 

 

 

 

 

 

 

 

 

 

}

pi tureBox1->Refresh();

 

 

 

 

 

 

 

Установите при этом свойство Enabled элемента timer1 в значение false, а

ч ние свойства Interval в значение 10. При обработке события Ti k таймера будут прозна•

верятся

текущие значения координат окружности (x0,y0): если

х значения выходят за

пределы области pi tureBox1 (вот зачем нужны переменные ww

hh), значение шага

соответствующей координате (dx или dy) изменяется

противоположное. После этогпо

текущее з ачение шага прибавляется

текущим значениям

координат окружности. По•

ñê ëüêó

изменились, происходит

перерисовка объекта в событии pi tureBox1 Paint

и обновлеíèå pi tureBox1.

 

 

 

 

таймер, т.е. присвоить

 

 

Для того, чтобы все заработало, необходимо

 

 

свойству Enabled таймера значение true. сделаем это активироватьобработчике события Cli k кнопки 36

 

aint, моди ицировав его следующим образом:

privat : System::Void paint_Cli k(System::Obje t^ sender, System::EventArgs^ e)

{

 

->Enabled!=true)

if(timer1->Enabled=true;

paint-

Heig

hh

ww pi >Text="Stop";tureBox1- Widtht;

x0

 

y

 

 

h

 

 

w0=10;

 

pi tureBox1->Refresh();

}

 

 

else

 

{

 

 

timer1->Enabled=false;

paint->Text="Start";

}

 

Свойство Text кнопки paint перед запуском калькулятора установите равным

Start.

Обратите внимание, что каждый раз после остановки шарика, его движение начи•

нается из верхнего левого угла.

37

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]