Жарков В.А. - Visual C++ 2005, DirectX 9.0c и Microsoft Agent в компьютерной графике, мультимедиа и играх (Листинги книги) - 2005
.pdf50 Жарков В.А. Компьютерная графика, мультимедиа и игры на Visual C++ 2005
myForm13->d = d; myForm13->x_min = x_min; myForm13->x_max = x_max; myForm13->Show();
}
Листинг 16.5. Метод для выполнения анимации.
//Объявляем булеву переменную myColor со значением false: bool static myColor = false;
private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e)
{
//Вводим анимацию: if (myColor == false)
{
//Выводим желтый цвет поля текста: label1->BackColor = Color::Yellow;
//Изменяем значение myColor на противоположное: myColor = true;
}
else
{
//Выводим белый цвет поля текста: label1->BackColor = Color::White;
//Изменяем значение myColor на противоположное: myColor = false;
}
}
Листинг 16.6. Метод для выполнения анимации.
//Объявляем булеву переменную myColor со значением false: bool static myColor = false;
private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e)
{
//Вводим анимацию: if (myColor == false)
{
//Выводим черный цвет текста: pictureBox1->ForeColor = Color::Black; //Изменяем значение myColor на противоположное: myColor = true;
}
else
Глава 16. Графики типичных функций |
51 |
{
//Выводим белый цвет текста: pictureBox1->ForeColor = Color::White; //Изменяем значение myColor на противоположное: myColor = false;
}
}
Глава 17. Рисование при помощи перемещения мыши
Листинг 17.1. Объявляем глобальные переменные и записываем наш код.
//Объявляем глобальные переменные
//для координат "x" и "y" указателя мыши
//в момент нажатия кнопки мыши и перемещения мыши: public: int x_MouseDown, y_MouseDown;
public: int x_MouseMove, y_MouseMove;
//Чтобы рисование осуществлялось //только после каждого щелчка кнопки, //объявляем переключатель рисования //в виде глобальной переменной OffOn: bool static OffOn = false;
private:
System::Void Form1_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e)
{
//Определяем координаты "x" и "y" указателя мыши //в момент нажатия кнопки мыши:
x_MouseDown = e->X; y_MouseDown = e->Y;
//Изменяем значение OffOn на противоположное: OffOn = true;
}
Листинг 17.2. Метод Form1_MouseMove для перемещения мыши.
private:
System::Void Form1_MouseMove(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e)
{
//Объявляем объект "g" класса Graphics //и при помощи функции CreateGraphics //предоставляем ему возможность рисования
//на this форме Form1:
Graphics^ g = this->CreateGraphics();
//Определяем координаты "x" и "y" указателя мыши //в моменты перемещения мыши:
x_MouseMove = e->X;
Глава 17. Рисование при помощи перемещения мыши |
53 |
y_MouseMove = e->Y;
//Выбираем перо "myPen" красного цвета Red //толщиной в 3 пикселя:
Pen^ myPen = gcnew Pen(Color::Red, 3);
//Если переключатель рисования
//в виде переменной OffOn равен true: if (OffOn == true)
{
//после нажатия кнопки мыши и перемещения мыши //рисуется линия заданного цвета и толщины: g->DrawLine(myPen, x_MouseDown, y_MouseDown,
x_MouseMove, y_MouseMove);
//Задаем предыдущей позиции указателя мыши //координаты данной позиции указателя мыши: x_MouseDown = x_MouseMove;
y_MouseDown = y_MouseMove;
}
}
Листинг 17.3. Метод Form1_MouseUp для освобождения кнопки мыши.
private:
System::Void Form1_MouseUp(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e)
{
//Изменяем значение OffOn на противоположное: OffOn = false;
}
Листинг 17.4. Метод button1_Click для стирания рисунка.
private:
System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
//Объявляем объект "g" класса Graphics: Graphics^ g = this->CreateGraphics();
//Очищаем (Clear) клиентскую область //формы Form1 от рисунка: g->Clear(BackColor);
}
Глава 18. Рисование линий при помощи нажатия кнопки мыши
Листинг 18.1. Объявляем глобальные переменные и записываем наш код.
//Объявляем глобальные переменные
//для координат "x" и "y" указателя мыши //в момент 1-го и 2-го нажатий кнопки мыши: public: int x_MouseDown_1, y_MouseDown_1,
x_MouseDown_2, y_MouseDown_2;
//Чтобы рисование осуществлялось //только после каждого щелчка кнопки, //объявляем переключатель рисования //в виде глобальной переменной OffOn: bool static OffOn = false;
private:
System::Void Form1_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e)
{
//Объявляем объект "g" класса Graphics //и при помощи функции CreateGraphics //предоставляем ему возможность рисования
//на this форме Form1:
Graphics^ g = this->CreateGraphics();
//Выбираем перо "myPen" красного цвета Red //толщиной в 3 пикселя:
Pen^ myPen = gcnew Pen(Color::Red, 3);
//Определяем координаты "x" и "y" указателя мыши //в момент нажатия кнопки мыши:
x_MouseDown_2 = e->X; y_MouseDown_2 = e->Y;
//Проверяем условие для переменной OffOn: //Если переменная OffOn равна //исходному значению false,
if (OffOn == false)
{
//то задаем координаты указателя мыши //после первого нажатия кнопки мыши: x_MouseDown_1 = x_MouseDown_2;
Глава 18. Рисование линий при помощи нажатия кнопки мыши |
55 |
y_MouseDown_1 = y_MouseDown_2;
//Изменяем значение OffOn на противоположное: OffOn = true;
}
else
{
//Если переключатель в виде переменной OffOn //равен true, то рисуем линию между предыдущей //и последующей позицией указателя мыши //в момент нажатия кнопки мыши:
g->DrawLine(myPen, x_MouseDown_1, y_MouseDown_1, x_MouseDown_2, y_MouseDown_2);
//Задаем предыдущей позиции указателя мыши //координаты данной позиции указателя мыши: x_MouseDown_1 = x_MouseDown_2; y_MouseDown_1 = y_MouseDown_2;
}
}
Листинг 18.2. Метод button1_Click для стирания рисунка.
private:
System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
//Объявляем объект "g" класса Graphics: Graphics^ g = this->CreateGraphics(); //Очищаем (Clear) клиентскую область //формы Form1 от рисунка: g->Clear(BackColor);
//Чтобы рисование осуществлялось //только от позиции курсора на предыдущем щелчке
//до позиции курсора на данном щелчке кнопки мыши, //задаем переключателю рисования
//в виде глобальной переменной OffOn //первоначальное значение:
OffOn = false;
}
Глава 19. Рисование прямоугольников и эллипсов при помощи нажатия кнопки мыши
Листинг 19.1. Объявляем глобальные переменные и записываем наш код.
//Объявляем глобальные переменные для координат "x" и "y" //указателя мыши в момент нажатия кнопки мыши:
public: int x_MouseDown_1, y_MouseDown_1;
private:
System::Void pictureBox1_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e)
{
x_MouseDown_1 = e->X; y_MouseDown_1 = e->Y;
}
Листинг 19.2. Метод pictureBox1_MouseUp для обработки отпускания кнопки.
private:
System::Void pictureBox1_MouseUp(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e)
{
//Выбираем перо "myPen" черного цвета Black //толщиной в 3 пикселя:
Pen^ myPen = gcnew Pen(Color::Black, 3);
//Объявляем объект "g" класса Graphics и предоставляем //ему возможность рисования на pictureBox1:
Graphics^ g = Graphics::FromHwnd(pictureBox1->Handle); //Рисуем прямоугольник:
g->DrawRectangle(myPen, x_MouseDown_1, y_MouseDown_1, e->X - x_MouseDown_1, e->Y - y_MouseDown_1);
}
Листинг 19.3. Метод button1_Click для стирания рисунка.
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
//Объявляем объект "g" класса Graphics //и связываем его с pictureBox1:
Graphics^ g = pictureBox1->CreateGraphics();
Глава 19. Рисование прямоугольников и эллипсов при помощи мыши |
57 |
//Очищаем (Clear) элемент pictureBox1 от рисунка //и заполняем его белым цветом: g->Clear(Color::White);
}
В режиме выполнения (Debug, Start Without Debugging) перемещаем указатель мыши в первую точку, нажимаем кнопку, перемещаем указатель мыши во вторую точку и отпускаем кнопку; при этом из предыдущей точки в данную точку рисуется прямоугольник. Аналогично строим еще несколько прямоугольников (рис. 19.1).
Если в коде на листинге 19.2 вместо строки для прямоугольника мы запишем g->DrawEllipse(myPen, x_MouseDown_1, y_MouseDown_1,
e->X - x_MouseDown_1, e->Y - y_MouseDown_1);
то по этому второму варианту программы можем рисовать эллипсы (рис. 19.2) согласно алгоритму. После щелчка кнопки с надписью “1. Очистить панель” (или нажатия клавиши Enter, или Alt+1) то, что мы нарисовали, удаляется. И мы можем начать рисовать сначала.
Глава 20. Рисование заполненных прямоугольников и эллипсов при помощи нажатия кнопки мыши
Листинг 20.1. Объявляем глобальные переменные и записываем наш код.
//Объявляем глобальные переменные для координат "x" и "y" //указателя мыши в момент нажатия кнопки мыши:
public: int x_MouseDown_1, y_MouseDown_1;
private:
System::Void pictureBox1_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e)
{
//Определяем коорд-ты указателя в момент нажатия кнопки: x_MouseDown_1 = e->X; y_MouseDown_1 = e->Y;
}
Листинг 20.2. Метод pictureBox1_MouseUp для обработки отпускания кнопки.
private:
System::Void pictureBox1_MouseUp(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e)
{
//Объявляем объект "g" класса Graphics и предоставляем //ему возможность рисования на pictureBox1:
Graphics^ g = Graphics::FromHwnd(pictureBox1->Handle);
//Создаем и рисуем прямоугольник: Rectangle myRectangle =
Rectangle(Point(x_MouseDown_1, y_MouseDown_1), System::Drawing::Size(
e->X - x_MouseDown_1, e->Y - y_MouseDown_1)); g->DrawRectangle(gcnew Pen(Color::Transparent),
myRectangle);
//Выбираем кисть myBrush для линейного градиента //между белым White и черным Black цветами: LinearGradientBrush^ myBrush;
myBrush = gcnew LinearGradientBrush(myRectangle, Color::White, Color::Black, LinearGradientMode::Horizontal);
//Рисуем заполненный прямоугольник:
Глава 20. Рисование заполненных прямоугольников и эллипсов мышью |
59 |
g->FillRectangle(myBrush, myRectangle);
}
Листинг 20.3. Метод button1_Click для стирания рисунка.
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
//Объявляем объект "g" класса Graphics //и связываем его с pictureBox1:
Graphics^ g = pictureBox1->CreateGraphics();
//Очищаем (Clear) элемент pictureBox1 от рисунка //и заполняем его белым цветом: g->Clear(Color::White);
}
В режиме выполнения (Debug, Start Without Debugging):
перемещаем указатель мыши в первую точку, нажимаем кнопку, перемещаем указатель мыши во вторую точку и отпускаем кнопку;
при этом из предыдущей точки в данную точку рисуется прямоугольник, заполненный по линейному градиенту между двумя заданными цветами (белым White и
черным Black).
Аналогично строим еще несколько прямоугольников (рис. 20.1).
Если в коде на листинге 20.2 вместо строки для прямоугольника мы запишем
g->FillEllipse(myBrush, myRectangle);
то по этому второму варианту программы можем рисовать эллипсы, заполненные по тому же линейному градиенту, рис. 20.2.
После щелчка кнопки с надписью “1. Очистить панель” (или нажатия клавиши Enter, или Alt+1) то, что мы нарисовали, удаляется.
И мы можем начать рисовать сначала.