Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа№2_ОС (2).doc
Скачиваний:
2
Добавлен:
17.11.2019
Размер:
625.66 Кб
Скачать

3. Текстовое поле TextBox.

Свойства:

– Text – надпись в поле;

– TextAlign – выравнивание надписи;

– Font – шрифт надписи (вид шрифта, размер, полужирный, подчеркнутый, курсив и т.п.);

– BackColor – цвет поля;

– Visible – видимость. Если True – поле видно, если False – нет;

– Enabled – блокировка поля. Если True – поле незаблокировано, если False – заблокировано;

– MaxLength – максимальное число символов, которое может быть введено в поле;

– ReadOnly – устанавливает возможность ввода символов в поле. Если True – поле становится только для чтения, если False – в поле возможен ввод символов;

– PasswordChar – символ, который будет отображаться в поле при вводе в него (используется для ввода пароля);

– Multiline – однострочное или многострочное будет поле. Если значение свойства равно True, то поле будет многострочным, если False – поле будет однострочным;

– Lines – массив строк в многострочном поле.

Событие:

– Click – нажатие;

– TextChanged – изменение текста в поле (возникает при изменении даже одного символа или при стирании даже одного символа);

– Enter – поле стало активным элементом, т.е. в него перешел фокус ввода (пользователь выбрал этот элемент для его изменения);

– Leave – поле утратило фокус ввода (пользователь закончил изменять элемент и перешел к другому элементу или ничего не изменил и перешел к другому элементу).

4. Поле для изображения pictureBox.

Свойства:

– Image – отображаемый рисунок;

– BackColor – цвет фона на поле;

– SizeMode – режим отображения картинки в поле. Режим может быть: АutoSize – размер поля изменяется под размер загружаемой в него картинки; CenterImage – загружаемая картинка отображается в центре поля. Если картинка больше чем поле, то она обрезается; Normal – загружаемая картинка отображается в левом верхнем углу поля. Если картинка больше чем поле, то она обрезается; StretchImage – размер картинки подгоняется под размер поля; Zoom – картинка масштабируется.

– Visible – видимость. Если True – поле видно, если False – нет;

– Enabled – блокировка поля. Если True – поле незаблокировано, если False – заблокировано;

– ImageLocation – путь к загружаемой картинке.

Событие:

– Click – нажатие.

5. Элемент CheckBox

Свойства:

– Text – надпись возле элемента;

– TextAlign – выравнивание надписи;

– Font – шрифт надписи (вид шрифта, размер, полужирный, подчеркнутый, курсив и т.п.);

– BackColor – цвет элемента;

– Image – картинка возле элемента;

– Visible – видимость. Если True – элемент виден, если False – нет;

– Enabled – блокировка элемента. Если True – элемент незаблокирован, если False – заблокирован;

– Checked – элемент выбран или нет («галочка» стоит или нет). Если True – элемент выбран, если False – нет.

Событие:

– Click – нажатие;

– CheckedChanged – изменение состояния элемента (выбран или невыбран).

6. Выпадающий список ComboBox.

Свойства:

– Text – надпись в поле;

– Font – шрифт надписи (вид шрифта, размер, полужирный, подчеркнутый, курсив и т.п.);

– BackColor – цвет поля;

– Visible – видимость. Если True – поле видно, если False – нет;

– Enabled – блокировка поля. Если True – поле незаблокировано, если False – заблокировано;

– Items – массив строк в списке (элементы списка);

– SelectedIndex – номер выбранного элемента массива.

Событие:

– Click – нажатие;

– TextChanged – изменение текста в поле (возникает при изменении даже одного символа или при стирании даже одного символа);

– Enter – поле стало активным элементом, т.е. в него перешел фокус ввода (пользователь выбрал этот элемент для его изменения);

– Leave – поле утратило фокус ввода (пользователь закончил изменять элемент и перешел к другому элементу или ничего не изменил и перешел к другому элементу);

– SelectedIndexChanged – изменение номера выбранного элемента из списка (пользователь выбрал из списка другой элемент).

Для добавления в список нового значения необходимо вызвать метод Add(строка с добавляемым значением).

