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

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

    Штриховая кисть (HatchBrush) закрашивает область путем штриховки. Область может быть заштрихована горизонтальными, вертикальными или наклонными линиями разного стиля и толщины. В таблице 1 перечислены некоторые из возможных стилей штриховки. Полный список стилей штриховки можно найти в справочной системе.

Таблица 1. Некоторые стили штриховки областей
Стиль Штриховка
HatchStyle::LightHorizontal Редкая горизонтальная
HatchStyle::Horizontal Средняя горизонтальная
HatchStyle::NarrowHorizontal Частая горизонтальная
HatchStyle::LightVertical Редкая вертикальная
HatchStyle::Vertical Средняя вертикальная
HatchStyle::NarrowVertical Частая вертикальная
HatchStyle::LargeGrid Крупная сетка из горизонтальных и вертикальных линий
HatchStyle::SmallGrid Мелкая сетка из горизонтальных и вертикальных линий
HatchStyle::DottedGrid Сетка из горизонтальных и вертикальных линий, составленных из точек
HatchStyle::ForwardDiagonal Диагональная штриховка "вперед"
HatchStyle::BackwardDiagonal Диагональная штриховка "назад"
HatchStyle::Percent05 — HatchStyle::Percent90 Точки (степень заполнения 5%, 10%, ..., 90%)
HatchStyle::HorizontalBrick "Кирпичная стена"
HatchStyle::LargeCheckerBoard "Шахматная доска"
HatchStyle::SolidDiamond "Бриллиант" ("Шахматная доска", повернутая на 45 градусов)
HatchStyle::Sphere "Пузырьки"
HatchStyle::ZigZag "Зигзаг"

    В тексте ниже приведена функция, демонстрирующая процесс создания и использования штриховой кисти. При создании кисти конструктору передаются: константа HatchStyle, которая задает вид штриховки, и две константы типа Color, первая из которых определяет цвет штрихов, вторая — цвет фона.

private: System::Void pictureBox1_Paint(System::Object^  sender, 
                              System::Windows::Forms::PaintEventArgs^  e) {
	 // штриховка (HatchBrush-кисть)
	System::Drawing::Drawing2D::HatchBrush^ hBrush = 
		gcnew System::Drawing::Drawing2D::HatchBrush 
		(System::Drawing::Drawing2D::HatchStyle::DottedGrid,
					Color::Black, Color::SkyBlue);
	e->Graphics->FillRectangle(hBrush, 20, 20, 190, 160);
 }
Архив проекта можно взять здесь.

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


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

    Изменим последний проект, добавив возможность выбора штриховки. Для этого разместим поле со списком, содержащим названия видов штриховки, и кнопку, нажатие на которую приведет к отображению прямоугольника с заданным типом штриховки (рисунок 2).


Рис.2. Приложение на стадии проектирования

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

