Шаг 69.
Microsoft Visual C++ 2010. Начала.
Программирование. Графика. Графические примитивы. Дуга

    На этом шаге мы рассмотрим построение дуги.

    Метод DrawArc рисует дугу - часть эллипса (рисунок 1).


Рис.1. Значения параметров метода DrawArc определяют дугу как часть эллипса

    Инструкция вызова метода в общем виде выглядит так:

  DrawArc(aPen, x, y, w, h, startAngle, sweepAngle);

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

    В инструкции вызова метода DrawArc вместо параметров x, y, w и h можно указать структуру типа Rectangle:

  DrawArc(aPen, aRect, startAngle, sweepAngle);

    Как можно заметить, параметры startAngle и sweepAngle могут принимать как положительные, так и отрицательные значения. В следующем примере проиллюстрирована данная особенность этих параметров.

    В тексте функции drawArc() приведены все возможные комбинации указанных параметров. Соответствующие комбинации отмечены на рисунке 2 цифрами.

    Вот текст приложения, рисующего дуги:

// конструктор
Form1(void)
{
	InitializeComponent();
	//
	//TODO: добавьте код конструктора
	//
	this->Paint += gcnew System::Windows::Forms::PaintEventHandler(this,
            &Form1::drawArc);
}
.    .    .    .    .
void drawArc(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
	Rectangle aRect; // положение и размер прямоугольника
	//прямоугольник размером 60х30,
	// левый верхний угол которого в точке (10, 10)
	aRect = Rectangle(10,10,60,30); // положение и размер

	// вывод дуги внутри прямоугольника
	// первый случай: startAngle > 0 (отсчет угла по часовой стрелке) и 
	// sweepAngle > 0 (дуга рисуется по часовой стрелке)
	e->Graphics->DrawArc(Pens::Black, aRect,          30,  200);

	// второй случай: startAngle > 0 (отсчет угла по часовой стрелке) и 
	// sweepAngle < 0 (дуга рисуется против часовой стрелки)
	e->Graphics->DrawArc(Pens::Black, 100,10,60,30,   30, -200);

	// третий случай: startAngle < 0 (отсчет угла против часовой стрелки) и 
	// sweepAngle > 0 (дуга рисуется по часовой стрелке)
	e->Graphics->DrawArc(Pens::Black, 10,100,60,30,  -30,  200);

	// четвертый случай: startAngle < 0 (отсчет угла против часовой стрелки) и 
	// sweepAngle < 0 (дуга рисуется против часовой стрелки)
	e->Graphics->DrawArc(Pens::Black, 100,100,60,30, -30, -200);
}
Архив проекта можно взять здесь.

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


Рис.2. Результат работы приложения (цифры соотвествуют номерам комментариев приложения)

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




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