Для использования в программе стандартных диалогов для открытия или сохранения файлов, выбора цветов или шрифта и т.п. необходимо на форму в любое место добавить соответствующие элементы с вкладки «ToolBox». Они добавятся в проект как ресурсы и будут отображаться внизу под главным окном программы (рисунок 4).

Свойства диалога открытия или диалога сохранения файлов:

– FileName – имя файла, выбранное пользователем;

– Filter – строка, в которой указываются расширения файлов для выбора. Например, для выбора файлов с изображениями строка будет иметь вид картинки|*.bmp;*.jpg;*.gif;

– FilterIndex – расширение, которое будет отображаться в верхнем поле выпадающего списка для выбора расширений в диалоге (рисунок 5);

– MultiSelect – разрешает или запрещает выбор сразу нескольких файлов при открытии. Если значение свойства равно True, то можно выбирать несколько файлов, если False – то можно выбирать только один файл.

Для отображения диалога необходимо вызвать его метод Show(). После закрытия диалога он возвращает значение – результат своей работы, который зависит от того, какая кнопка была нажата пользователем. Тип возвращаемого значения System::Windows::Forms::DialogResult. Само значение может быть равно ОК (если была нажата кнопка ОК) или Cancel (если была нажата кнопка Cancel).

Введенные пользователем строки в текстовые поля хранятся в их свойстве Text, которое не доступно для непосредственных преобразований над отдельными символами. Поэтому перед выполнением каких-либо преобразований необходимо переписать введенную строку в переменную типа String^.

String^ s = textBox1->Text;

После этого к отдельным элементам строки s можно обращаться как к элементам массива, однако из них можно только читать значения, но не записывать в них. Поэтому можно объявить массив типа char или wchar_t (для символов юникода), и преобразованные символы записывать в него. В последний элемент массива необходимо записать значение `\0` (конец строки), чтобы при выводе результатов не было «мусора».

Для вывода результатов обратно в текстовое поле необходимо сначала создать переменную типа String^ и заполнить ее значениями из массива, а затем приравнять значение этой строки свойству Text.

wchar_t l[10];

String^ s1=gcnew String(l);

textBox1->Text=s1;

Для перевода строк в числа и чисел в строки используется специальный класс Convert. Метод Convert::ToInt32() преобразует строку в целое число, метод Convert::ToDouble() – в дробное число, метод Convert::ToChar() преобразует число в символ юникода, метод Convert::ToString() преобразует число в строку.

int s=Convert::ToInt32(textBox1->Text);

textBox1->Text=Convert::ToString(s);

Преобразования строк в числа могут приводить к возникновению исключений, из-за которых операционная система прерывает работу программы. Исключение возникает, когда в строке среди цифр встречаются какие-либо другие символы. Для выявления таких ситуаций необходимо либо перед выполнением преобразования проверить содержимое введенной строки, либо воспользоваться конструкцией try…catch.

String^ n;

double defaultValue;

try

{

defaultValue = Convert::ToDouble( n );

}

catch ( Exception^ ex )

{

defaultValue = 100;

}

В операторе try помещается код программы, могущий вызвать исключение. В операторе catch помещается код, который необходимо выполнить при возникновении исключения.

Для вывода предупреждающих сообщений в программе можно воспользоваться методом Show класса MessageBox. При этом отобразится диалоговое окошко с сообщением и кнопками.

MessageBox::Show("The calculations are complete",

"My Application", MessageBoxButtons::OKCancel,

MessageBoxIcon::Asterisk);

Первый параметр задает сообщение, которое необходимо вывести в окошке, второй параметр – это заголовок окошка, третий параметр обозначает кнопки на форме, четвертый параметр – иконку на окошке.

Третий параметр может принимать значения:

– MessageBoxButtons::AbortRetryIgnore – три кнопки «Abort», «Retry» и «Ignore»;

– MessageBoxButtons::ОК – кнопка «ОК»;

– MessageBoxButtons:: OKCancel – две кнопки «ОК» и «Cancel»;

– MessageBoxButtons::RetryCancel – две кнопки «Retry» и «Cancel»;

– MessageBoxButtons::YesNo – две кнопки «Yes» и «No»;

– MessageBoxButtons::YesNoCancel – три кнопки «Yes», «No» и «Cancel».

Четвертый параметр может принимать значения:

– Asterisk – буква i в кружочке; 

– Error – крестик в красном кружочке;

