
Жарков В.А. - Visual C++ 2005, DirectX 9.0c и Microsoft Agent в компьютерной графике, мультимедиа и играх (Листинги книги) - 2005
.pdfВведение
Это первая в мире книга по версии языка 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,