, чтобы программа узнавала функцию rand()
— функцию получения случайного числа. Почему именно в этот файл, подсказывает компилятор. Файл stdafx.h можно открыть прямо из окна Solution Explorer (папка Source Files) через контекстное меню файла.
Глава
11. Компоненты, создающие интерфейс между пользователем и
приложением
391 Рис 11.87. Автоматическая разрисовка экрана и ход этого процесса
Листинг
11.23
#pragma once namespace Timer2011 { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing;
///
/// Summary for Form1
/// public ref class Form1 : public System::Windows::Forms::Form
{ public:
Form1(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
} protected:
///
392 Часть II. Приложения Windows Form
/// Clean up any resources being used.
///
Form1()
{ if (components)
{ delete components;
}
} private: System::Windows::Forms::Button^ button1; private: System::Windows::Forms::Timer^ timer1; private: System::Windows::Forms::ProgressBar^ progressBar1; private: System::ComponentModel::IContainer^ components; protected: private:
///
/// Required designer variable.
///
#pragma region Windows Form Designer generated code
///
/// Required method for Designer support — do not modify
/// the contents of this method with the code editor.
/// void InitializeComponent(void)
{ this->components = (gcnew System::ComponentModel::Container()); this->button1 = (gcnew System::Windows::Forms::Button()); this->timer1 = (gcnew System::Windows::Forms::Timer(this-
>components)); this->progressBar1 = (gcnew
System::Windows::Forms::ProgressBar()); this->SuspendLayout();
//
// button1
// this->button1->Location = System::Drawing::Point(22, 13); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(113, 43); this->button1->TabIndex = 0; this->button1->Text = L"Пуск/останов таймера this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this,
&Form1::button1_Click_1);
Глава
11. Компоненты, создающие интерфейс между пользователем и
приложением
393
//
// timer1
// this->timer1->Tick += gcnew System::EventHandler(this,
&Form1::timer1_Tick);
//
// progressBar1
// this->progressBar1->Location = System::Drawing::Point(22, 62); this->progressBar1->Name = L"progressBar1"; this->progressBar1->Size = System::Drawing::Size(113, 23); this->progressBar1->TabIndex = 1;
//
// Form1
// this->AutoScaleDimensions = System::Drawing::SizeF(8, 16); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(282, 255); this->Controls->Add(this->progressBar1); this->Controls->Add(this->button1); this->Name = L"Form1"; this->Text = L"Form1"; this->ResumeLayout(false);
}
#pragma endregion private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e)
{
Color ^col = gcnew Color();
Pen ^pen = gcnew Pen(col->Black);
чтобы создать графический объект, надо получить ссылку на него
выполнив метод CreateGraphics() компонента (формы)
Graphics ^im = this->CreateGraphics(); int x1,x2,y1,y2; x1=rand(); функция получения случайного числа x2=rand(); y1=rand(); y2=rand(); pen->Width=5; ширина пера для рисования линии
надо привести интервалы случайных чисел, чтобы они попадали в форму if(x1 > 200) x1=200-(x1%200);
394 Часть II. Приложения Windows Form pen->Color=Color::FromArgb(x1); if(x2 > 200) x2=200-(x2%200); if(y1 > 200) y1=200-(y1%200); if(y2 > 200) y2=200-(y2%200); pen->Color=Color::FromArgb(x1,x2,y1,y2); im->DrawLine(pen,x1,y1,x2,y2);
рисует линию между 2-мя точками (и (x2,y2)*/ this->progressBar1->Value++;
} private: System::Void button1_Click_1(System::Object^ sender,
System::EventArgs^ e)
{ this->progressBar1->Value=0;
//включение/отключение таймера if(!timer1->Enabled) timer1->Enabled=true; else timer1->Enabled=false;
}
};
} Компонент Этот компонент мы использовали в предыдущем примере. Компонент находится в списке
All Windows Forms палитры компонентов. Этот компонент создает индикатор некоторого процесса, благодаря чему можно наблюдать ход процесса во времени. Прямоугольный индикатор при достаточно длительном процессе постепенно
заполняется символом-заполнителем слева направо, причем заполнение завершается с окончанием самого процесса. Это заполнение организовано с помощью свойств и методов компонента Свойства
Min и
Max задают интервал значений индикатора. Свойство
Value
(его надо изменять самому) определяет текущую позицию индикатора внутри интервала
Min
— Свойство
Step задает начало отсчета для величины
Value
Глава
11. Компоненты, создающие интерфейс между пользователем иприложением395 Метод
PerformStep()
вызывает изменение свойства
Value на величину 1. Если требуется задать большую величину приращения, следует сначала выполнить метод
Perform(n)
, который задаст шаг приращения, равный Чтобы организовать работу компонента
ProgressBar по отображению хода процесса, надо использовать компонент timer
: включить счетчик времени до начала процесса, установить значение свойства
Value компонента в ноль (
ProgressBar1->Value=0;
), а в обработчике события
Tick наращивать значение. После окончания контролируемого процесса надо выключить таймер и скрыть сам индикатор (
ProgressBar1->Visible=false;
). Пример совместной работы
ProgressBar с компонентом Timer показан в разд. "Компонент Timer" этой главы. Компонент Компонент находится в списке All Windows Forms палитры компонентов. Он предназначен для выбора файлов, выводит на экран стандартное окно Windows для выбора и открытия файлов. Чтобы начать диалог по поиску файла, надо использовать метод
ShowDialog()
. Если установить свойство
Multiselect в true
, то можно выбрать группу файлов. Можно воспользоваться свойством
ShowReadOnly
, которое дает возможность появиться галочке рядом с файлом, если он имеет тип "только для чтения. Свойство
Filter задает условие фильтрации файлов (чтобы выбирались только те, которые указаны в фильтре. Компонент при добавлении в форму не появляется в форме, а помещается на специальный поддон, расположенный в нижней части окна дизайнера форм (как и многие другие компонеты:
ImageList
,
Timer и др. Кстати, если требуется открыть папку вместо файла, то следует воспользоваться классом Диалоговое окно для выбора файла появляется в режиме исполнения приложения в момент выполнения метода
ShowDialog()
. Когда пользователь в диалоговом окне нажимает на кнопку Открыть (или Open — это зависит от установленной у вас версии Windows), метод
ShowDialog()
возвращает значение которое сравнивается со значением такого же свойства у формы. А в форме мы его устанавливаем равным О. Это значит, что если возвращенное значение тоже будет Ото метод сработал без ошибок, и окно открылось. Теперь если нажать в окне на кнопку Открыть, то окно закроется, и имя выбранного файла поместится в свойство компонента fileName
, откуда его можно в дальнейшем брать и использовать по назначению. На рис. 11.88 показан перечень свойств компонента
OpenFileDialog и результат работы компонента по выбору текстового файла и выводу его содержимого в
ListBox
396 Часть II. Приложения Windows Рис 11.88. Свойства и результат работы компонента по выбору текстового файла и вывода его содержимого в Строка фильтра в свойстве
Filter задается по правилам, видным из следующего примера
Text files (*.txt)|*.txt|All files (*.*)|*.* Так задаются фильтры для выборки текстовых файлов или всех файлов. Когда откроется диалоговое окно, тов его поле Тип файлов (если раскрыть выпадающий список) увидим все заданные типы, и именно те, которые начинаются с наименования группы. Например, если задать, чтобы высветились все текстовые файлы и все файлы Word, тов этом случае строка фильтра будет такой
Text Files (*.txt)|*.txt|Word Files (*.doc) а в поле типов файлов будет две строки
Text Files *.txt
Word Files *.doc Далее можно выбирать любой тип и открывать соответствующий файл (названия типа выводятся в диалоговом окне для информации.
Глава
11. Компоненты, создающие интерфейс между пользователем и
приложением
397 Допустим, мы хотим выбрать файлы изображений. В этом случае зададим такой фильтр
Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF|All files (*.*)|*.* В листинге 11.24 приведен пример работы с компонентом Листинг 11.24
#pragma once namespace OpenDialog2011 { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::IO; using namespace System::Text; public ref class Form1 : public System::Windows::Forms::Form
{ public:
Form1(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
} protected:
///
/// Clean up any resources being used.
///
Form1()
{ if (components)
{ delete components;
}
} private: System::Windows::Forms::Button^ button1; private: System::Windows::Forms::OpenFileDialog^ openFileDialog1;
398 Часть II. Приложения Windows Form
private: System::Windows::Forms::Button^ button2; protected: private: System::Windows::Forms::ListBox^ listBox1; private:
///
/// Required designer variable. int fix;
StreamWriter ^sw;
//==========================================================
//================================================================
///
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
///
/// Required method for Designer support — do not modify
/// the contents of this method with the code editor.
/// void InitializeComponent(void)
{ this->button1 = (gcnew System::Windows::Forms::Button()); this->listBox1 = (gcnew System::Windows::Forms::ListBox()); this->openFileDialog1 = (gcnew
System::Windows::Forms::OpenFileDialog()); this->button2 = (gcnew System::Windows::Forms::Button()); this->SuspendLayout();
//
// button1
// this->button1->Location = System::Drawing::Point(12, 1); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(156, 23); this->button1->TabIndex = 0; this->button1->Text = Выбрать текстовый файл this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this,
&Form1::button1_Click);
//
// listBox1
// this->listBox1->FormattingEnabled = true; this->listBox1->Location = System::Drawing::Point(12, 30); this->listBox1->Name = L"listBox1";
Глава
11. Компоненты, создающие интерфейс между пользователем и
приложением
399
this->listBox1->Size = System::Drawing::Size(156, 30); this->listBox1->TabIndex = 1;
//
// openFileDialog1
// this->openFileDialog1->FileName = L"openFileDialog1"; this->openFileDialog1->Filter = L"Text files (*.txt)|*.txt|Word files
(*.doc)|*.doc";
//
// button2
// this->button2->Location = System::Drawing::Point(180, 1); this->button2->Name = L"button2"; this->button2->Size = System::Drawing::Size(25, 73); this->button2->TabIndex = 2; this->button2->Text = Выход this->button2->UseVisualStyleBackColor = true; this->button2->Click += gcnew System::EventHandler(this,
&Form1::button2_Click);
//
// Form1
// this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(218, 74); this->Controls->Add(this->button2); this->Controls->Add(this->listBox1); this->Controls->Add(this->button1); this->Name = L"Form1"; this->Text = L"Form1"; this->ResumeLayout(false);
}
#pragma endregion private: System::Void button1_Click(System::Object^ sender,
System::EventArgs^ e)
{
Значения OK,Cancel... достаются как
System::Windows::Forms::DialogResult::
(мы разрабатываем приложения типа Windows Forms и данные берем из класса Forms)*/
Stream^ s;
в Form1 задано свойство DialogResult=OK и с ним будет
сравниваться ShowDialog() this->DialogResult= System::Windows::Forms::DialogResult::OK;
400 Часть II. Приложения Windows Form
//ShowDialog() возвращает имя файла в FileName if(this->openFileDialog1->ShowDialog()==
System::Windows::Forms::DialogResult::OK)
/*ShowDialog() возвращает переменную типа DialogResult */
{ if( (s = this->openFileDialog1->OpenFile()) != nullptr )
{ здесь идут операторы чтения файла из потока
String ^path=this->openFileDialog1->FileName;
участок чтения содержимого открытого файла в ListBox
файл должен быть записан ом как текстовый в кодировке Юникод if ( !File::Exists( path ) )
{
// Create a file to write to sw = File::CreateText( path ); // StreamWriter^ try
{ sw->WriteLine( "Hello" ); sw->WriteLine( "And" ); sw->WriteLine( "Welcome" );
} finally
{ if ( sw ) delete (IDisposable^)(sw);
}
}
// Open the file to read from
TextReader ^ sr = File::OpenText( path ); try
{
String^ s = ""; while ( s = sr->ReadLine() )
{ this->listBox1->Items->Add(s);
}
} finally
{ if ( sr ) delete (IDisposable^)(sr);
}
}
Глава
11. Компоненты, создающие интерфейс между пользователем и
приложением
401
конец участка чтения файла
} else
MessageBox::Show (Ошибка открытия файла
} private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e)
{ this->Close();
}
};
} Перед компиляцией приложения надо включить в файл stdafx.cpp следующие дополнительные строки
#include
#include
#include
#include При подготовке текстового файла с помощью программы Блокнот текст следует сохранять в кодировке UTF-8. Компонент Компонент находится в списке All Windows Forms палитры компонентов. C помощью этого компонента можно сохранять файл в нужном месте файловой структуры также, как это делается в Windows. Но файл сам по себе не сохраняется, т. к. компонент дает только путь к будущему месту расположения файла. На пользователе лежит обязанность самому написать участок программы для сохранения файла. Как ив, в этом компоненте применяется метод
ShowDialog()
для открытия диалогового окна в режиме исполнения. Файл можно открыть в режиме чтения/записи, используя метод Компонент при добавлении его в форму появляется не в самой форме, а на поддоне, расположенном в нижней части окна дизайнера форм (рис. 11.89). Перечень свойств
SaveFileDialog приведен также на рис. 11.89. Почти все свойства компонента совпадают со свойствами
OpenFileDialog
. Отметим только свойство
OverwritePrompt
, которое (если оно установлено в true
), вызывает появление диалогового окна Save As. Когда пользователь выбирает имя файла и нажимает на кнопку Save в диалоговом окне, метод заносит в свойство
FileName компонента имя файла и путь к нему. Никакой перезаписи файла при этом не происходит. Отсюда следует, что
402 Часть II. Приложения Windows для записи файла в необходимое место файловой структуры нужно применять методы сохранения файла. Приведем пример приложения, которое читает текстовый файл, подготовленный с помощью WordPad в Юникоде и переписывает его в другое место под именем, которое мы выбираем в диалоговом окне. Затем файл с целью проверки читается в другое окно. Вид подготовленного файла, формы приложения в режиме дизайна и исполнения показан на рис. 11.90. Текст приложения приводится в листинге 11.25. Рис 11.89. Свойства компонента Рис 11.90. Пример одновременного применения
OpenFileDialog и
SaveFileDialog
Глава
11. Компоненты, создающие интерфейс между пользователем и
приложением
403 Листинг 11.25
#pragma once namespace My71SaveFileDialog { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::IO; для ввода/вывода using namespace System::Text; public ref class Form1 : public System::Windows::Forms::Form
{ public:
Form1(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
} protected:
///
/// Clean up any resources being used.
///
Form1()
{ if (components)
{ delete components;
}
} private: System::Windows::Forms::SaveFileDialog^ saveFileDialog1; private: System::Windows::Forms::OpenFileDialog^ openFileDialog1; private: System::Windows::Forms::Button^ button1; private: System::Windows::Forms::ListBox^ listBox1; private: System::Windows::Forms::ListBox^ listBox2; private: System::Windows::Forms::Button^ button2; protected: private:
///
/// Required designer variable.
//================================================================= void LoadFromFile(String ^File, ListBox ^lb)
404 Часть II. Приложения Windows Form{
/*
Этот метод открывает текстовый файл, читает все его строки в строку String ^ и закрывает файл. Строки должны отделяться друг от друга разделителем "/"
*/
String ^d, ^b = File::ReadAllText(File); надо будет выделять по разделителю "/")*/ lb->Items->Clear();
Разборка длинной строки на строки, отделенные друг от друга разделителями while(b->Length > 0)
{ int i=b->IndexOf("/"); поиск го вхождения подстроки в строку d=b->Substring(0,i); lb->Items->Add(d); b=b->Substring(i+1,b->Length — d->Length -1);
}
}
//--------------------------------------------------- void SaveToFile(String ^File,ListBox ^lb)
{
String ^a,^b; int j=lb->Items->Count;
File::Delete(File); for(int i=0; i < j; i++)
{ Чтение строк ChekedListBox в a и формирование длинной строки в b*/ a=lb->Items[i]->ToString(); b+=a->Concat(a,"/"); добавка
разделителя строк Этот метод открывает файл, добавляет к нему строку типа String ^, закрывает файл. Если файл не существует, он создается */
} //for
File::AppendAllText(File, b);
}
//================================================================
///
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
///
/// Required method for Designer support — do not modify
/// the contents of this method with the code editor.
/// void InitializeComponent(void)
{ this->saveFileDialog1 = (gcnew
System::Windows::Forms::SaveFileDialog());
Глава
11. Компоненты, создающие интерфейс между пользователем и
приложением
405
this->openFileDialog1 = (gcnew
System::Windows::Forms::OpenFileDialog()); this->button1 = (gcnew System::Windows::Forms::Button()); this->button2 = (gcnew System::Windows::Forms::Button()); this->listBox1 = (gcnew System::Windows::Forms::ListBox()); this->listBox2 = (gcnew System::Windows::Forms::ListBox()); this->SuspendLayout();
//
// saveFileDialog1
// this->saveFileDialog1->Filter = L"Text files (*.*)|*.txt";
//
// openFileDialog1
// this->openFileDialog1->FileName = L"openFileDialog1"; this->openFileDialog1->Filter = L"Text files (*.*)|*.txt";
//
// button1
// this->button1->Location = System::Drawing::Point(0, 9); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(90, 40); this->button1->TabIndex = 0; this->button1->Text = Копировать файл this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this,
&Form1::button1_Click);
//
// button2
// this->button2->Location = System::Drawing::Point(173, 9); this->button2->Name = L"button2"; this->button2->Size = System::Drawing::Size(33, 43); this->button2->TabIndex = 1; this->button2->Text = Выход this->button2->UseVisualStyleBackColor = true; this->button2->Click += gcnew System::EventHandler(this,
&Form1::button2_Click);
//
// listBox1
// this->listBox1->FormattingEnabled = true; this->listBox1->Location = System::Drawing::Point(0, 58); this->listBox1->Name = L"listBox1"; this->listBox1->Size = System::Drawing::Size(206, 43); this->listBox1->TabIndex = 2;
406 Часть II. Приложения Windows Form
//
// listBox2
// this->listBox2->FormattingEnabled = true; this->listBox2->Location = System::Drawing::Point(0, 109); this->listBox2->Name = L"listBox2"; this->listBox2->Size = System::Drawing::Size(206, 43); this->listBox2->TabIndex = 3;
//
// Form1
// this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(207, 164); this->Controls->Add(this->listBox2); this->Controls->Add(this->listBox1); this->Controls->Add(this->button2); this->Controls->Add(this->button1); this->Name = L"Form1"; this->Text = L"Form1"; this->ResumeLayout(false);
}
#pragma endregion private: System::Void button2_Click(System::Object^ sender,
System::EventArgs^ e)
{ this->Close();
} private: System::Void button1_Click(System::Object^ sender,
System::EventArgs^ e)
{
//ShowDialog() возвращает имя файла в FileName this->openFileDialog1->ShowDialog();
String ^a=this->openFileDialog1->FileName;
LoadFromFile(a, this->listBox1); Загрузка файла в ListBox1
Выбор имении пути для выходного файла с помощью SaveFileDialog/ Имя файла будет в FileName*/ this->saveFileDialog1->ShowDialog(); a=this->saveFileDialog1->FileName;
SaveToFile(a,this->listBox1);
сохранение файла из Listbox1
чтение сохраненного файла в ListBox2 this->openFileDialog1->ShowDialog(); a=this->openFileDialog1->FileName;
LoadFromFile(a, this->listBox2);
}
};
}
Глава
11. Компоненты, создающие интерфейс между пользователем иприложением407 Компонент Компонент находится в списке