– Exclamation – восклицательный знак в треугольнике;

– Hand – крестик в красном кружочке; 

– Information – буква i в кружочке; 

– None – без картинки; 

– Question – вопросительный знак в кружочке; 

– Stop – крестик в красном кружочке;

– Warning – восклицательный знак в треугольнике.

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

Окно приложения показано на рисунке 4. На форму были добавлены элементы: pictureBox, три кнопки (Открыть, Инвертировать цвет, Выход) и элемент openFileDialog. Для каждой из кнопок были написаны обработчики события Click.

Рисунок 4

По нажатию кнопки «Открыть» должен вызываться стандартный диалог для открытия файлов (рисунок 5).

Рисунок 5

Затем необходимо проверить, какую кнопку «Открыть» или «Отмена» нажал пользователь и выбрал ли он какой-нибудь файл. После этого отобразить выбранное изображение в поле pictureBox. Код, реализующий эти действия, имеет вид

//String^ path;//строка, где будет храниться путь и имя выбранного пользователем файла

//System::Windows::Forms::DialogResult result;// переменная для хранения результата, который возвращает диалог. Нужно, чтобы определить, какую кнопку на диалоге нажал пользователь

System::Windows::Forms::DialogResult result;

//отобразить окно для выбора файлов

result=this->openFileDialog1->ShowDialog();

//если пользователь выбрал файл и нажал ОК, то

if ( result == System::Windows::Forms::DialogResult::OK ){

//получить имя файла, который выбрал пользователь

String^ path = openFileDialog1->FileName;

//отобразить картинку

this->pictureBox1->ImageLocation=path;

this->pictureBox1->Load();

//

}

//а если пользователь нажал Cancel, то ничего не делать

По нажатию кнопки «Инвертировать цвета» происходит инверсия цветов изображения. Из файлов .bmp изображение заносится в свойство Image элемента pictureBox. Это свойство является объектом класса Bitmap. В этом объекте цвет каждой точки состоит из трех компонентов R-красный, G-зеленый, B-синий. Каждая компонента – это целое число от 0 до 255. Чтобы цвет инвертировался, необходимо каждой компоненте присвоить значение разности 255 и ее текущего значения по модулю 256. Так как такое преобразование выполняется для каждой точки, то его удобно выполнять в циклах по ширине и высоте изображения. Код, реализующий эти действия, имеет вид

int x,y; //переменные, которые будут использоваться как счетчики циклов

Bitmap^ image1; //переменная, в которой будет храниться промежуточная

//картинка из исходного изображения

image1 = gcnew Bitmap( this->pictureBox1->Image);//сделать промежуточную картинку в памяти, над которой проводить все изменения

//изменения картинки (здесь инверсия цветов)

for ( x = 0; x < image1->Width; x++ )

{

for ( y = 0; y < image1->Height; y++ )

{

Color pixelColor = image1->GetPixel( x, y );//получить исходный цвет точки

Color newColor = Color::FromArgb( (255-pixelColor.R)%256, (255-pixelColor.G)%256, (255-pixelColor.B)%256 );//выполнить инверсию цвета точки

image1->SetPixel( x, y, newColor );//присвоить точке новый цвет

}

}

//конец изменения картинки

this->pictureBox1->Image = dynamic_cast<Image^>(image1);//преобразованную картинку опять записать в picturebox для отображения на экране

}

По нажатию кнопки «Выход» происходит закрытие приложения. Код, реализующий эти действия, имеет вид

this->Close();

Пример 2. Необходимо создать приложение, которое будет рисовать эллипсы и закрашивать их выбранным пользователем цветом. Эллипсов может быть один или два и вокруг них могут быть или не быть рамки.

Окно приложения показано на рисунке 6. На форму были добавлены элементы: выпадающий список comboBox, кнопка button (нарисовать), два элемента groupBox (рисунок и рамка), две радиокнопки radiobutton (один эллипс и два эллипса) и два элемента checkbox (квадрат и эллипс). Для кнопки был написан обработчик события Click.

Рисунок 6

По нажатию кнопки «Нарисовать» происходит рисование картинки. Для этого сначала создается объект Graphics, который содержит в себе методы для рисования простых фигур.

Graphics ^ g;

g = this->CreateGraphics();//нужно для работы с графикой!!

