Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Жарков В.А. - Visual C++ 2005, DirectX 9.0c и Microsoft Agent в компьютерной графике, мультимедиа и играх (Листинги книги) - 2005

.pdf
Скачиваний:
306
Добавлен:
13.08.2013
Размер:
1.14 Mб
Скачать

Введение

Это первая в мире книга по версии языка Visual C++ 2005 с новейшим синтаксисом из платформы Visual Studio 2005, которую издательство “Жарков Пресс” получило непосредственно от корпорации Microsoft (США). Сразу же отметим, что все программы из данной книги и с прилагаемого компакт-диска работают не только на платформе Visual Studio 2005, но после небольшого редактирования по правилам из первой главы могут также работать и на платформах предыдущих версий Visual Studio 2004, Visual Studio .NET 203 и Visual Studio .NET 2002.

Платформа Visual Studio (VS) для визуального объектно-ориентированного проектирования приложений дает уникальную возможность соединить в одном высокотехнологичном и наукоемком программном продукте простоту использования настольного калькулятора и мощь компиляторов алгоритмических языков. В данной чрезвычайно насыщенной книге (заменяющей несколько других книг) мы последовательно и всесторонне излагаем методологию обучения программированию на языке Visual C++ 2005 с принципиально новым синтаксисом и интеграции этого языка Visual C++ 2005 (VC++ 2005) с другими языками, комплексами, пакетами, средами и платформами при создании следующих типичных и практически важных приложений: персональная или корпоративная вычислительная система (система компьютерной математики), начиная от простейшего калькулятора и заканчивая сложной высокотехнологичной и наукоемкой системой компьютерного проектирования технологических процессов (СИСКОМПР ТП или CAD/CAM system) для изготовления типичных изделий (деталей, вещей) в различных отраслях народного хозяйства; построение двухмерных и трехмерных геометрических изображений как без использования DirectX, так и с использованием новейшей версии технологии DirectX 9.0c, двухмерные и трехмерные графики разнообразных функций, в том числе, диаграммы изменения во времени различных параметров в промышленности, например, диаграмма “сила обработки заготовки инструментом – ход инструмента”; базы данных и системы управления ими; аналитическое и численное математическое моделирование процессов обработки материала при изготовлении изделий и многие другие приложения. Приведена методика передачи пользователю разработанных нами приложений. Большое количество написанных автором программ из этой книги может быть вставлено в различные приложения и прекрасно работать.

Часть I. Краткие основы нового син-

таксиса Visual C++ 2005

Глава 1. Базовые сведения о новом синтаксисе Visual C++ 2005 и основные определения книги

Для установки на компьютер новейшей среды разработки (платформы, студии) Visual Studio 2005 корпорация Microsoft формулирует системные требования в виде следующей табл. 1.1.

Таблица 1.1.

Требования к компьютеру для инсталляции Visual Studio 2005.

Processor

Minimum: 766 megahertz (MHz) Pentium processor

 

Recommended: 1 gigahertz (GHz) Pentium processor recommended

 

 

Operating

Visual Studio 2005 can be installed on any of the following systems:

System

Microsoft Windows® 2003 Server

 

Windows XP Professional Service Pack 1

 

 

RAM

Minimum: 128 megabytes (MB)

 

Recommended: 256 MB

Hard Disk

Without MSDN: 750 MB of available space required on system drive

 

2 gigabytes (GB) of available space required on installation drive

 

With MSDN: 1.1 GB of available space required on system drive

 

3.2 GB of available space required on installation drive

 

 

CD or DVD

Required

Drive

 

 

 

Display

Minimum: 800 x 600 256 colors

 

Recommended: 1024x768 High Color — 16-bit

 

 

Smart Device

ActiveSync 3.7.1

Development

Microsoft .NET Framework Version 1.1 (for Smartphone 2003 pro-

 

jects)

 

 

Mouse

Microsoft mouse or compatible pointing device

 

 

Глава 2. Методика разработки приложений для выполнения расчетов с эффектами анимации

Листинг 2.1. Наш основной код с тремя переменными a, b, c.

double a, b, c;

a = Convert::ToDouble(textBox1->Text); b = Convert::ToDouble(textBox2->Text); c = a + b;

textBox3->Text = c.ToString();

Второй вариант – с двумя переменными:

double a, b;

a = Convert::ToDouble(textBox1->Text); b = Convert::ToDouble(textBox2->Text); textBox3->Text = (a + b).ToString();

Третий вариант – с одной переменной:

double a;

a = Convert::ToDouble(textBox1->Text); textBox3->Text = (a +

Convert::ToDouble(textBox2->Text)).ToString();

Четвертый вариант – без использования переменных:

textBox3->Text = (Convert::ToDouble(textBox1->Text) + Convert::ToDouble(textBox2->Text)).ToString();

