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);
//после чего программа будет выполняться дальше
} }