Потом форма очищается от предыдущего рисунка путем ее заливки цветом фона (в данном случае серым).

g->Clear(Color::Gray);//очистить рисунок

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

// переменная для хранения цвета

Color customColor;

//создать цвет, выбранный пользователем в комбобоксе

switch(comboBox1->SelectedIndex)

{

case 0: customColor=Color::Red;break;

case 1: customColor=Color::White;break;

case 2: customColor=Color::Blue;break;

case 3: customColor=Color::Green;break;

case 4: customColor=Color::Yellow;break;

case 5: customColor=Color::Black;break;

case 6: customColor=Color::Brown;break;

case 7: customColor=Color::Orange;break;

case 8: customColor=Color::Purple;break;

case 9: customColor=Color::SkyBlue;break;

default:customColor=Color::Gray;//если пользователь ничего не выбрал

};

Затем создаются объекты Pen (карандаш) для рисования незакрашенных фигур и два объекта кисть (Brush) для рисования закрашенных фигур выбранным пользователем цветом.

Pen^ ki = gcnew Pen( Brushes::DeepSkyBlue );//создать карандаш

//создать кисть

SolidBrush^ br=gcnew SolidBrush(customColor);

//задать координаты для линейного градиента

Point startPoint, endPoint;

startPoint.X=100;startPoint.Y=170;

endPoint.X=300;endPoint.Y=270;

//создать кисть с линейным градиентом

Brush^ ii=gcnew LinearGradientBrush(startPoint,endPoint,

Color::SeaGreen,customColor);

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

g->FillEllipse(br,200,100,200,100);//нарисовать эллипс кистью (закрашенный)

if (radioButton2->Checked==true) //если выбрана радиокнопка2, то

g->FillEllipse(ii,200,220,200,100);//нарисовать второй эллипс кистью (закрашенный с линейным градиентом)

и рисование рамки в зависимости от того, установлены или нет соответствующие элементы checkbox

if (checkBox1->Checked==true)//если выбран чекбокс1, то нарисовать квадрат

{

g->DrawLine(ki,170,50,450,50);//нарисовать линию

g->DrawLine(ki,170,330,450,330);//нарисовать линию

g->DrawLine(ki,170,50,170,330);//нарисовать линию

g->DrawLine(ki,450,50,450,330);//нарисовать линию

}

if (checkBox2->Checked==true)//если выбран чекбокс2, то нарисовать эллипс

g->DrawEllipse(ki,180,80,250,250);//нарисовать эллипс карандашом (незакрашенный)

Для того, чтобы хранить число запусков в реестре, необходимо создать в нем ключ, например в ветке CurrentUser. Затем в этом ключе создать параметр, хранящий в себе число запусков. При каждом запуске программы необходимо считывать значение этого параметра, анализировать и изменять его значение, а затем записывать его опять в реестр. Чтобы ограничить число запусков программы необходимо соответствующий код расположить в файле «имя созданного проекта».cpp до вызова метода Application::Run.

Для работы с реестром необходимо создать объект-ключ RegistryKey^. Для создания нового ключа в реестре используется функция Registry::ветка реестра->CreateSubKey, для открытия ключа – функция Registry::ветка реестра->OpenSubKey, для записи значения параметра – функция SetValue, для чтения значения параметра – функции GetValueNames и GetValue.

Пример.

//Прочитать нужный ключ реестра

RegistryKey^ rk = nullptr;

rk = Registry::CurrentUser->OpenSubKey("000xxx",true);

if (rk==nullptr) //если ключа нет, то первый запуск.

{

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

RegistryKey^ nk = Registry::CurrentUser->CreateSubKey("000xxx");

nk->SetValue("NewKey", 1);//первый запуск

}

else //ключ есть

{//получить значения из ключа реестра

array<String^>^ name = rk->GetValueNames( );

String^ value = rk->GetValue(name[0])->ToString();

//преобразовать его из строки в целое число

int ww;

ww=Convert::ToInt32(value);

//проверить текущее число запусков

if (ww>3)//если больше 3-х, то программа завершает работу

{ return 1;}

else //если меньше, то

{//увеличение на 1 числа запусков,

ww=ww+1;

//запись его в реестр

rk->SetValue("NewKey", ww);

//после чего программа будет выполняться дальше

} }