Шаг 60.
Microsoft Visual C++ 2010. Начала.
Программирование. Графика. Кисть (текстурная)

    На этом шаге мы рассмотрим особенности использования кисти этого типа.

    Текстурная кисть (TextureBrush) представляет собой рисунок, который обычно загружается во время работы программы из файла (bmp, jpg или gif) или из ресурса. Закраска области текстурной кистью выполняется путем дублирования рисунка внутри области.

    Приведенный ниже текст демонстрирует процесс создания и использования текстурной кисти. Кисть создает конструктор, которому в качестве параметра передается текстура - имя графического файла.

private: System::Void pictureBox1_Paint(System::Object^  sender,
		System::Windows::Forms::PaintEventArgs^  e) {
	float x,y,w,h;

	x = 20;
	y = 20;
	w = 150;
	h = 60;

	TextureBrush^ myBrush; // текстурная кисть
	try
	{
		// загрузить текстуру из файла
		myBrush = gcnew TextureBrush(Image::FromFile(
			Application::StartupPath+"\\purple.jpg"));

		// рисуем текстурной кистью
		e->Graphics->FillRectangle(myBrush, x, y, w, h);
	}
	catch (System::IO::FileNotFoundException^ ex)
	{
		e->Graphics->DrawRectangle(Pens::Black, x, y, w, h);
		e->Graphics->DrawString("Файл с изображением",
			this->Font, Brushes::Black, x, y+5);
		e->Graphics->DrawString(" не найден",
			this->Font, Brushes::Black, x, y+20);
	}
 }
Архив проекта можно взять здесь.

    Результат работы приложения изображен на рисунке 1.


Рис.1. Результат работы приложения

    Изменим последний проект, добавив в него кнопку для выбора файла и компонент Label, где будет отображаться имя выбранного файла. Кроме того, добавим компонент OpenFileDialog для использования окна выбора файла (рисунок 2).


Рис.2. Приложение на этапе разработки

    Результат работы измененного приложения изображен на рисунке 3.


Рис.3. Результат работы приложения

    Приведем текст приложения и прокомментируем его.

.   .   .   .   .   .
Form1(void)
{
	InitializeComponent();
	//
	//TODO: добавьте код конструктора
	//
	// инициализируем переменную именем файла
	fn = Application::StartupPath+"\\purple.jpg";
}
.   .   .   .   .   .
private:
	String^ fn;         // имя файла
		
private: System::Void pictureBox1_Paint(System::Object^  sender,
		 System::Windows::Forms::PaintEventArgs^  e) {
	float x,y,w,h;

	x = 20;
	y = 20;
	w = 250;
	h = 160;

	TextureBrush^ myBrush; // текстурная кисть
	try
	{
		label1->Text = L"Файл: " + fn;
		// загрузить текстуру из файла
		myBrush = gcnew TextureBrush(Image::FromFile(fn));

		// рисуем текстурной кистью
		e->Graphics->FillRectangle(myBrush, x, y, w, h);
	}
	catch (System::IO::FileNotFoundException^ ex)
	{
		e->Graphics->DrawRectangle(Pens::Black, x, y, w, h);
		e->Graphics->DrawString("Файл с изображением",
			this->Font, Brushes::Black, x, y+5);
		e->Graphics->DrawString(" не найден",
			this->Font, Brushes::Black, x, y+20);
	}

 }
private: System::Void button1_Click(System::Object^  sender, 
		System::EventArgs^  e) {
	System::Windows::Forms::DialogResult dr;

	openFileDialog1->FileName = String::Empty; 
	// отобразить диалог Открыть 
	dr = openFileDialog1->ShowDialog(); 
	if (dr == System::Windows::Forms::DialogResult::OK) 
	{ 
		fn = openFileDialog1->FileName; 
		pictureBox1->Invalidate();
	} 
 }
Архив проекта можно взять здесь.

    Для выбора файла используется кнопка Выбрать файл с текстурой. По ее нажатию активизируется обработчик события button1_Click(). Здесь определяется переменная dr, где будет храниться результат закрытия диалогового окна выбора файла, а также очищается имя выбранного файла:

   System::Windows::Forms::DialogResult dr;
   openFileDialog1->FileName = String::Empty; 

    Затем отображается диалоговое окно выбора файла, и если пользователь для его закрытия использовал кнопку OK, запоминается имя выбранного файла в переменной fn, после чего вызывается функция Invalidate(), которая активизирует обработчик pictureBox1_Paint().

    При его выполнении определяются параметры будущего прямоугольника (переменные x, y, w, h) и создается текстурная кисть myBrush. В секции try осуществляется загрузка изображения из выбранного файла и отрисовка текстурной кистью. Если по каким-то причинам не удалось загрузить изображение из файла (файл не найден, выбран файл, в котором нет изображения и т.п.), выполнение операторов из секции try прекращается, и управление передается в секцию catch. При ее выполнении выводится сообщение, что файл с изображением не найден.

    На следующем шаге мы закончим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг