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

OOП

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

 

 

исунок 3 Использование элемента управления Panel

 

 

окно редактора ri hTextBox

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

âыполнения каждой операции.

для кнопки сложения:

 

 

 

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

 

 

private: System::Void plus Cli k(System::Obje t^

sender, System::EventArgs^ e)

{

a

a,b,

 

first-

 

 

 

doubleSys em::Convert::ToDouble(se ond>Text);-

 

 

}

result1=a+b; ->AppendText(fi

->Text+" + "+s ond->Text+" = "+System::Convert::ToString( )

+" \t"+System::Convert::ToString(System::DateTime::Now)+"\n");

AppendText.

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

Обратите внимание, что для

сложения стро овых

еременных (напр мер, first->Text и

se ond->Text) используется операция +. Та же исïользована ункц ункция

 

System::DateTime::Now, которая выводит текущий момент времени.

 

 

 

Обработчики событий Cli k остальных кнопок выглядят аналогично.

 

 

 

 

10

 

 

2.3 Меню, кнопки быстрого доступа

стандартные окна диалога

 

 

меню: главнСтандартìåíþ,ûéрасполагаемоеинтер ейс Windowsâ âå õíåé-

ñòðî

îêíà,предполагаети контекстныеналичиеèëèäâóõвсплываю•типов

ùèå ìåíþ,

при нажатии правойприложениякнопê ìûøè,

которых зав сит

от того, над каким э ементом управлен я произ шло событие жатия кнопки мышè.

.

В нашемпоявляющиесяпри ожении мы создадèм главное меню, содерж щее пункты File и

 

Пункт File будет содержать элементы New, Save, Save as...,содержаниеOpen... Exit. ПунктEdit

будет содержать элементы Cut, Copy, Paste.

 

 

 

 

 

Для созда ия строки глав ого меню предназначен элеме т MenuStrip, его н обхо•

димо разместить

на орме. Измените значение свойства Name (íапример, пусть элåìåíò

называется mainmenu). Выделите его

дважды кликните мышью, чтобы открыть кон•

структор главного ме ю. введите названия всех пунктов как для меню File, так и для

меню Edit. При создании пунктов помните, чт :

быструю клавишу для обра•

амперсанд (&) в названии пункта меню

 

щения к этому пункту (например, для имениопределяетпунк а \E&xit это будет комбинация

[Alt -X);

 

 

 

 

 

 

 

если после выбора пункта меню будет открыто окно диалога, то после имени пункта

ставится многоточие (например, для пункта Save as...);

 

 

 

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

имени пункта задать знак минус (-).

 

 

 

 

 

Измените свойство Name у всех созданных пунктов: для пункта Open пусть Name=mainopen,

для пункта Save пусть Name=mainsave

ò.ä.

 

 

 

 

 

Для каждого пункта меню (за исключением пункта Exit) необходимо создать за•

головок ункции обработчика события Cli k (двойной щелчок мышкой по имени пункта

или из списка событий, как указано выше).

 

 

 

 

 

В первую очередь определим ункц ю, обрабатывающую событие Cli k для пунк•

а Exit. Выше уже была дана ункция, приводящ

к закрытию

ïðè

íàæà•

ии на кнопку. Поскольку калькулятор разрабатыв

ется последовательно,приложениякнопка Exit

ункция для ее работы уже присутствуют.

Среда разработки позволяе к любому со•

бытию привязать уже существующую ункцию. Это приводит к то

ó, ÷òî îäíà

òà

 

ункция будет вызываться при обращении сразу к нескольким элеìентам приложения. В данном случае, одна и та же ункция будет выполняться как при нажатии на кнопку 11

Exit, так и при нажатии на пункт Exit главного меню. Для того, чтобы связать унк•

перейдитеöèþ,

списку событийприложение,. В списсобытиемсобытийCliнайдитеk пунктасобытиеìåíþCliExitk ,èвыделитенапротивåãîâ ïó•

ñòîé ñòðî å

 

списке доступ ых ункций выберите нужную ункцию (в первом примере

простогозакрывающуюалькулятора

íазывалась exit Cli k).

 

Edit.

 

На следующем

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

1)

Измените свойство Enabled пункта Paste на значение false, чтобы этот пункт по

 

умолчанию не был доступен для использования при пустом бу ере обмена.

2) Пункт Copy

 

 

 

private:

System::Void main opy_Cli k(System::Obje t^ sender, System::EventArgs^ e)

 

{

result1->Copy();

 

 

}

mainpaste->Enabled=true;

 

 

здесь в первой строке содержимое из элемента result1 (элемент ri hTextBox) помо•

 

щью ункции Copy копируется бу ер

во второй строке изменятся свойство

 