Листинг 2.2. Метод для включения таймера и задания интервала времени.

private: void InitializeTimer()

{

//Включаем таймер: timer1->Enabled = true;

//Генерируем событие Tick через каждый интервал времени, //равный значению свойства Interval:

timer1->Interval = 500;

}

Глава 2. Методика разработки приложений с эффектами анимации

13

Листинг 2.3. Код для создания анимации. Вариант 1.

//Объявляем булеву переменную myText //и задаем ей значение, например, false: bool static myText = false;

private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e)

{

//Задаем чередование двух заголовков формы: if (myText == false)

{

this->Text = "Калькулятор (Calculator)"; //Изменяем значение myText на противоположное: myText = true;

}

else

{

this->Text = "Калькулятор с анимацией" "(Calculator with animation)";

//Изменяем значение myText на противоположное: myText = false;

}

}

Листинг 2.4. Код для создания анимации. Вариант 2.

//Объявляем счетчик (counter) числа интервалов //и задаем его начальное значение:

int static counter = 0;

//Объявляем и задаем число интервалов N_Interval, //после которого один текст сменяется другим: int static N_Interval = 3;

private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e)

{

//Проверяем, значение счетчика counter

//равно или еще нет числу интервалов N_Interval, //после которого один текст сменяется другим: if (counter >= N_Interval)

{

//Если значение счетчика накопилось и равно //N_Interval, то выводим другой текст: this->Text = "Калькулятор (Calculator)"; //Значение счетчика counter снова обнуляем: counter = 0;

14 Жарков В.А. Компьютерная графика, мультимедиа и игры на Visual C++ 2005

}

else

{

//Если значение счетчика еще не накопилось

//и не равно N_Interval, //то выводим первый текст:

this->Text = "Калькулятор с анимацией" "(Calculator with animation)";

//Значение счетчика увеличиваем на 1: counter = counter + 1;

}

}

Листинг 2.5. Код для создания анимации. Вариант 3.

//Объявляем счетчик (counter) числа интервалов //и задаем его начальное значение:

int static counter = 0;

//Объявляем и задаем число интервалов N_Interval, //после которого один текст сменяется другим: int static N_Interval = 3;

//Объявляем и обнуляем счетчик i_Interval_Stop, //который считает число интервалов //до остановки анимации:

int static i_Interval_Stop = 0;

//Объявляем и задаем число интервалов N_Interval_Stop, //по достижении которого анимация прекращается:

int static N_Interval_Stop = 10;

private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e)

{

//Значение счетчика i_Interval_Stop, //который считает число интервалов //до остановки анимации, увеличиваем на 1: i_Interval_Stop = i_Interval_Stop + 1;

//Проверяем число интервалов i_Interval_Stop, //по достижении которого анимация прекращается: if (i_Interval_Stop >= N_Interval_Stop)

timer1->Enabled = false; //Проверяем, значение счетчика counter

//равно или еще нет числу интервалов N_Interval, //после которого один текст сменяется другим: if (counter >= N_Interval)

{

//Если значение счетчика накопилось и равно //N_Interval, то выводим другой текст: this->Text = "Калькулятор (Calculator)";

Глава 2. Методика разработки приложений с эффектами анимации

15

//Значение счетчика counter снова обнуляем: counter = 0;

}

else

{

//Если значение счетчика еще не накопилось

//и не равно N_Interval, //то выводим первый текст:

this->Text = "Калькулятор с анимацией" "(Calculator with animation)";

//Значение счетчика увеличиваем на 1: counter = counter + 1;

}

}

Листинг 2.6. Строка кода, останавливающая анимацию. timer1->Enabled = false;

Листинг 2.7. Строка кода, возобновляющая анимацию.

timer1->Enabled = true;

Листинг 2.8. Код для остановки и возобновления анимации.

//Объявляем булеву переменную OffOn

//и задаем ей значение, например, false: bool static OffOn = false;

private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e)

{

//Чередуем остановку и возобновление анимации //после каждого щелчка кнопки Button:

if (OffOn == false)

{

//Останавливаем анимацию: timer1->Enabled = false;

//Изменяем значение OffOn на противоположное: OffOn = true;

}

else

{

//Возобновляем анимацию: timer1->Enabled = true;

//Изменяем значение OffOn на противоположное: OffOn = false;

}

}

Глава 3. Методика разработки приложений на нескольких формах

Листинг 3.1. Метод button1_Click с нашим кодом для формы Form1.

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)

{

double a, b;

a = Convert::ToDouble(textBox1->Text);

b = Convert::ToDouble(textBox2->Text); Form2^ myForm2 = gcnew Form2(); myForm2->c = a;

myForm2->d = b;

myForm2->Show(); //Выводим как немодальную форму.

}

Листинг 3.2. Строка и метод button1_Click с нашим кодом для Form2.