.   .   .   .
Form1(void)
{
	InitializeComponent();
	//
	//TODO: добавьте код конструктора
	//
	// создание кисти
	hBrush = gcnew System::Drawing::Drawing2D::HatchBrush 
		(System::Drawing::Drawing2D::HatchStyle::DottedGrid,
			Color::Black, Color::SkyBlue);
	// задание начальной штриховки
	comboBox1->SelectedIndex = 43;
	comboBox1->Text = L"DottedGrid";
	// массив с видами штриховок
	hStyle = gcnew array<System::Drawing::Drawing2D::HatchStyle>(53) {
		System::Drawing::Drawing2D::HatchStyle::Horizontal, 
		System::Drawing::Drawing2D::HatchStyle::Vertical, 
                System::Drawing::Drawing2D::HatchStyle::ForwardDiagonal, 
		System::Drawing::Drawing2D::HatchStyle::BackwardDiagonal, 
                System::Drawing::Drawing2D::HatchStyle::Cross,
		System::Drawing::Drawing2D::HatchStyle::DiagonalCross, 
                System::Drawing::Drawing2D::HatchStyle::Percent05,
		System::Drawing::Drawing2D::HatchStyle::Percent10, 
                System::Drawing::Drawing2D::HatchStyle::Percent20, 
		System::Drawing::Drawing2D::HatchStyle::Percent25, 
                System::Drawing::Drawing2D::HatchStyle::Percent30, 
		System::Drawing::Drawing2D::HatchStyle::Percent40, 
                System::Drawing::Drawing2D::HatchStyle::Percent50,
		System::Drawing::Drawing2D::HatchStyle::Percent60, 
                System::Drawing::Drawing2D::HatchStyle::Percent70,
		System::Drawing::Drawing2D::HatchStyle::Percent75, 
                System::Drawing::Drawing2D::HatchStyle::Percent80,
		System::Drawing::Drawing2D::HatchStyle::Percent90, 
                System::Drawing::Drawing2D::HatchStyle::LightDownwardDiagonal,
		System::Drawing::Drawing2D::HatchStyle::LightUpwardDiagonal, 
                System::Drawing::Drawing2D::HatchStyle::DarkDownwardDiagonal, 
		System::Drawing::Drawing2D::HatchStyle::DarkUpwardDiagonal, 
                System::Drawing::Drawing2D::HatchStyle::WideDownwardDiagonal, 
		System::Drawing::Drawing2D::HatchStyle::WideUpwardDiagonal, 
                System::Drawing::Drawing2D::HatchStyle::LightVertical, 
		System::Drawing::Drawing2D::HatchStyle::LightHorizontal, 
                System::Drawing::Drawing2D::HatchStyle::NarrowVertical, 
		System::Drawing::Drawing2D::HatchStyle::NarrowHorizontal, 
                System::Drawing::Drawing2D::HatchStyle::DarkVertical, 
		System::Drawing::Drawing2D::HatchStyle::DarkHorizontal, 
                System::Drawing::Drawing2D::HatchStyle::DashedDownwardDiagonal, 
		System::Drawing::Drawing2D::HatchStyle::DashedUpwardDiagonal, 
                System::Drawing::Drawing2D::HatchStyle::DashedHorizontal, 
		System::Drawing::Drawing2D::HatchStyle::DashedVertical, 
                System::Drawing::Drawing2D::HatchStyle::SmallConfetti, 
		System::Drawing::Drawing2D::HatchStyle::LargeConfetti, 
                System::Drawing::Drawing2D::HatchStyle::ZigZag, 
		System::Drawing::Drawing2D::HatchStyle::Wave, 
                System::Drawing::Drawing2D::HatchStyle::DiagonalBrick, 
		System::Drawing::Drawing2D::HatchStyle::HorizontalBrick, 
                System::Drawing::Drawing2D::HatchStyle::Weave, 
		System::Drawing::Drawing2D::HatchStyle::Plaid, 
                System::Drawing::Drawing2D::HatchStyle::Divot, 
		System::Drawing::Drawing2D::HatchStyle::DottedGrid, 
                System::Drawing::Drawing2D::HatchStyle::DottedDiamond, 
		System::Drawing::Drawing2D::HatchStyle::Shingle, 
                System::Drawing::Drawing2D::HatchStyle::Trellis, 
		System::Drawing::Drawing2D::HatchStyle::Sphere, 
                System::Drawing::Drawing2D::HatchStyle::SmallGrid, 
		System::Drawing::Drawing2D::HatchStyle::SmallCheckerBoard, 
                System::Drawing::Drawing2D::HatchStyle::LargeCheckerBoard, 
		System::Drawing::Drawing2D::HatchStyle::OutlinedDiamond, 
                System::Drawing::Drawing2D::HatchStyle::SolidDiamond};
		}
.   .   .   .
private:
	System::Drawing::Drawing2D::HatchBrush^ hBrush; // кисть
	// массив стилей кисти
	array <System::Drawing::Drawing2D::HatchStyle> ^hStyle;

private: System::Void pictureBox1_Paint(System::Object^  sender, 
		System::Windows::Forms::PaintEventArgs^  e) {
	 // штриховка (HatchBrush-кисть)
	e->Graphics->FillRectangle(hBrush, 20, 20, 190, 160);
 }