Enabled для пункта Paste главного менюобмена,значение true, поскольку теперь бу ер

 

обмена не пуст.

 

 

3) Пункт Cut

 

 

 

private:

System::Void main ut_Cli k(System::Obje t^ sender, System::EventArgs^ e)

 

{

result1->Cut();

 

 

}

mainpaste->Enabled=true;

 

 

обработчик события ан логичен предыдущему, только содержимое из редактора

 

result1 не копируется, а вырезается в бу ер обмена.

4) Пункт Paste

 

 

 

private:

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

 

{

 

 

 

12

 

}

 

result1->Paste();

 

 

 

 

 

здесь содержимое бу ера обмена при помощи ункции Paste вставляется в окно

редактора result1.

 

 

äëÿ

меню File необходимо

 

Ïðåæ

÷åì ñîçä âàòü

 

 

д бавить станäартные диалоги открытобработчикисохранения айлов элементы OpenFileDialog

и SaveFileDialog. Затем для упрощенèÿ

работысобытийайламипунктовкласс Form1 нужно добавить

новую

строковую переменную, хранящую имя айла:

 

 

private: System::String^ MyFileName;

 

 

 

 

После этого обработчик события для пункта Open для открытия текстового айла к окне

редактора result1

 

 

 

 

 

 

private:

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

if(MyFileName=="")

 

 

 

 

 

 

{MyFileName="log.txt";

 

 

 

 

 

}openF leDialog1->F leName = MyF leName;

 

 

 

if(this

open

 

D alog1->ShowD alog() == System::Windows::Forms::DialogResult::OK)

{

 

 

 

 

->FileName);

 

 

 

resu t1->LoadFile(op nFi

 

 

 

MyFileName = openFileDialeDialog1->FileName;

 

 

 

}}

 

 

 

 

 

 

извест о ли имя айла: если пользо•

Здесь в первой условной конструкции п

 

ватель еще не задал имя айла для открытияоверяется,(т. . переме ная MyFileName равна пустой

 

 

то этой переменной присваивается по умолчанию значение log.txt. Затем проис•

х дит вызов диалогового окна для открытия айла openfileDdialog1, свойству FileName

торого присвоено значение переменной MyFileName. Это имя будет игурировать в

ñòðî•ëþ

строке),открытия айла диалогового окна. Пользователь может изменить это значение

бое другое (например, если требуется открыть айл, имя которого отлич от значения

log.txt, которое используется по умолчанию). Следующая условная конструкция

ïðî•

веряет, что диалоговое окно было закрыто путем нажатия на кнопку [OK , поскольку в 13

окнаеýòñÿ,îì случаето. переменной. имясвойствоокрываемогоMyFileNameDialogResultайла,присваиваетсяуказанноепринимаетв значениестроке диалоговогосвойстваOK. Åñëè FileNameýòîîêíà),условиедиалоговогосодержимоевыполня•

айла загружается

(при п мощи ункции LoadFile) в окно редактора result1.

 

 

Обработчик

события

Cli k для пункта New должен сохранять в айл текущее

 

 

å

êí редактора

а затем очищать

одержимое этого окна в том случае, если

 

 

было изменено. Еñли же содержимое окна редактора после

последнег сîхра ения не изменялось, то окно редактора очищается без сохранения его

содержимîãî. Ôóíкция будет следующей:

 

 

 

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

{

 

resu t1->Modified)

 

 

 

 

 

if(MyFileName=="")

 

 

 

 

 

 

{

 

 

 

 

 

 

 

 

MyFileName="log.txt";

 

 

 

 

 

}

 

->FileName = this->MyFileName;

 

 

if(saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)

 

{

SaveF le(s veFileDialog1->FileName);

 

 

resu t1->Modif ed=f lse;

 

 

 

 

 

MyFileName =

saveFileDialog1->FileName;

 

 

 

}}

 

 

 

 

 

 

 

}result1->Clear();

 

 

 

 

 

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

дактора result1. Ес и свойство Modified окна

редактора

значение true, то выполре•

няются оператора теëа условной конструкции. Основная час ь тела условн й конструкции

аналогична телу ункции mainopen Cli k, которая рассмоимеетрена выше, тîлько в данном

случае содержим

текстового окна

 

в айл при помощи ункции SaveFile.

После того, как содержимое редакторасохраняетсяено, значение свойства Modified изменяется

на значение false. Последний оператор ункции очищает окно редактора result1 при

помощи ункции Clear.

 

14

 

 

ìîå îêíàФункциятекстовогоäëÿредактораобраб тки событияайл, причем,Cli k ïðèунктапервомSaveвызоведолжна ункциисохранятьдолжносодержи•âîç•

