OOП
.pdf
|
|
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