private: System::Void button1_Click(System::Object^  sender, 
		System::EventArgs^  e) {
	 // задание кисти с новым типом штриховки
	 hBrush = gcnew System::Drawing::Drawing2D::HatchBrush 
		(hStyle[comboBox1->SelectedIndex], Color::Black, Color::SkyBlue); 
	 // перерисовка области
	 pictureBox1->Invalidate();
 }
Архив проекта можно взять здесь.

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


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

    Принцип работы этого приложения практически не отличается от приложения, приведенного на предыдущем шаге. Здесь создается массив штриховок hStyle, который заполняется в конструкторе. Также в конструкторе задаются начальные значения компонента ComboBox (номер и название начальной штриховки), который будет содержать названия типов штриховок.

    При выборе соотвествтующего типа штриховки из компонента comboBox1 и нажатии клавиши Штриховка в обработчике button1_Click() формируется кисть с заданным типом штриховки, после чего вызывается функция Invalidate(), активизирующая метод pictureBox1_Paint(), где происходит отрисовка прямоугольника.

    Попробуем изменить эту программу, воспользовавшись тем, что виды штриховок составляют собой перечисление. Попытаемся выбирать штриховку не из массива, а из перечисления. Сначала посмотрим, какие значения располагаются в перечислении.

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


Рис.4. Элементы перечисления

    Из этого рисунка видно, что некоторые значения перечисления повторяются (выделены краснымы прямоугольниками). Для исключения повторений воспользуемся следующей конструкцией:

 // исключение повторений
 if (i != 0)
	 if (i>=1 && i<=4) i++;
	 else i += 3;

    Из рисунка 4 видно, что если из поля со списком выбран элемент с номером 1, то из массива видов штриховок нужно брать элемент с номером 2, если выбран элемент с номером 2, то нужно брать элемент с номером 3 и т.д. Последний элемент, для которого нужно выполнить эту операцию, является элемент с номером 4. Для элементов, номера которых в компоненте ComboBox, превышают 4, используется другое правило, а именно увеличение номера на 3. Исключение только делается для элемента с номером 0.

    Данный алгоритм позволяет избавиться от массива с видами штриховок.

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

.   .   .   .   .
Form1(void)
{
	InitializeComponent();
	//
	//TODO: добавьте код конструктора
	//
	// создание кисти
	hBrush = gcnew System::Drawing::Drawing2D::HatchBrush 
		(System::Drawing::Drawing2D::HatchStyle::DottedGrid,
			Color::Black, Color::SkyBlue);
	// задание начальной штриховки
	comboBox1->SelectedIndex = 43;
	comboBox1->Text = L"DottedGrid";
}

.   .   .   .   .
private:
	System::Drawing::Drawing2D::HatchBrush^ hBrush; // кисть

private: System::Void pictureBox1_Paint(System::Object^  sender, 
		System::Windows::Forms::PaintEventArgs^  e) {
	 // штриховка (HatchBrush-кисть)
	e->Graphics->FillRectangle(hBrush, 20, 20, 190, 160);
 }
private: System::Void button1_Click(System::Object^  sender, 
		System::EventArgs^  e) {
	 // задание кисти с новым типом штриховки
	 int i = comboBox1->SelectedIndex;
	 // исключение повторений
	 if (i != 0)
		 if (i>=1 && i<=4) i++;
		 else i += 3;
	 // заполнение массива видами штриховок
	 Array^ a = Enum::GetValues 
			( System::Drawing::Drawing2D::HatchStyle::typeid );
	 // выбор требуемой штриховки
	 System::Drawing::Drawing2D::HatchStyle z = 
	 	 (System::Drawing::Drawing2D::HatchStyle) a->GetValue(i);
	 // создание соответствующей кисти
	 hBrush = gcnew System::Drawing::Drawing2D::HatchBrush 
		(z, Color::Black, Color::SkyBlue);
	 // перерисовка области
	 pictureBox1->Invalidate();
 }
Архив проекта можно взять здесь.

    В качестве упражнения можно дополнить приведенное приложение кнопками выбора цвета штрихов и фона.

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




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