ник ть диалоговое окно для вода имени айла, в котором будет хр ниться соде жимое

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

в этот же айл. Функция будет следующей:

 

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

{if(MyFileName=="")

 

 

 

{

 

 

 

 

MyFileName="log.txt";

 

 

 

->FileName = MyFileName;

 

if(saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)

{

SaveF le(this->saveFileDialog1->FileName);

 

resu t1->Modif ed = false;

 

 

MyFileName = this->saveFileDialog1->FileName;

 

}

 

 

 

 

el

 

 

 

 

result1->Modified = false;

 

 

{

SaveF le(MyFi eName);

 

 

}}

 

 

 

else) выполняется при первом

Здесь первая часть условной конструкции (до

вызове ункци , когда имя айла еще не задано,оператораторая (после оператора else)

при последующèх. Обратите внимание, что и в том,

â другом случае после сохранения

содержимого окна редактора свойство Modif ed изменяет свое значение на false.

 

Функция для

 

события Cli k пункта меню Save as... отличается от

обраб ки пункта Save

обработкитем, ч диалоговое окно для ввода имени айла возникает всякий

раз, когда ункция вызывается:

 

 

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

{if(MyFileName=="")

 

15

 

{

 

 

 

 

 

 

 

 

 

 

MyFileName="log.txt";

 

 

 

 

 

 

}

 

 

->FileName = this->MyFileName;

 

 

if(saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)

{

SaveF

 

 

 

->FileName);

 

 

resu t1->Modif ed = false;

 

 

 

 

 

MyFileName =

le(saveFileDialog1->FileName;

 

 

 

 

}}

 

 

 

 

 

 

 

 

 

 

Как видн , в теле ун ции отсутствует часть условной конструкции оператором else.

 

После

òîãî, êàê созданы все ункции главное

полностью ункционально,

можно добавлять на орму контекстное всплывающее меню и кнопки быстрого доступа.

 

Контекстные меню р ализуются при помощи элемента ContextMenuStrip: добавь•

те на орму два таких элемента. Первое конт кстное меню будет по ункциональности

совпадать с меню File. Второе контекстное

ìåíþ

будет реализовывать те же ункции,

что и меню Edit. После добавления измените

 

 

переменной Name у обоих меню:

для меню типа File укажите Name= ontextfile,значениедля меню типа Edit Name= ontextedit.

Пусть также первое

онтекстное меню будет привязано к орме: оно будет возникать при

щелчке правой

кнопкой мыши в любом месте ормы. Для того, чтобы о уществить та•

кую привязку,

 

ыделите орму и

 

 

ñïè

свойств ормы. В списке свойс

найдите свойстâо ContextMenuStripперейдитев списке досткупных контекстных меню выберите

ìåíþ ontextfile

Аналогичным образом привяжите второе контекстное меню к окну

редактора result1.

После этого можно в каждое меню добавить нужные пункты. В меню

ontextfile должны быть пункты Op n, New, Save, Save as..., Exit. В меню ontextedit

д лжны быть пункты Copy, Cut, Paste. Значение переме ной Name для этих пунктов мож•

íî оставить без изменения. Для пункта Paste задайте зíачение свойства Enabled равное

false.

Чтобы меню было нкциональным, достаточно

событию Cli k каждого пункта

привязать уже существующóю соответствующую ункцию так же, как это было сделано

выше для пункта Exit главного меню. Например, выделите пункт Open контекстного меню

ontextfile и перейдите сп ску событий для этого пункта. Найдите событие Cli k

укажите в строке имя

óíêöèи mainopen_Cli k, которая была создана для открытия

 

 

 

 

 

 

16

 

 

 

айла. Аналогично необходимо сделать для остальных пунктов меню.

 

В обработчики событий для пунктов Copy и Cut добавьте строку:

pasteToolStripMenuItem->Enabled=true;

 

 

д я того, чтобы действие Paste было доступно только после совершения операции Copy

èëи Cut.Па ель кнопок быстрого доступа реализуется при помощи элемента ToolStrip, ко•

торый

нужно добав

ь на орму. Задайте для него значение переменной Name=fastbuttons.

После этого выделите эле

 

т ToolStrip и вызовите для него контекстное всплываю•

щее меню. В появившемся

меню выбер е пункт Insert standart items. После этого на

панели кнопок быстрого доступа появится набор стандартных кнопок. Оставьте кнопки

для операций Open, New, Save, Cut, Copy, Paste. Для кнопки Paste установите свойство

Enabled=false.

для обработки событий Cli k для каждого пункта задайте в спи ке со•

 

Функц

бытий, указав имена

уже существующих, как это было сделано для пунктов контекстного

ìåíþ.

В обработчики событий операций Cut и Copy добавьте строку:

pasteToolStripBut on->Enabled=true;

 

 

чтобы кнопка Paste

 

кнопок быстрого доступа была доступна только после исполь•

зования операций CutпанелиCopy.

 

 

 

 

2.4 Отображение текущего времени в строке статуса

 

Строка статуса создается при помощи

управления StripStatus. Содер•

жимое строки состояния при этом выводится вэлементазна е свойства Text метки

toolStripStatusLabel1, которая создается по умол÷анию при добавлении элемента управ•

ления на орму. Измените значение переменн й Name этой метки на statuslabel.

 

Чтобы

строке состояния отображалîсь текущ е знач

ие времени,

орму добавить элемент управления Timer. Значение перемåííîé Name áó åò ïî óìîë•

нач нию равно timer1. Для элемента управления Timer существует только однонеобходимос бытие

Ti k, которое

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

начением

âа Interval. Для того, чтобы ункция для о

события Ti k вы•

çывалась разсвойст1 секунду, значение свойства Interval должно áы ь равно 1000. При этом

свойство Enabled элемента timer1 должно иметь значение trueработки, .е. таймер должен быть

активным.

 

 

 

17

 

 

 

 

 

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

обновлялись показания часов, необходимо написать обработчик события Ti k элемента

timer1 следующим образом:

 

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

{

statuslabel->Text=System::Convert::ToString(System::DateTime::Now);

}

Здесь 1 раз в секунду (что определяется интервалом Interval=1000 таймера timer1) в

свойство Text строки состояния

значение ункции System::Da eTime::Now,

которое

 

предварительно преобразовановыводитсястроку при помощи метода ToString класса

Convert.

 

управления Windows Forms

 

 

 

3.1Элементывыбора

 

 

 

 

С помощью элементов Che kBoxможно создавать набо ы независимых переклю•

ч телей. Одновременно может быть выбрано любое число пеðеключателей. Поведение

êàждого элемента определяется его свойствами:

 

1) Text текстовая метка элемента;

 

 