public: double c, d;

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)

{

double f, g; f = c; g = d;

textBox1->Text = Convert::ToString(f); textBox2->Text = Convert::ToString(g);

textBox3->Text = Convert::ToString(f*g);

}

Листинг 3.3. Код для бегущего слева – направо заголовка.

static int i = 0;

private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e)

{

//Записываем текст заголовка формы в переменную myString: String^ myString = "Калькулятор2_2 (Calculator2_2) "; //Справа-налево появляется i-я буква заголовка: this->Text = myString->Substring(0,i);

//Организовываем цикл вывода следующей i-й буквы: i = i + 1;

Глава 3. Методика разработки приложений на нескольких формах

17

//Удаляем весь текст заголовка: if (i == myString->Length) i = 1;

}

Листинг 3.4. Код для бегущего справа – налево заголовка.

//Объявляем статическую переменную myString //и записываем в нее текст заголовка:

static String^ myString = " Калькулятор2_2 (Calculator2_2)." "Форма 2 (Form 2) ";

//Объявляем статическую переменную i

//и приравниваем ее значение числу знаков заголовка: static int i = myString->Length;

private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e)

{

//Появляется весь текст заголовка и из него

//справа - налево удаляется одна i-я буква заголовка: this->Text = myString->Substring(0,i); //Организовываем цикл удаления следующей i-й буквы: i = i - 1;

//Восстанавливаем весь текст заголовка: if (i == -1) i = myString->Length;

}

Часть II. Методология проектирования графики и печати на принтере

Глава 4. Краткие сведения о графических возможностях Visual Studio

Теперь, когда в предыдущих главах мы научились выполнять простые вычисления с целью получения расчетных данных, перейдем к разработке основных методов визуализации этих данных. Графический интерфейс в последних версиях операционных систем, например, Windows XP и Windows Server 2003, а также вся работа с двухмерной (2D) и трехмерной (3D) графикой на платформах Visual Studio .NET 2002, 2003, 2004 и Visual Studio 2005 основаны на использовании интерфейса устройств графики GDI+ (Graphics Device Interface). Ключевое английское слово Graphics по данной тематике переводится как “графика”. В обозначениях 2D и 3D буква D является первой буквой английского слова Dimension – измерение. К слову, основной оператор при объявлении переменных Dim (в Visual Basic) также произошел от этого слова.

Интерфейс GDI+ делится на следующие три больших категории:

1.Двухмерная (2D) векторная графика (Two-dimensional (2-D) vector graphics).

2.Изображения (Imaging).

3.Типография (Typography).

Кратко рассмотрим каждую из этих категорий.

1. Двухмерная векторная графика

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

GDI+ содержит классы и структуры, которые хранят информацию о примитивах непосредственно, классы, которые хранят информацию о том, как примитивы будут нарисованы, и классы, которые фактически делают рисунок. Например, структура Rectangle хранит местоположение и размер прямоугольника; класс Pen (Перо) хранит информацию о цвете линии, ширине линии и типе линии; класс Graphics (Графика) содержит методы для того, чтобы рисовать линии, прямоугольники, пути, и другие рисунки. Есть также несколько классов Brush (Кисть), которые хранят информацию о том, как замкнутые рисунки и пути будут заполнены цветами или палитрами.

Глава 5. Рисование линий на форме или элементах управления и общая методика печати изображений на принтере

Листинг 5.1. Код для рисования прямой линии.

private: System::Void Form1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e)

{

//Задаем цвет и толщину пера:

Pen^ myPen = gcnew Pen(Color::Black, 3); //Рисуем линию:

e->Graphics->DrawLine(myPen, 10, 15, 100, 120); //Высвобождаем память, выделенную объекту myPen: myPen->Dispose();

}

Листинг 5.2. Код для рисования кривых линий.

private: System::Void Form1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e)

{

//Задаем цвет и толщину пера:

Pen^ myPen = gcnew Pen(Color::Black, 3); //Рисуем эллипс лица: e->Graphics->DrawEllipse(myPen, 0, 0, 200, 220); //Рисуем закрытый глаз как дугу:

e->Graphics->DrawArc(myPen, 35, 35, 35, 35, 180, -180); //Рисуем открытый глаз как эллипс: e->Graphics->DrawEllipse(myPen, 120, 35, 35, 35); //Рисуем нос как линию (сплайн) Безье: e->Graphics->DrawBezier(myPen, 100, 60, 120, 100,

90, 120, 80, 100);

//Рисуем рот как канонический сплайн: Point myPoint1 = Point(60, 140); Point myPoint2 = Point(140, 140); Point myPoint3 = Point(100, 180); Point myPoint4 = Point(60, 140); array<Point>^ apt =

{

myPoint1,

myPoint2,

Соседние файлы в предмете Программирование на C++