2)

 

 

 

ed признак выбора элемента;

 

 

3) Che kState состояние переключателя:

 

 

 

 

 

Che ked выбран (д ),

 

 

 

 

U he ked не выбран (нет),

 

 

 

Indeterminate состояние неизвестно;

 

4) Appearan e определяет орму появления компонента (в виде обычного лажка

 

 

или в виде кнопки);

 

5) ThreeState задает поддержку двух (ThreeState = false)

или трех (ThreeState = true) состояний. Если значение ThreeState установлено Indeterminateв true, то свойство; Che ked всегда возвращает true для состояний Che ked или

18

7)6) CheFlatStylekAlign определяетсвойство,

стиль появленияот рыть выпадающий список, где можно вы•

 

брать схему размещения

позволяющеелажка поле компонента;.

 

 

 

 

 

3.2 Компонент календарь DateTimePi ker и класс DateTime

 

 

Компонент DateTimePi ker находится в списке Common Controls палитры компо•

нентов и позволяет пользователю выбирать необходимую дату или время

отображать

их на орме. Свойство Format определяет характер отображаемой

ин ормации:

1) Long длинный ормат отображения даты в виде dd MMMM yyyy (например,

 

12 апреля 2007 г.);

 

 

 

 

 

 

2) Short ê

откий ормат отображения даты в виде dd.MM.yyyy (например, 12.04.2007);

3)

Time ормат отображения времени;

 

 

 

 

4)

Custom

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

ормат отображения даты или времени, строка ормата

 

с правил

среде р зработки (см. раздел 3.3).

 

 

 

при этом задается свойстве CustomFormat элемента DateTimePi ker в соответствии

При выборе даты или

(это задается в свойстве Format) компонент может пред•

ставляться в двух ормах:временивиде рямоугольного поля, в котором высвечивается дата

или время, и в виде выпадающего сïиска с датами.

хранится как значение его

 

Выбранная с помощью DateTimePi ker дата или

свойства Value, откуда ее можно брать (или присваивать)времярежиме исполнения приложе•

íèÿ.

3.3

è

 

орматирование даты

времени

 

Ñòàí

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

рования, преСтандартноеставленных в таблице 1. Åñëè çàä íî

 

орматирование ормати•даты,

мвола орматирования нет в таблице, которая хрстандартн ответствующем классе, то

вания) зависит от региональных

установок вашего компьютера, строказадав емых чер з панель

ñèстема выдаст ошибку. Вид рез льтата орматировàíèòñÿ(ò.

.

 

после орматиро•

управления. Компьютеры с различными региональными установками будут,

естественно,

выдавать разные результаты орматирования.

 

 

 

 

 

 

 

 

19

 

 

 

 

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