Листинг 86.1. Расчет оптимальных параметров разрезки листа на полосы.
//Объявляем глобальные переменные:
public double d, H, Rn, s, s_sheet, C, L, rho,
nu, El, sig_ys, sig_u, e_u, e_tot;
public int Radio;
double dH, Ha, D;
double B, a, b, t, W, F, Nbl, W_F;
double pi = Math.PI;
// Расчетные функции:
//Функции класса объектов "Полуфабрикаты":
double Allowance()
{
//Определение техн-го припуска, например, по таблице:
dH=5;
//Если включен переключатель 2,
// то обрезка припуска не нужна; при этом Radio=1:
if (Radio==1) dH=0;
return dH;
}
double Semiproduct()
{
dH=Allowance();
//Расчет размеров полуфабриката:
Ha = H + dH;
return Ha;
}
//Функции класса объектов "Заготовки":
double Area1_Semiproduct()
{
double A1 = pi*(d-2*Rn)*(d-2*Rn)/4;
return A1; //mm*mm
}
double Area2_Semiproduct()
{
double A2 = pi*(Rn-s/2)*(2*(Rn-s/2)+pi*(d-2*Rn)/2);
return A2; //mm*mm
}
double Area3_Semiproduct()
{
Ha=Semiproduct();
double A3 = pi*(d-s)*(Ha-Rn);
return A3; //mm*mm
}
double Area_Semiproduct()
{
double A, A1, A2, A3;
A1=Area1_Semiproduct();
A2=Area2_Semiproduct();
A3=Area3_Semiproduct(); A=A1+A2+A3;
return A;
}
double DBlank()
{
double A = Area_Semiproduct();
D=Math.Sqrt(4*A/pi);
return D;
}
//Функции класса объектов "Материалы":
double Bstrip()
{
//Определение параметров раскроя:
double del_st, del1, z_b;
a=1.2; b=1.6; del_st=0.7; del1=0.4; z_b=1;
//Шаг вырезки заготовок:
D = DBlank(); t = D + a;
//Расчет ширины полосы:
B = D + 2*(b + del_st) + z_b + del1;
return B;
}
void Cutting()
{
//Определение параметров раскроя:
double N_strip_1, N_strip_2, N_bl_st_1, N_bl_st_2,
N_bl_1, N_bl_2;
B = Bstrip();
//Число полос из листа при продольной разрезке:
Листинг 74.1. Метод для сложения чисел.
private void button1_Click(object sender, EventArgs e)
{
double a, b, c;
a = Convert.ToDouble(textBox1.Text);
b = Convert.ToDouble(textBox2.Text);
c = a + b;
textBox3.Text = c.ToString();
}
Листинг 74.2. Метод для построения линии.
private void Form1_Paint(object sender, PaintEventArgs e)
{
Pen myPen = new Pen(Color.Black, 3);
e.Graphics.DrawLine(myPen, 10, 100, 100,30);
}
Для примера, выделяем первое устройство My Computer. На экране появляется форма Form1 с прямой линией (рис. 74.10). Аналогично можно выполнять любые другие операции, которые мы запишем в файл Form1.cs.
После запуска этого же проекта (или какого-либо нового проекта этого типа) на выполнение и выбора второго устройства Pocket PC SE Emulator появляется панель, в которую через некоторое время загружается показанный выше эмулятор Pocket PC, который также полностью функционален.
В отличие от приводимых в других частях книги проектов, объем занимаемой памяти у проекта для мобильных устройств, работающих под управлением операционной системы Windows CE, значительно меньше.
Листинг 41.1. Код выше и в теле процедуры Form1_Load.
'Вводим функцию для поверхности z = f = f(x, y):
Private Function f(ByVal x As Single, ByVal y As Single) _
As Single
f = 2 * x * x * x * x - 3 * x * x + 4 * y * y
End Function
'Вводим функцию для частной производной df/dx:
Private Function df_dx(ByVal x As Single, _
ByVal y As Single) As Single
df_dx = 8 * x * x * x - 6 * x
End Function
'Вводим функцию для частной производной df/dy:
Private Function df_dy(ByVal x As Single, _
ByVal y As Single) As Single
df_dy = 8 * y
End Function
'Задаем перо для рисования линий уровня:
Private myPen As Pen
'Загружаем функции для рисования линий уровня:
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As EventArgs) Handles MyBase.Load
'Задаем цвет пера:
myPen = New Pen(Color.Black, 0)
'Связываем графический элемент PictureBox1
'с объектом g класса Graphics:
Dim bmp As New Bitmap(PictureBox1.ClientSize.Width, _
PictureBox1.ClientSize.Height)
Dim g As Graphics = Graphics.FromImage(bmp)
'Определяем преобразования для масштабирования и
'рисования линий на PictureBox1 в интервале
'-1.5 <= x <= 1.5, -1.5 <= y <= 1.5:
Const x_min As Single = -1.5
Const x_max As Single = 1.5
Const y_min As Single = -1.5
Const y_max As Single = 1.5
g.ScaleTransform(bmp.Width / (x_max - x_min), _
bmp.Height / (y_max - y_min))
g.TranslateTransform(-x_min, -y_min, _
System.Drawing.Drawing2D.MatrixOrder.Prepend)
'Вызываем функцию для рисования линий уровня:
For LevelCurves As Integer = -3 To 10
PlotLevelCurve(g, CSng( _
LevelCurves / 4), -4, 4, -4, 4, 0.05, 1, 1, 0.002)
Next
'Показываем результат рисования:
PictureBox1.Image = bmp
End Sub
Листинг 40.1. Код выше и в теле метода Form1_Load.
//Вводим функцию для поверхности z = f1 = f(x, y):
public float f(float x, float y)
{
float f1;
f1 = 2 * x * x * x * x - 3 * x * x + 4 * y * y;
return f1;
}
//Вводим функцию для частной производной df/dx:
public float df_dx(float x, float y)
{
float f2;
f2 = 8 * x * x * x - 6 * x;
return f2;
}
//Вводим функцию для частной производной df/dy:
public float df_dy(float x, float y)
{
float f3;
f3 = 8 * y;
return f3;
}
//Объявляем перо для рисования линий уровня:
Pen myPen;
//Загружаем функции для рисования линий уровня:
private void Form1_Load_1(object sender, EventArgs e)
{
//Создаем экземпляр пера с цветом и толщиной:
myPen = new Pen(Color.Black, 0);
//Связываем графический элемент PictureBox1
//с объектом g класса Graphics:
Bitmap bmp = new Bitmap(pictureBox1.ClientSize.Width,
pictureBox1.ClientSize.Height);
Graphics g = Graphics.FromImage(bmp);
//Определяем преобразования для масштабирования и
//рисования линий на PictureBox в интервале
//-2 <= x <= 2, -1.5 <= y <= 1.5:
float x_min = -2f;
float x_max = 2f;
float y_min = -1.5f;
float y_max = 1.5f;
g.ScaleTransform(bmp.Width / (x_max - x_min),
bmp.Height / (y_max - y_min));
g.TranslateTransform(-x_min, -y_min,
System.Drawing.Drawing2D.MatrixOrder.Prepend);
//Вызываем функцию для рисования линий уровня:
for (int LevelCurves = -3; LevelCurves <= 25;
LevelCurves++)
PlotLevelCurve(g, Convert.ToSingle(
LevelCurves / 4),
-4f, 4f, -4f, 4f, 0.05f, 1f, 1f, 0.002f);
//Показываем результат рисования:
pictureBox1.Image = bmp;
}
Ниже этого кода записываем следующие вспомогательные методы.
Листинг 40.2.
Вспомогательные методы.
//Находим точку на линии:
float initial_delta = 0.1f;
Листинг 66.1. Метод для компонента Timer.
//Объявляем глобальную переменную currentImage
//для номера текущего рисунка и приравниваем нулю:
int currentImage = 0;
private void timer1_Tick(object sender, EventArgs e)
{
//Последовательно выводим рисунки:
if(imageList1.Images.Empty != true)
{
//Центрируем рисунок внутри рамки PictureBox1:
pictureBox1.SizeMode =
PictureBoxSizeMode.CenterImage;
//Выводим рисунок с номером 'currentImage' :
pictureBox1.Image =
imageList1.Images[currentImage];
//Организовываем цикл по индексу 'currentImage' :
currentImage = currentImage + 1;
if (currentImage == imageList1.Images.Count)
currentImage = 0;
}
}
В этом коде главным является вызов свойства Image, при помощи которого текущий рисунок загружается в рамку элемента управления pictureBox1.
Чтобы установить значение свойства Interval компонента Timer в зависимости от свойства Value ползунка элемента управления TrackBar, дважды щелкаем элемент управления TrackBar в режиме проектирования. Появляется файл Form1.cs с шаблоном, который после записи нашего кода принимает следующий вид.
Листинг 66.2. Метод для элемента управления TrackBar.
private void trackBar1_Scroll(object sender, EventArgs e)
{
timer1.Enabled = true;
timer1.Interval = trackBar1.Value;
}
Согласно разработанной выше методике, чтобы иметь возможность приостановить (и запустить вновь) процесс анимации на любом рисунке при помощи кнопки Stop/Start Animation, дважды щелкаем эту кнопку в режиме проектирования (рис. 66.1). Появляется файл Form1.cs с шаблоном, который после записи нашего кода принимает такой вид.
Листинг 66.3. Метод для кнопки Stop/Start Animation.
bool OffOn = false;
private void button6_Click(object sender, EventArgs e)
{
//Задаем чередование остановки и возобновления анимации
Теперь (для программирования операции сложения) дважды щелкаем кнопку “=” (рис. 11.1) и в появившийся шаблон процедуры записываем код:
double number2, number3;
if (i==1)
{
number2 = Convert.ToDouble(textBox1.Text);
number3 = Number + number2;
textBox1.Text = number3.ToString();
}
При помощи оператора if сложение выполняется только после того, как предварительно мы щелкнем кнопку “+”, программа присвоит целочисленной переменной i значение 1, и далее щелкнем кнопку “=”.
Поскольку несколько операций данного калькулятора выполняются после щелчка одной кнопки “=”, то далее мы будем дополнять процедуру этой кнопки для выполнения каждой последующей операции.
Для вычитания чисел аналогично (как для сложения) дважды щелкаем кнопку “-” (рис. 11.1) и в появившийся шаблон новой процедуры записываем код:
i=2;
Number = Convert.ToDouble(textBox1.Text);
textBox1.Text = "";
textBox1.Focus();
Дважды щелкаем кнопку “=” (рис. 11.1) и в появившуюся ту же процедуру для этой кнопки, ниже нашего предыдущего кода, записываем следующий код:
if (i==2)
{
number2 = Convert.ToDouble(textBox1.Text);
number3 = Number - number2;
textBox1.Text = number3.ToString();
}
Аналогично для умножения чисел дважды щелкаем кнопку “ * ” (рис. 11.1) и в появившийся шаблон новой процедуры записываем код:
i=3;
Number = Convert.ToDouble(textBox1.Text);
textBox1.Text = "";
textBox1.Focus();
Дважды щелкаем кнопку “=” (рис. 11.1) и в появившуюся ту же процедуру для этой кнопки, ниже нашего предыдущего кода, записываем следующий код:
if (i==3)
{
number2 = Convert.ToDouble(textBox1.Text);
number3 = Number * number2;
textBox1.Text = number3.ToString();
}
Аналогично для деления чисел дважды щелкаем кнопку “ / ” (рис. 11.1) и в появившийся шаблон новой процедуры записываем код:
Листинг 27.1. Объявляем глобальные переменные и записываем наш код.
//Объявляем глобальные переменные для координат "x" и "y"
//указателя мыши в момент 1-го и 2-го нажатий кнопки мыши:
public int x_MouseDown_1, y_MouseDown_1,
x_MouseDown_2, y_MouseDown_2;
//Чтобы рисование осуществлялось только после каждого щелчка
//кнопки,объявляем переключатель рисования
//в виде глобальной переменной OffOn:
bool OffOn = false;
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
//Объявляем объект "g" класса Graphics
//и при помощи функции CreateGraphics
//предоставляем ему возможность рисования
//на this форме Form1:
Graphics g = this.CreateGraphics();
//Выбираем перо "myPen" красного цвета Red
//толщиной в 3 пикселя:
Pen myPen = new 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;
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);
//Задаем предыдущей позиции указателя мыши
//координаты данной позиции указателя мыши:
Листинг 26.1. Объявляем глобальные переменные и записываем наш код.
//Объявляем глобальные переменные
//для координат "x" и "y" указателя мыши
//в момент нажатия кнопки мыши и перемещения мыши:
public int x_MouseDown, y_MouseDown;
public int x_MouseMove, y_MouseMove;
//Чтобы рисование осуществлялось
//только после каждого щелчка кнопки,
//объявляем переключатель рисования
//в виде глобальной переменной OffOn:
bool OffOn = false;
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
//Определяем координаты "x" и "y" указателя мыши
//в момент нажатия кнопки мыши:
x_MouseDown = e.X;
y_MouseDown = e.Y;
//Изменяем значение OffOn на противоположное:
OffOn = true;
}
Далее в панели Properties на вкладке Events дважды щелкаем имя второго события, например, MouseMove, показанное на рис. 26.4. Появляется шаблон метода Form1_MouseMove для обработки события MouseMove в виде перемещения мыши. После записи нашего кода шаблон принимает следующий вид.
Листинг 26.2. Метод Form1_MouseMove для перемещения мыши.
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
//Объявляем объект "g" класса Graphics
//и при помощи функции CreateGraphics
//предоставляем ему возможность рисования
//на this Form1:
Graphics g = this.CreateGraphics();
//Определяем координаты "x" и "y" указателя мыши
//в моменты перемещения мыши:
x_MouseMove = e.X;
y_MouseMove = e.Y;
//Выбираем перо "myPen" красного цвета Red
//толщиной в 3 пикселя:
Pen myPen = new Pen(Color.Red, 3);
//Если переключатель рисования
//в виде переменной OffOn равен true:
if (OffOn == true)
{
//после нажатия кнопки мыши и перемещения мыши
//рисуется линия заданного цвета и толщины:
Листинг 28.1. Объявляем глобальные переменные и записываем наш код.
//Объявляем глобальные переменные для координат "x" и "y"
//указателя мыши в момент нажатия кнопки мыши:
public int x_MouseDown_1, y_MouseDown_1;
//Определяем координаты указателя в момент нажатия кнопки:
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
x_MouseDown_1 = e.X;
y_MouseDown_1 = e.Y;
}
В панели Properties для элемента управления PictureBox на вкладке Events дважды щелкаем имя второго события MouseUp. Появляется шаблон метода pictureBox1_MouseUp для обработки события MouseUp в виде отпускания кнопки мыши. После записи нашего кода шаблон принимает следующий вид.
Листинг 28.2. Метод pictureBox1_MouseUp для обработки отпускания кнопки.
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
//Выбираем перо "myPen" черного цвета Black
//толщиной в 3 пикселя:
Pen myPen = new 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);
}
Чтобы удалить, в случае необходимости, то, что мы нарисовали, дважды щелкаем кнопку с надписью “1. Очистить панель” в режиме проектирования. Появляется шаблон метода button1_Click для обработки события в виде щелчка кнопки; этот шаблон после записи нашего кода принимает следующий вид.
Листинг 28.3. Метод button1_Click для стирания рисунка.
private void button1_Click(object sender, EventArgs e)
{
//Объявляем объект "g" класса Graphics
//и связываем его с pictureBox1:
Graphics g = pictureBox1.CreateGraphics();
//Очищаем (Clear) элемент pictureBox1 от рисунка
//и заполняем его белым цветом:
g.Clear(Color.White);
}
В режиме выполнения (Debug, Start Without Debugging) перемещаем указатель мыши в первую точку, нажимаем кнопку, перемещаем указатель мыши во вторую точку и отпускаем кнопку; при этом из предыдущей точки в данную точку рисуется прямоугольник. Аналогично строим еще несколько прямоугольников (рис. 28.1).
Если в коде на листинге 28.2 вместо строки для прямоугольника мы запишем
g.DrawEllipse(myPen, x_MouseDown_1, y_MouseDown_1,
e.X - x_MouseDown_1, e.Y - y_MouseDown_1);
то по этому второму варианту программы можем рисовать эллипсы (рис. 28.2) согласно алгоритму. После щелчка кнопки с надписью “1. Очистить панель” (или нажатия клавиши Enter, или Alt+1) то, что мы нарисовали, удаляется. И мы можем начать рисовать сначала.
Листинг 5.1. Код для рисования прямой линии.
private void Form1_Paint(object sender, PaintEventArgs e)
{
//Задаем цвет и толщину пера:
Pen myPen = new Pen(Color.Black, 3);
//Рисуем линию:
e.Graphics.DrawLine(myPen, 10, 15, 100, 120);
//Высвобождаем память, выделенную объекту myPen:
myPen.Dispose();
}
Листинг 5.2. Код для рисования кривых линий.
private void Form1_Paint(object sender, PaintEventArgs e)
{
//Задаем цвет и толщину пера:
Pen myPen = new 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[] apt = new Point[4];
apt[0] = new Point(60, 140);
apt[1] = new Point(140, 140);
apt[2] = new Point(100, 180);
apt[3] = new Point(60, 140);
e.Graphics.DrawCurve(myPen, apt, 0, 3, 0.9f);
//Высвобождаем память, выделенную объекту myPen:
myPen.Dispose();
}
Листинг 5.3. Код на Visual C# для печати изображения на принтере.
private void button1_Click(object sender, EventArgs e)
{
//Передаем объекту printDialog1 информацию об объекте
//printDocument1 при помощи свойства Document:
printDialog1.Document = printDocument1;
//Выводим стандартную панель Print при помощи метода
//ShowDialog() для задания параметров печати
//и после щелчка OK на панели Print печатаем документ
//при помощи метода Print():
if (printDialog1.ShowDialog() == DialogResult.OK)
printDocument1.Print();
}
Листинг 5.4. Код на Visual Basic для печати изображения на принтере.
Private Sub Button3_Click(ByVal sender As System.Object, _
ByVal e As EventArgs) Handles Button3.Click
Листинг 6.1. Код для рисования прямоугольника.
private void Form1_Paint(object sender, PaintEventArgs e)
{
//Задаем цвет и толщину пера:
Pen myPen1 = new Pen(Color.Black, 3);
//Объявляем объект myRectangle и создаем экземпляр этого объекта:
Rectangle myRectangle = new Rectangle(10, 15, 150, 200);
//Рисуем фигуру:
e.Graphics.DrawRectangle(myPen1, myRectangle);
//Высвобождаем память, выделенную объекту myPen1:
myPen1.Dispose();
}
Листинг 6.2. Код для рисования кривых линий.
private void Form1_Paint(object sender, PaintEventArgs e)
{
//Задаем цвет и толщину перьев:
Pen myPen1 = new Pen(Color.Black, 3);
Pen myPen2 = new Pen(Color.Black, 1);
//Объявляем объекты и создаем экземпляры этих объектов:
Point myPoint1 = new Point(50, 50);
Point myPoint2 = new Point(100, 25);
Point myPoint3 = new Point(200, 5);
Point myPoint4 = new Point(275, 50);
Point myPoint5 = new Point(300, 150);
Point myPoint6 = new Point(350, 200);
Point myPoint7 = new Point(250, 250);
Point[] myCurvePoints =
{
myPoint1,
myPoint2,
myPoint3,
myPoint4,
myPoint5,
myPoint6,
myPoint7
};
//Рисуем линии:
e.Graphics.DrawLines(myPen1, myCurvePoints);
e.Graphics.DrawClosedCurve(myPen2, myCurvePoints);
//Высвобождаем память от перьев myPen1, myPen2:
myPen1.Dispose();
myPen2.Dispose();
}
Листинг 6.3. Метод для фотографирования клиентской области формы.
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern long BitBlt(IntPtr hdcDest,
int nXDest, int nYDest, int nWidth, int nHeight,
IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);
private Bitmap myMemoryImage;
private void myCaptureScreen()
{
Graphics myGraphics = this.CreateGraphics();
Size s = this.Size;
myMemoryImage = new Bitmap(s.Width, s.Height,
myGraphics);
Листинг 8.1. Код для рисования горизонтального текста.
private void Form1_Paint(object sender, PaintEventArgs e)
{
//Объявляем переменную myString и присваиваем значение:
string myString = "Visual Studio";
//Объявляем объект myFont и создаем экземпляр объекта:
Font myFont = new Font("Arial", 30);
//Объявляем объект myBrush и создаем экземпляр объекта:
SolidBrush myBrush = new SolidBrush(Color.Black);
//Задаем координаты начала текста:
float x = 5.0f;
float y = 50.0f;
//Рисуем горизонтальный текст кистью myBrush:
e.Graphics.DrawString(myString, myFont, myBrush, x, y);
//Высвобождаем память, выделенную объектам:
myFont.Dispose();
myBrush.Dispose();
}
Листинг 8.2. Строки для рисования вертикального текста.
//Объявляем объект myFormat и создаем экземпляр объекта:
StringFormat myFormat = new StringFormat(
StringFormatFlags.DirectionVertical);
//Рисуем вертикальный текст кистью myBrush:
e.Graphics.DrawString(myString, myFont, myBrush,
x, y, myFormat);
Листинг 8.3. Считывание текстового файла.
System.IO.StreamReader myPrintFile;
Font myPrintFont;
private void button1_Click(object sender, EventArgs e)
{
string myPrintPath = Environment.GetFolderPath(
Environment.SpecialFolder.Desktop);
myPrintFile =
new System.IO.StreamReader(myPrintPath +
@"\myText.txt");
myPrintFont = new Font("Times New Roman", 12);
printDocument1.Print();
myPrintFile.Close();
}
Дважды щелкаем по значку для компонента PrintDocument (ниже формы в режиме проектирования). Открывается файл Form1.cs с шаблоном, который после записи кода принимает следующий вид.
Листинг 8.4. Печать текстового файла.
private void printDocument1_PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{
float yPos = 0f;
Листинг 7.1. Код для рисования прямоугольника.
private void Form1_Paint(object sender, PaintEventArgs e)
{
//Задаем тип и цвет кисти:
SolidBrush myBrush =
new SolidBrush(System.Drawing.Color.Black);
//Объявляем объект myRectangle и создаем экземпляр этого объекта:
Rectangle myRectangle = new Rectangle(10, 15, 150, 200);
//Рисуем и заполняем фигуру:
e.Graphics.FillRectangle(myBrush, myRectangle);
//Высвобождаем память, выделенную объекту myBrush:
myBrush.Dispose();
}
В этом же шаблоне комментируем одну строку для заполнения прямоугольника и записываем другую строку для заполнения эллипса (вписанного в прямоугольник).
Листинг 7.2. Строка для рисования эллипса.
e.Graphics.FillEllipse(myBrush, myRectangle);
Листинг 7.3. Вызов методов для захвата изображения и вывода Print preview.
private void button1_Click(object sender, EventArgs e)
{
//Захватываем изображение:
myCaptureScreen();
//Выводим панель Print preview:
printPreviewDialog1.Show();
}
Листинг 29.1. Объявляем глобальные переменные и записываем наш код.
//Объявляем глобальные переменные для координат "x" и "y"
//указателя мыши в момент нажатия кнопки мыши:
public int x_MouseDown_1, y_MouseDown_1;
//Определяем координаты указателя в момент нажатия кнопки:
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
x_MouseDown_1 = e.X; y_MouseDown_1 = e.Y;
}
В панели Properties для элемента управления PictureBox на вкладке Events дважды щелкаем имя второго события MouseUp. Появляется шаблон, который после записи нашего кода принимает следующий вид.
Листинг 29.2. Метод pictureBox1_MouseUp для обработки отпускания кнопки.
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
//Объявляем объект "g" класса Graphics и предоставляем
//ему возможность рисования на pictureBox1:
Graphics g = Graphics.FromHwnd(pictureBox1.Handle);
//Создаем и рисуем прямоугольник:
Rectangle myRectangle = new Rectangle(
new Point(x_MouseDown_1, y_MouseDown_1),
new Size(e.X - x_MouseDown_1, e.Y - y_MouseDown_1));
g.DrawRectangle(new Pen(Color.Transparent),
myRectangle);
//Выбираем кисть myBrush для линейного градиента
//между белым White и черным Black цветами:
LinearGradientBrush myBrush;
myBrush = new LinearGradientBrush(myRectangle,
Color.White, Color.Black,
LinearGradientMode.Horizontal);
//Рисуем заполненный прямоугольник:
g.FillRectangle(myBrush, myRectangle);
}
Чтобы удалить, в случае необходимости, то, что мы нарисовали, дважды щелкаем кнопку с надписью “1. Очистить панель” в режиме проектирования. Появляется шаблон метода button1_Click для обработки события в виде щелчка кнопки; этот шаблон после записи нашего кода принимает следующий вид.
Листинг 29.3. Метод button1_Click для стирания рисунка.
private void button1_Click(object sender, EventArgs e)
Листинг 85.1. Код кнопки OK для передачи данных с Form1 на Form3.
//Объявляем локальные переменные:
double d, H, Rn, s, s_sheet, C, L, rho,
nu, El, sig_ys, sig_u, e_u, e_tot;
//Считываем исходные данные из окон TextBox формы Form1:
d = Convert.ToDouble(textBox1.Text);
H = Convert.ToDouble(textBox2.Text);
Rn = Convert.ToDouble(textBox3.Text);
s = Convert.ToDouble(textBox4.Text);
s_sheet = Convert.ToDouble(textBox5.Text);
C = Convert.ToDouble(textBox6.Text);
L = Convert.ToDouble(textBox7.Text);
rho = Convert.ToDouble(textBox8.Text);
nu = Convert.ToDouble(textBox9.Text);
El = Convert.ToDouble(textBox10.Text);
sig_ys = Convert.ToDouble(textBox11.Text);
sig_u = Convert.ToDouble(textBox12.Text);
e_u = Convert.ToDouble(textBox13.Text);
e_tot = Convert.ToDouble(textBox14.Text);
//Присваиваем исходные данные другим переменным
//класса для формы Form3, но с такими же именами:
Form3 myForm3 = new Form3();
myForm3.d = d;
myForm3.H = H;
myForm3.Rn = Rn;
myForm3.s = s;
myForm3.Radio = Radio;
myForm3.s_sheet = s_sheet;
myForm3.C = C;
myForm3.L = L;
myForm3.rho = rho;
myForm3.nu = nu;
myForm3.El = El;
myForm3.sig_ys = sig_ys;
myForm3.sig_u = sig_u;
myForm3.e_u = e_u;
myForm3.e_tot = e_tot;
//Выводим следующую диалоговую форму Form3:
myForm3.Show();
Листинг 85.2. Код для выполнения анимации.
//Объявляем булеву переменную myColor со значением false:
bool myColor = false;
private void timer1_Tick(object sender, EventArgs e)
{
//Вводим анимацию:
if (myColor == false)
{
//Выводим белый цвет элемента управления:
this.button1.BackColor = Color.White;
//Изменяем значение myColor на противоположное:
myColor = true;
}
else
{
//Выводим желтый цвет элемента управления: this.button1.BackColor = Color.Yellow;
//Изменяем значение myColor на противоположное:
myColor = false;
}
}
Применительно к нашим типичным деталям типа стакана (рис. 85.1) технологический процесс их изготовления включает следующие типичные операции:
Операция 1. Разрезка листа на полосы.
Операция 2. Вырезка заготовок из полосы.
Операция 3. Изготовление полуфабриката из заготовки.
Операция 4. Обрезка технологического припуска на полуфабрикате.
После выполнения этих операций получается деталь, которая далее может или поступать на последующие операции (например, кастрюля поступает на эмалирование, а колпак поступает на сборку-сварку кузова автомобиля), или использоваться по своему назначению. Мы закончили разработку типичного технологического процесса изготовления детали и теперь приступаем к программной реализации проектирования этого процесса (с использованием эффектов анимации).
Листинг 20.1. Объявление и создание экземпляра набора данных.
private void button1_Click(object sender, EventArgs e)
{
DataSet ds1 = new DataSet();
}
Листинг 20.2. Метод для выполнения анимации.
//Объявляем булеву переменную myHeight со значением false:
bool myHeight = false;
private void timer1_Tick(object sender, EventArgs e)
{
//Программируем анимацию:
if (myHeight == false)
{
//Изменяем высоту формы до 500:
this.Height = 500;
//Изменяем значение myHeight на противоположное:
myHeight = true;
}
else
{
//Изменяем высоту формы до 490:
this.Height = 490;
//Изменяем значение myHeight на противоположное:
myHeight = false;
}
}
В этом коде мы можем устанавливать чередование двух других значений высоты формы. Задавая в панели Properties (для компонента Timer) различные значения свойству Interval (а выше мы задали 1000 миллисекунд или 1 секунду), можно изменять частоту чередования высот панели. Методика приостановки и возобновления анимации (с примерами) дана выше.
Другой вариант создания наборов и баз данных и управления ими мы опишем в следующей главе.
Теперь в шаблон файла Form9.cs необходимо написать нашу часть кода для выполнения расчетов. Для возведения числа “x” в различные степени (при помощи первой кнопки со знаком “=” на данной форме Form9) дважды щелкаем эту кнопку (рис. 13.1). Появляется файл Form9.cs с шаблоном, в который записываем:
double x, x2, x3, x4, x5;
x = Convert.ToDouble(textBox1.Text);
x2 = Math.Pow(x,2);
textBox2.Text = x2.ToString();
x3 = Math.Pow(x,3);
textBox3.Text = x3.ToString();
x4 = Math.Exp(x);
textBox4.Text = x4.ToString();
x5 = Math.Pow(10,x);
textBox5.Text = x5.ToString();
textBox6.Focus();
Для вычисления степени

double x, y, x2;
x = Convert.ToDouble(textBox1.Text);
y = Convert.ToDouble(textBox6.Text);
x2 = Math.Pow(x,y);
textBox7.Text = x2.ToString();
textBox11.Focus();
Для вычисления корней (



double x, x2, c, x3, x4, y;
x = Convert.ToDouble(textBox1.Text);
x2 = Math.Sqrt(x);
textBox8.Text = x2.ToString();
c = 1/3.0;
x3 = Math.Pow(x,c);
textBox9.Text = x3.ToString();
y = Convert.ToDouble(textBox6.Text);
if (y!=0)
{
c = 1/y;
x4 = Math.Pow(x,c);
}
else x4 = 0;
textBox10.Text = x4.ToString();
textBox11.Focus();
Для вычисления корня

double x, y, a, c, x4;
x = Convert.ToDouble(textBox1.Text);
y = Convert.ToDouble(textBox6.Text);



В этой части книги мы разработаем методологию создания графической системы для построения в трехмерном пространстве широко распространенных плоских и пространственных геометрических объектов (тел, фигур и поверхностей): прямые и кривые линии; плоскости и поверхности; объемные тела, например, многогранники и т.д. Эти геометрические тела могут быть частью какой-либо детали (изделия, конструкции) или инструмента, при помощи которого обрабатывается заданная заготовка из какого-нибудь материала.
Главное достоинство нашей методологии заключается в том, что мы спроектируем типичные приложения для построения различных пространственных изображений только на одной открытой (последней версии) платформе Visual Studio 2005 (без использования закрытых побочных библиотек типа DirectX и OpenGL, которые к тому же очень сложны в изучении).
Чтобы на экране монитора отобразить какой-либо объект, у нас должны быть (рис. 31.1):
точка наблюдения E (E – первая буква одного из ключевых, в данной теории, английских слов Eye – глаз (наблюдателя));
объект наблюдения, который отождествлен с множеством точек; одна из этих точек P показана на рис. 31.1 (P – это первая буква английского слова Point – точка);
экран монитора; на этом экране точку объекта P мы видим в точке экрана P’, которая находится на пересечении прямой EP с плоскостью экрана.
Отметим, что мы приводим ключевые английские слова по данной тематике с целью, чтобы далее легче было разобраться со сложными программами на Visual C#, Visual Basic и Visual C++ 2005, где имена переменных, массивов, процедур, функций, методов и других элементов программирования записаны с использованием этих ключевых слов.
В трехмерном пространстве вводим неподвижную правую прямоугольную систему координат x, y, z, а также сферическую систему координат r,


Для реалистичного изображения пространственного объекта на плоском экране целесообразно выполнить следующие основные этапы работ.
Листинг 56.1. Код проектирования и преобразования фигуры.
//Объявляем переменную 'i' для исходной позиции фигуры;
int i = 0;
//Объявляем объект нашего нового класса Animation и
//при помощи конструктора new создаем экземпляр объекта:
Animation myAnimation = new Animation();
//Вводим наш новый класс Animation:
class Animation
{
//Объявляем и задаем шаги горизонтального offsetX
//и вертикального offsetY перемещений фигуры
//за один интервал времени:
float offsetX = 6;
float offsetY = 2;
//Объявляем и задаем в градусах
//шаг угла поворота фигуры:
float step_alpha = 6;
//Объявляем объекты класса GraphicsPath:
GraphicsPath myGraphicsPath = new GraphicsPath();
GraphicsPath myGraphicsPath2 = new GraphicsPath();
//В классе Matrix объявляем
//объекты-матрицы преобразований:
//объект myMatrix1 - для поворота фигуры и
//объект myMatrix2 - для перемещения фигуры:
Matrix myMatrix1 = new Matrix();
Matrix myMatrix2 = new Matrix();
//Вводим конструктор нашего класса для задания фигуры
//в виде окружности (методом AddEllipse)
//и в виде линий (методом AddLine):
public Animation()
{
myGraphicsPath.AddEllipse(70, 70, 100, 100);
myGraphicsPath.AddLine(75, 100, 165, 100);
myGraphicsPath.AddLine(75, 140, 165, 140);
//При помощи клонирования
//создаем объект myGraphicsPath2
//как точную копию объекта myGraphicsPath:
myGraphicsPath2 =
(GraphicsPath)myGraphicsPath.Clone();
}
//Вводим методо FigureDraw для преобразования
//и рисования фигуры:
public void FigureDraw(Graphics myGraphics, int j)
{
//Перемещаем фигуру:
myMatrix2.Translate(offsetX, offsetY);
//При помощи клонирования
//создаем объект myGraphicsPath
Листинг 55.1. Код проектирования рисунка.
//Переменную "angle" (для угла поворота) приравниваем нулю:
int angle = 0;
private void pictureBox1_Paint(object sender,
PaintEventArgs e)
{
//Объявляем локальные переменные:
//Радиус вращающейся линии:
float r = 100.0F;
//Абсцисса и ордината неподвижной граничной точки,
//вокруг которой вращается линия (центра вращения):
float x_centre = 100.0F;
float y_centre = 100.0F;
//Текущие значения абсциссы и ординаты
//граничной вращающейся точки:
float x, y;
//Определяем текущие значения абсциссы и ординаты
//граничной вращающейся точки
//и преобразовываем в тип (float):
x = x_centre + r * Convert.ToSingle(
Math.Cos(2 * Math.PI * angle / 360));
y = y_centre + r * Convert.ToSingle(
Math.Sin(2 * Math.PI * angle / 360));
//Выполняем процедуру DrawLine класса Graphics
//для построения линии по двум точкам
//с координатами (x_centre, y_centre) и (x, y):
e.Graphics.DrawLine(new Pen(Color.Black, 3),
x_centre, y_centre, x, y);
//Увеличиваем угол поворота линии,
//на один шаг, равный 6 градусам:
angle = angle + 6;
//Обнуляем угол поворота линии,
//когда линия сделает полный оборот
//на 360 градусов:
if (angle == 360) angle = 0;
//Для наглядности рисуем окружность
//(типа циферблата часов),
//внутри которой будет вращаться линия:
e.Graphics.DrawEllipse(new Pen(Color.Blue, 2),
0, 0, 200, 200);
//Рисуем две оси симметрии окружности,
//горизонтальную и вертикальную:
e.Graphics.DrawLine(new Pen(Color.Red, 1),
0, 100, 200, 100);
e.Graphics.DrawLine(new Pen(Color.Red, 1),
Листинг 57.1. Метод для элемента управления PictureBox.
//Объявляем глобальную переменную filled_height
//для текущей высоты заполнения фигуры и приравниваем нулю:
int filled_height = 0;
private void pictureBox1_Paint(object sender,
PaintEventArgs e)
{
//Задаем стиль и цвет заполняющих элементов:
HatchBrush myHatchBrush =
new HatchBrush(HatchStyle.Cross, Color.Blue);
//Объявляем объект класса Graphics
//и задаем ему свойство Graphics:
Graphics myGraphics = e.Graphics;
//Заполняем прямоугольник
//на текущую высоту filled_height:
myGraphics.FillRectangle(myHatchBrush, 0, 0,
pictureBox1.Size.Width, filled_height);
//Увеличиваем текущую высоту заполнения
//на следующий шаг progressBar1.Step:
filled_height = filled_height + progressBar1.Step;
}
Дадим краткие пояснения. В главной строке кода:
myGraphics.FillRectangle(myHatchBrush, 0, 0,
pictureBox1.Size.Width, filled_height);
нули (0, 0) соответствуют координатам верхнего левого угла, а последние два параметра (pictureBox1.Size.Width, filled_height) соответствуют ширине и высоте заполняемого прямоугольника в виде элемента управления PictureBox.
Чтобы установить значение свойства Interval компонента Timer в зависимости от свойства Value ползунка элемента управления TrackBar, дважды щелкаем элемент управления TrackBar в режиме проектирования. Появляется файл Form11.cs с шаблоном, который после записи нашего кода принимает такой вид.
Листинг 57.2. Метод для элемента управления TrackBar.
private void trackBar1_Scroll(object sender, EventArgs e)
{
timer1.Enabled = true;
timer1.Interval = trackBar1.Value;
}
Чтобы подключить к работе таймер, дважды щелкаем значок для компонента Timer (ниже формы в режиме проектирования). Появляется файл Form11.cs с шаблоном, который после записи нашего кода принимает следующий вид.
Листинг 57.3. Метод для компонента Timer.
Листинг 58.1. Метод для элемента управления TrackBar.
private void trackBar1_Scroll(object sender, EventArgs e)
{
timer1.Enabled = true;
timer1.Interval = trackBar1.Value;
}
Чтобы подключить к работе таймер, дважды щелкаем значок для компонента Timer (ниже формы в режиме проектирования). Появляется файл Form13.cs с шаблоном, который после записи нашего кода принимает следующий вид.
Листинг 58.2. Метод для компонента Timer.
//Объявляем булеву переменную myText со значением false:
bool myText = false;
private void timer1_Tick(object sender, EventArgs e)
{
//Программируем анимацию:
if (myText == false)
{
//Задаем чередование черного Black
//и белого White цветов текста
//внутри элемента label1:
this.label1.ForeColor = Color.Black;
//Изменяем значение myText на противоположное:
myText = true;
}
else
{
this.label1.ForeColor = Color.White;
//Изменяем значение myText на противоположное:
myText = false;
}
}
Как и везде выше, наши подробные комментарии на всех листингах помогут читателю грамотно внести изменения в код (если читатель пожелает модернизировать анимацию для учета собственных требований).
По этой методике можно спроектировать анимацию в виде мигания любого текста за счет чередования двух любых цветов текста из длинного списка цветов Visual Studio (рис. 58.1) из структуры Color пространства имен System.Drawing.
Веб-программирование заключается в создании коммуникации между клиентами и серверами в изолированной локальной (например, корпоративной) и глобальной (Интернет) сети. Под словом “клиенты” понимаются установленные на компьютеры программные продукты (например, платформа Visual Studio 2005) пользователей, которые при помощи браузера, например, Internet Explorer и веб-службы получают какую-либо информацию с сервера. Под словом “серверы” понимаются программные продукты, установленные на компьютеры провайдеров (предоставляющие услуги хостинга), которые размещают у себя приложения в виде сайтов и при помощи веб-службы посылают информацию с сайтов на браузер пользователя по его запросу.
Веб-приложение и веб-службу мы должны разрабатывать на базе известного программного продукта корпорации Microsoft, который называется Internet Information Services (IIS) - Информационные службы Интернета. Эти службы IIS поставляются в комплекте со всеми операционными системами Windows 98/2000/XP/Server 2003, однако перед работой их нужно запустить в режим Started (Работает); по умолчанию службы находятся в режиме Stopped (Отключено), о чем мы расскажем в следующем параграфе.
Чтобы веб-приложение, которое мы спроектировали, например, в наших предыдущих книгах [7, 8], работало в Интернете, на компьютере провайдера должны быть установлены службы IIS (и, как правило, большинство провайдеров в мире используют службы IIS). А чтобы мы могли разрабатывать, отлаживать и тестировать веб-приложения и веб-службы, и на нашем компьютере службы IIS должны быть запущены в режим “Started”.
По сравнению с разработанными в предыдущих главах Windows-приложениями, веб-приложения имеют следующие преимущества:
большая часть нашего кода находится не на нашем компьютере как клиенте (и не на многих компьютерах пользователей), а на одном веб-сервере; по нашему коду сервер создает готовую веб-страницу как стандартный документ HTML (Hypertext Markup Language) и передает на браузер любого пользователя, который запросит этот документ;
все изменения нашего кода мы вносим только на одном веб-сервере, и измененная веб-страница будет посылаться на любой браузер пользователя.
Когда мы первый раз попытаемся создать проект веб-приложения или веб-службы и выполним построение (Build, Build Solution), то в окне Output увидим сообщение об ошибке, что на этой машине должны быть установлены службы IIS для этой программы, чтобы она функционировала правильно. Установку служб IIS на компьютер с операционной системой Windows 2000 Server мы подробно описали в нашей предыдущей книге [7]. Далее уже можно разрабатывать проекты веб-приложений и веб-служб по методике, описанной в нашей предыдущей книге [8].
Листинг 53.1. Метод для вывода короткого времени, без секунд.
private void button5_Click(object sender, EventArgs e)
{
statusBarPanel1.Text =
System.DateTime.Now.ToShortTimeString();
}
Для вывода короткой даты (одними цифрами) при помощи метода ToShortDateString дважды щелкаем вторую кнопку Start на Form3 в режиме редактирования (рис. 53.4). Появляется файл Form3.cs с шаблоном, который после записи одной строки нашего кода принимает следующий вид.
Листинг 53.2. Метод для вывода короткой даты.
private void button6_Click(object sender, EventArgs e)
{
statusBarPanel2.Text =
System.DateTime.Now.ToShortDateString();
}
Тот же самый шаблон для первой кнопки Start после записи одной строки кода (с целью вывода длинного времени, с секундами, при помощи метода ToLongTimeString) принимает следующий вид.
Листинг 53.3. Метод для вывода длинного времени, с секундами.
private void button5_Click(object sender, EventArgs e)
{
statusBarPanel1.Text =
System.DateTime.Now.ToLongTimeString ();
}
Листинг 53.4. Метод для вывода длинной даты.
private void button6_Click(object sender, EventArgs e)
{
statusBarPanel2.Text =
System.DateTime.Now.ToLongDateString ();
}
Листинг 53.5. Метод для вывода коротких значений часов и даты.
private void timer1_Tick(object sender, EventArgs e)
{
statusBarPanel1.Text =
System.DateTime.Now.ToShortTimeString();
statusBarPanel2.Text =
System.DateTime.Now.ToShortDateString();
}
Листинг 53.6. Метод для вывода длинных значений часов и даты.
private void timer1_Tick(object sender, EventArgs e)
{
statusBarPanel1.Text =
System.DateTime.Now.ToLongTimeString();
statusBarPanel2.Text =
System.DateTime.Now.ToLongDateString();
}
Листинг 53.7. Код для вывода времени и даты по второму варианту.
label1.Text = System.DateTime.Now.ToLongTimeString();
label2.Text = System.DateTime.Now.ToLongDateString();
Листинг 53.8. Метод для вывода значений секунд, минут и часов.
private void timer1_Tick(object sender, EventArgs e)
{
DateTime currentTime = DateTime.Now;
int seconds = currentTime.Second;
int minutes = currentTime.Minute;
int hours = currentTime.Hour;
progressBar1.Value = seconds;
progressBar2.Value = minutes;
progressBar3.Value = hours;
label1.Text = seconds.ToString();
label2.Text = minutes.ToString();
label3.Text = hours.ToString();
}
Продолжим (в следующей главе) проектирование более сложных анимационных программ (согласно оглавлению системы).
Напомним, что перед написанием любой программы в Form3.cs выше пространства имен с именем нашего проекта подключаем новое пространство имен:
using System.Diagnostics;
Главное, в файл Form3.cs необходимо написать нашу часть кода для открытия проигрывателя при помощи первой основной кнопки “Start Windows Media Player” на данной Form3 (рис. 69.1). Дважды щелкаем эту кнопку в режиме редактирования. Появляется файл Form3.cs с шаблоном, который после записи нашего кода (согласно постановке задачи для управления проигрывателем) принимает такой вид.
Листинг 69.1. Метод для открытия Windows Media.
private void button1_Click (object sender, EventArgs
e)
{
Process.Start("wmplayer.exe");
}
Теперь в файл Form3.cs необходимо написать нашу часть кода для открытия проигрывателя Windows Media с последующим воспроизведением конкретного аудио файла при помощи второй основной кнопки “Start the audio file” на данной Form3 (рис. 69.1). Дважды щелкаем эту кнопку в режиме редактирования.
Появляется файл Form3.cs с шаблоном, который после записи нашего кода принимает такой вид.
Листинг 69.2. Метод для воспроизведения аудио файла.
private void button2_Click (object sender, EventArgs
e)
{
//Запускаем Windows Media Player:
//и воспроизводим конкретный аудио файл:
Process.Start("wmplayer.exe", @"F:\Track03.cda");
}
Напомним, что для версии проигрывателя, старше 6, вместо "mplayer2.exe" надо записать "wmplayer.exe", в пути расположения звукового файла желательно убрать все пробелы, а имя этого файла записать в одной строке кода (без переносов) с предыдущей папкой. Аналогично мы записываем код для воспроизведения любого другого файла, то ли после щелчка этой кнопки, то ли после щелчка новой кнопки (которую мы должны ввести на форму).
Аналогично воспроизводим любой другой файл с компакт-диска или с жесткого диска компьютера.
Листинг 70.1. Метод для воспроизведения видео файла.
private void button2_Click _Click(object sender, EventArgs
e)
{
//Запускаем Windows Media Player
//и воспроизводим конкретный видео файл:
//Process.Start("mplayer2.exe", @"C:\WINNT\clock.avi");
Process.Start("wmplayer.exe", @"C:\WINNT\clock.avi");
}
Напомним, что для версии проигрывателя старше 6 в коде на листинге 70.1 вместо закомментированного файла "mplayer2.exe" записан "wmplayer.exe".
Аналогично записываем код для воспроизведения любого другого файла, то ли после щелчка этой кнопки, то ли после щелчка новой кнопки (которую мы должны ввести на форму).
Листинг 61.1. Метод для компонента Timer1.
//Объявляем и обнуляем глобальную переменную angle:
int angle = 0;
private void timer1_Tick(object sender, EventArgs e)
{
//Экземпляр структуры ntPtr:
IntPtr myIntPtr = new IntPtr();
//Свойство Handle:
myIntPtr = this.Handle;
//Создаем объект myGraphics класса Graphics
//и применяем функцию FromHwnd:
Graphics myGraphics = Graphics.FromHwnd(myIntPtr);
//Задаем параметры прямоугольника:
Rectangle myRectangle = new Rectangle(5, 5, 700, 400);
//Задаем два граничных цвета Red и White
//градиентной заливки:
LinearGradientBrush myLinearGradientBrush =
new LinearGradientBrush(myRectangle,
Color.Red, Color.White, angle);
//Заполняем прямоугольник цветом:
myGraphics.FillRectangle(myLinearGradientBrush,
myRectangle);
//Организовываем циклический процесс вращения:
angle = angle + 10;
if (angle >= 360) angle = 0;
//Высвобождаем ресурсы, выделенные объекту
//myGraphics:
myGraphics.Dispose();
}
Чтобы установить значение свойства Interval компонента Timer в зависимости от свойства Value ползунка элемента управления TrackBar, дважды щелкаем элемент управления TrackBar в режиме проектирования. Появляется файл Form1.cs с шаблоном, в который записываем код, приведенный в предыдущей главе.
Согласно разработанной выше методике, чтобы иметь возможность приостановить (и запустить вновь) процесс анимации при помощи кнопки Stop Animation, дважды щелкаем эту кнопку в режиме проектирования. Появляется файл Form1.cs с шаблоном, в который записываем код, приведенный в предыдущей главе.
Листинг 54.1. Код проектирования рисунка.
//Объявляем глобальную переменную для угла "angle"
//и приравниваем ее нулю:
int angle = 0;
private void pictureBox1_Paint(object sender,
PaintEventArgs e)
{
//Объявляем объект myGraphicsPath класса GraphicsPath:
GraphicsPath myGraphicsPath = new GraphicsPath();
//На объекте myGraphicsPath выполняем процедуру
//AddLine для построения линии по двум точкам
//с координатами (29, 29) и (100, 100):
myGraphicsPath.AddLine(29, 29, 100, 100);
//В классе Matrix создаем объект myMatrix
//в виде матицы преобразований:
Matrix myMatrix = new Matrix(1, 0, 0, 1, 1, 1);
//В структуре PointF создаем объект myPointF
//с координатами точки (100, 100);,
//вокруг которой будет вращаться линия:
PointF myPointF = new PointF(100, 100);
//Поворачиваем линию вокруг точки (100, 100)
//на один шаг при помощи метода RotateAt
//класса Matrix:
myMatrix.RotateAt(angle, myPointF);
//Применяем метод Transform класса GraphicsPath
//для трансформирования матрицы myMatrix:
myGraphicsPath.Transform(myMatrix);
//Рисуем на экране трансформированную линию
//черным пером толщиной 3 (Pen(Color.Black, 3)):
e.Graphics.DrawPath(new Pen(Color.Black, 3),
myGraphicsPath);
//Увеличиваем текущий угол поворота линии
//на один шаг, равный 6 градусам:
angle = angle + 6;
//Обнуляем угол поворота линии,
//когда линия сделает полный оборот в 360 градусов:
if (angle == 360) angle = 0;
//Для наглядности внутри квадрата 200x200
//рисуем окружность (типа циферблата часов)
//синим пером толщиной 2 (Pen(Color.Blue, 2),
//внутри которой будет вращаться линия:
e.Graphics.DrawEllipse(new Pen(Color.Blue, 2),
0, 0, 200, 200);
Все изделия (детали, вещи), которые нас окружают, изготовлены из какого-то исходного материала. Поэтому, чтобы решать какие-либо практические задачи по производству этих изделий, необходимо ввести в нашу вычислительную систему информацию: из какого вида или типа вещества (металла или неметалла) изготовлен тот исходный материал, из которого мы планируем производить сначала заготовки, а затем из заготовок – изделия; какие значения свойств имеет этот материал.
Для примера, укрупнено классифицируем стальной листовой прокат, из которого изготавливают основную массу деталей (например, в промышленности).
Условно делим стальной листовой прокат на три большие группы: сталь без покрытия; сталь с покрытием; сталь, плакированная другими материалами (биметалл).
Сталь без покрытия делим на пять групп: низкоуглеродистая и углеродистая; низколегированная; легированная (коррозионно-стойкая, жаростойкая и жаропрочная); двухфазная; прочие стали. Каждая из этих пяти групп сталей бывает как без покрытия, так и с покрытием. Сталь с покрытием, также для примера, разделим на пять групп в зависимости от материала покрытия: сталь, покрытая оловом; сталь, покрытая цинком; сталь, покрытая свинцом; сталь, покрытая прочим металлом; сталь, покрытая неметаллом. Листовой прокат из двух, трех и более слоев (биметалл) с основным слоем из стали и плакирующего слоя из другого материала, для примера, делим на следующие пять групп: сталь, плакированная алюминием и его сплавами; сталь, плакированная медью и ее сплавами; углеродистая или низколегированная сталь, плакированная коррозионно-стойкой сталью; сталь, плакированная прочим металлом; сталь, плакированная неметаллом. Область применения каждой из этих групп сталей очень разнообразна и описана в специальной литературе.
Мы не можем описывать здесь все многообразие листового проката из цветных металлов и их сплавов. Поэтому для примера делим (условно) листовой прокат из цветных металлов (и их сплавов) и неметаллов на 18 больших групп:
1) алюминий и его сплавы; 2) медь и ее сплавы; 3) магний и его сплавы; 4) никель и его сплавы; 5) титан и его сплавы; 6) цинк и его сплавы; 7) молибден и его сплавы; 8) ниобий и его сплавы; 9) тантал и его сплавы; 10) цирконий и его сплавы; 11) вольфрам и его сплавы; 12) рений и его сплавы; 13) ванадий и его сплавы; 14) кобальт и его сплавы; 15) бериллий и его сплавы; 16) серебро и его сплавы; 17) золото и его сплавы; 18) неметаллы.
Листинг 77.1. Методы для расчета параметров детали.
//Объявляем переменные:
double d, H, Rn, s;
double A, V, m, D;
double rho;
double pi = Math.PI;
//Площадь поверхности детали:
double Area()
{
double A=0, A1, A2, A3;
A1=Area1(); A2=Area2(); A3=Area3();
A=A1+A2+A3;
return A;
}
//Объем детали:
double Volume()
{
A=Area(); V=A*s;
return V;
}
//Масса детали:
double mass()
{
A=Area(); //mm*mm
V=Volume(); //mm*mm*mm
m=V*rho*1.0e-9; // kg
return m;
}
//Диаметр плоской заготовки:
double DBlank()
{
A=Area(); D=Math.Sqrt(4*A/pi);
return D;
}
//Площадь круга:
double Area1()
{
double A1 = pi*(d-2*Rn)*(d-2*Rn)/4;
return A1; //mm*mm
}
//Площадь нижнего тора:
double Area2()
{
double A2 = pi*(Rn-s/2)*(2*(Rn-s/2)+pi*(d-2*Rn)/2);
return A2; //mm*mm
}
//Площадь цилиндра:
double Area3()
{
double A3 = pi*(d-s)*(H-Rn);
return A3; //mm*mm
}
Листинг 77.2. Метод кнопки OK для расчета параметров детали.
private void button5_Click(object sender, EventArgs e)
{
//Считывание данных о геометрии детали
//и плотности материала:
d = Convert.ToDouble(textBox1.Text);
H = Convert.ToDouble(textBox2.Text);
Rn = Convert.ToDouble(textBox3.Text);
s = Convert.ToDouble(textBox4.Text);
rho = Convert.ToDouble(textBox5.Text);
//Расчет параметров детали и вывод в окна:
textBox6.Text = Area().ToString();
textBox7.Text = Volume().ToString();
textBox8.Text = mass().ToString();
textBox9.Text = DBlank().ToString();
textBox1.Focus(); //Курсор - в первое окно.
}
Листинг 77.3. Метод для выполнения анимации.
//Объявляем булеву переменную myColor со значением false:
bool myColor = false;
private void timer1_Tick(object sender, EventArgs e)
{
//Вводим анимацию:
if (myColor == false)
{
//Выводим белый цвет рамки pictureBox1:
this.pictureBox1.BackColor = Color. White;
//Изменяем значение myColor на противоположное:
Теперь в шаблон файла Form7.cs необходимо написать нашу часть кода для выполнения расчетов на калькуляторе. Для решения первой задачи на проценты (при помощи первой кнопки со знаком “=” на данной форме Form7) дважды щелкаем эту кнопку (рис. 12.1). Появляется файл Form7.cs с шаблоном, в который записываем:
double mul1, mul2, mul3;
mul1 = Convert.ToDouble(textBox1.Text);
mul2 = Convert.ToDouble(textBox2.Text);
mul3 = mul1 * mul2/100;
textBox3.Text = mul3.ToString();
textBox4.Focus();
Для решения второй задачи на проценты (при помощи второй кнопки со знаком “=” на данной форме Form7) дважды щелкаем эту кнопку в режиме проектирования (рис. 12.1). Появляется файл Form7.cs с шаблоном, в который записываем:
double mul1, mul2, mul3;
mul1 = Convert.ToDouble(textBox4.Text);
mul2 = Convert.ToDouble(textBox5.Text);
mul3 = mul1/mul2*100;
textBox6.Text = mul3.ToString();
textBox7.Focus();
Для решения третьей задачи на проценты (при помощи третьей кнопки со знаком “=” на данной форме Form7) дважды щелкаем эту кнопку в режиме проектирования (рис. 12.1). Появляется файл Form7.cs с шаблоном, в который записываем:
double mul1, mul2, mul3;
mul1 = Convert.ToDouble(textBox7.Text);
mul2 = Convert.ToDouble(textBox8.Text);
mul3 = mul1/mul2*100;
textBox9.Text = mul3.ToString();
textBox10.Focus();
Для решения четвертой задачи на проценты (при помощи четвертой кнопки со знаком “=” на данной форме Form7) дважды щелкаем эту кнопку в режиме проектирования (рис. 12.1). Появляется файл Form7.cs с шаблоном, в который записываем:
double mul1, mul2, mul3;
mul1 = Convert.ToDouble(textBox10.Text);
mul2 = Convert.ToDouble(textBox11.Text);
mul3 = mul1*(1 + mul2/100);
textBox12.Text = mul3.ToString();
textBox13.Focus();
Для решения пятой задачи на проценты (при помощи пятой кнопки со знаком “=” на данной форме Form7) дважды щелкаем эту кнопку в режиме проектирования (рис. 12.1). Появляется файл Form7.cs с шаблоном, в который записываем:
double mul1, mul2, mul3;
mul1 = Convert.ToDouble(textBox13.Text);
Листинг 15.1. Метод для выполнения вычислений (при помощи Excel).
private void button1_Click(object sender, EventArgs e)
{
//Объявляем объектную переменную objectExcel:
Excel.Application objectExcel =
new Excel.ApplicationClass();
//Объявляем общие объектные переменные:
Object Formula, Result;
//Считываем формулу из окна textBox1
//при помощи свойства Text:
Formula = textBox1.Text;
//Объектная переменная objectExcel
//вычисляет нашу формулу Formula
//при помощи метода “_Evaluate”:
Result = objectExcel._Evaluate(Formula);
//Показываем вычисленное значение Result
//в окне textBox2:
textBox2.Text = Result.ToString();
//Удаляем объектную переменную objExcel
//и освобождаем выделенную под нее память:
objectExcel.Quit();
}
Листинг 15.2. Метод для выполнения анимации.
//Объявляем булеву переменную myVisible со значением false:
bool myVisible = false;
private void timer1_Tick(object sender, EventArgs e)
{
//Программируем анимацию:
if (myVisible == false)
{
//Делаем невидимым элемент управления:
this.button1.Hide();
//Изменяем значение myVisible на противоположное:
myVisible = true;
}
else
{
//Делаем видимым элемент управления:
this.button1.Show();
//Изменяем значение myVisible на противоположное:
myVisible = false;
}
}
Листинг 15.3. Метод для создания печатаемых данных.
private void printDocument1_PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{
//При помощи метода DrawString печатаем исходную формулу:
string msg;
msg = "Formula: " + textBox1.Text + "";
e.Graphics.DrawString(msg, this.Font, Brushes.Black,
200, 100);
//При помощи метода DrawString печатаем результат расчета:
Листинг 48.1. Объявление членов интерфейса и глобальных переменных.
//Объявляем персонаж Джина (Genie) и путь к его файлу:
static AgentObjects.IAgentCtlCharacterEx myGenie;
static String DATAPATH_1 = "Genie.acs";
//Объявляем персонаж Мага (Merlin) и путь к его файлу:
static AgentObjects.IAgentCtlCharacterEx myMerlin;
static String DATAPATH_2 = "Merlin.acs";
//Объявляем персонаж Попугая (Peedy) и путь к его файлу:
static AgentObjects.IAgentCtlCharacterEx myPeedy;
static String DATAPATH_3 = "Peedy.acs";
//Объявляем персонаж Робота (Robby) и путь к его файлу:
static AgentObjects.IAgentCtlCharacterEx myRobby;
static String DATAPATH_4 = "Robby.acs";
//Объявляем член интерфейса Agent:
private AgentObjects.Agent myAgentController;
//Глобальная переменная для любого текста персонажа:
static String mySpeech;
//Объявляем общую для персонажей объектную переменную:
Object myObject = null;
А в шаблон (метода Form1_Load) записываем наш код (согласно постановке задачи для всех персонажей), и метод Form1_Load принимает такой вид.
Листинг 48.2. Загрузка персонажей в элементы управления.
private void Form1_Load(object sender, EventArgs e)
{
//Загружаем персонаж в элемент управления axAgent1:
axAgent1.Characters.Load("Genie", DATAPATH_1);
myGenie = axAgent1.Characters.Character("Genie");
//Чтобы он выполнял голосовые команды на англ. яз.:
myGenie.LanguageID = 0x409;
//Загружаем персонаж в элемент управления axAgent2:
axAgent2.Characters.Load("Merlin", DATAPATH_2);
myMerlin = axAgent2.Characters.Character("Merlin");
//Чтобы он выполнял голосовые команды на англ. яз.:
myMerlin.LanguageID = 0x409;
//Загружаем персонаж в элемент управления axAgent3:
axAgent3.Characters.Load("Peedy", DATAPATH_3);
myPeedy = axAgent3.Characters.Character("Peedy");
Листинг 17.1. Объектная переменная и метод для вызова Word.
//Объявляем объектную переменную objectWord
//и, тем самым, запускаем процессор Word,
//который по умолчанию невидим:
Word.Application objectWord = new Word.ApplicationClass();
private void button6_Click(object sender, EventArgs e)
{
//Делаем Word видимым:
objectWord.Visible = true;
}
Чтобы передать пользователю (а пользователями можем быть и мы, разработчики приложения) или заказчику разработанное нами любое приложение на базе платформы Microsoft Visual Studio (на четырех основных комплексах: Visual Basic, Visual C#, Visual C++, Visual J#), необходимо выполнить следующие этапы:
создание проекта для установки приложения;
добавление (в проект установки приложения) проекта разработанного нами ранее приложения;
ввод ярлыка в меню Start (Пуск);
построение решения из двух проектов;
запуск приложения на компьютере пользователя.
Последовательно рассмотрим эти этапы.
Продолжаем разрабатывать методологию мультимедиа на примере интеграции Visual Basic с очень популярной и перспективной технологией Microsoft Agent. Microsoft Agent – это беспрецедентная программная мультимедийная технология для более естественных путей связи человека и компьютера через создание новых диалоговых интерфейсов. Это набор программных услуг, которые дают возможность разработчикам включать интерактивные анимированные персонажи в их приложения и веб-страницы. Эти персонажи могут говорить при помощи программы (средства, механизма, инструмента, преобразователя) для перевода текста в речь (a text-to-speech engine - TTS), воспроизводить аудио и даже принимать разговорные речевые команды через механизм распознавания речи (speech recognition engine). Microsoft Agent дает возможность разработчикам расширить интерфейс пользователя за пределы распространенных сегодня взаимодействий мыши и клавиатуры. Технология Microsoft Agent может быть применима в следующих областях:
имеется огромное число ролей, которые разработчик в качестве режиссера может создать для персонажей Microsoft Agent и применить в своих программах;
при помощи этих персонажей главный компьютер провайдера может приветствовать новых пользователей и снабдить их показом времени, сообщением о том, что компьютер включен, приложение выполнено или веб-узел просмотрен;
дружественная обучающая программа с такими персонажами могла бы помогать человеку в поэтапном освоении нового материала;
персонаж мог бы представить уведомление или предупреждение, что новая электронная почта прибыла, и затем предложить ее прочитать;
такой помощник мог бы выполнить поиск информации в Интернете, а затем прочитать найденную информацию вслух.
Технология Microsoft Agent предназначена прежде всего для разработчиков, использующих языки или среды, которые поддерживают компонентную объектную модель (Component Object Model – COM) или интерфейсы управления Microsoft ActiveX. Они включают, например, Microsoft Visual Studio (Visual C#, Visual Basic, Visual FoxPro), Microsoft Office (Visual Basic for Applications), Microsoft Internet Explorer (Visual Basic Scripting Edition or Microsoft Jscript), Microsoft Windows Script Host (ActiveX Scripting Language).
Напомним, что перед нами стоит задача: разработать методологию создания вычислительной системы из различных приложений комплекса Visual C# с использованием элементов компьютерной графики. Если в предыдущих главах мы разрабатывали приложения для математических вычислений и построения графиков функций, то с этой главы начнем разрабатывать приложения для решения практических проблем в науке и технике (например, в промышленности, строительстве, сельском хозяйстве и т.д.). Одной из самых распространенных таких проблем является определение площади поверхности, объема и массы любого изделия (вещи, продукта, детали), которое или уже изготавливается, или планируется изготавливать (выпускать). Расчет площади поверхности, объема и массы необходимо выполнять абсолютно для всех изделий (как вновь спроектированных, так и существующих, но, например, модернизированных изделий); такой расчет является самостоятельной (часто сложной) инженерной задачей, которая обычно решается приближенно с заданной точностью. Для решения этой задачи будем использовать объектно-ориентированную философию, которая (как уже отмечалось) включает три основных понятия: объектно-ориентированный анализ; объектно-ориентированное проектирование и объектно-ориентированное программирование ООП (Object Oriented Programming, OOP). С целью реализации принципов объектно-ориентированной философии сначала необходимо разработать класс объектов-изделий.
В этой главе перед нами стоит задача: разработать методику расчета массы заданного по чертежу изделия (детали). Поэтому для нас важным становится следующий (за технологическим признаком) признак классификации, а именно: геометрическая форма изделий. Существует много классификаций изделий по геометрической форме. Для примера выбранную (заранее по технологическому признаку) номенклатуру изделий мы разделим по геометрической форме на следующие классы объектов-изделий:
1. Класс объектов-изделий типа стакана.
2. Класс объектов-изделий типа втулки.
3. Класс объектов-изделий типа оси и так далее.
На прилагаемом к книге компакт-диске приведены все листинги из этой книги в виде файла формата (.doc) для текстового редактора Microsoft Word любой версии, например, Word 2003.
Эти листинги можно вставлять в любую программу, например, по такой схеме.
1. В Visual Studio мы строим проект типа Visual C#, Visual Basic или Visual C++ (с новым синтаксисом) версии 2002, 2003, 2004 или 2005 года по методике, описанной в главе книги.
2. В этом проекте получаем (по описанной в главе книги схеме) шаблон метода (если это возможно), например, при помощи двойного щелчка по имени события в панели Properties на вкладке Events для формы Form1, элемента управления или компонента.
3. В текстовом редакторе Word открываем с компакт-диска файл формата (.doc) с листингами книги, щелкаем по гиперссылке с номером данной главы в оглавлении файла, находим и выделяем мышью код, который мы хотим вставить в шаблон метода, и копируем в буфер обмена (Clipboard) при помощи стандартного приема: правый щелчок по выделенному коду, Копировать (Copy).
4. Открываем файл, например, Form1.cs нашего проекта типа Visual C# и в шаблон метода вставляем (правый щелчок, Вставить – Paste) код из буфера обмена.
5. Если шаблон метода невозможно получить, то с компакт-диска аналогично копируем весь метод (методы) и вставляем в проект типа Visual C#, Visual Basic или Visual C++ 2002 – 2005 годов.
6. Все программы с листингов неоднократно проверены автором и должны строиться и выполняться без предупреждений и ошибок.
7. Мы не приводим проекты Visual Studio 2005, т.к. их невозможно открыть на предыдущих версиях Visual Studio 2002, 2003 и 2004 годов.
Программы с этих листингов могут быть использованы при разработке разнообразных приложений не только на базе Visual Studio 2005, но и на базе предыдущих версий Visual Studio .NET 2002, Visual Studio .NET 2003 и Visual Studio 2004.
Как правило, разработчики программ пишут новые программы не с нуля, а на базе уже известных программ, беря из них отдельные блоки кода и вставляя в новые программы, руководствуясь логикой поставленной задачи.
Если известные базовые программы написаны на том же языке, на котором мы разрабатываем проект, например, на Visual C#, то мы вставляем известные программы в наш новый проект и дорабатываем для решения конкретной задачи.
Если же базовые программы написаны, например, на Visual Basic, т.е. не на том языке, на котором мы разрабатываем проект, то при разработке новых программ на основе известных возможны три основных схемы (варианта).
Первая схема (вариант). Мы переписываем известные программы с Visual Basic на Visual C# и вставляем в новый проект. Например, приведенные в данной книге программы графической системы в двух- и трехмерном пространстве мы сначала написали на более простом языке Visual Basic и опубликовали в наших предыдущих книгах [3,4,8], а затем переписали на Visual C# и приводим в данной книге. Следовательно, методика переписывания программы с Visual Basic на Visual C# за счет изменения, главным образом, только синтаксиса языка в данной книге уже имеется, и аналогично по этой методике можно переписывать другие программы. К слову, подробные таблицы сравнения синтаксиса четырех главных (в мире программирования) языков Basic, C#, C++, J# даны в нашей книге [2].
Вторая схема (вариант). В имеющемся у нас базовом проекте, например, на Visual Basic мы организовываем программу таким образом, чтобы эта программа рассчитывала данные, например, в виде потоков или массивов координат точек геометрических изображений (например, в виде массивов координат узловых точек геометрического тела, поверхности z=f(x,y) и осей координат на плоском экране монитора). Эти массивы мы передаем в новый проект на Visual C#. Такую передачу данных, например, в виде массивов экранных координат точек изображений мы осуществляем в проекте на Visual Basic (по описанной ниже методике) при помощи класса StreamWriter и записи этих массивов в файлы на жестком диске компьютера (например, в текстовые файлы типа D:\MyDocs\MyTest.txt). Далее в нашем новом проекте на Visual C# (или Visual Basic, или Visual C#, или каком-либо другом языке) при помощи класса StreamReader программа считывает из файлов массивы координат и по этим координатам строит изображения при помощи какого-либо метода интерфейса Graphics Device Interface (GDI+), например, DrawLine.
Третья схема (вариант). В этом варианте мы используем так называемую схему или методику “компонент - клиент”.
Листинг 35.1. Метод для рисования геометрических изображений.
private void pictureBox1_Paint(object sender,
PaintEventArgs e)
{
//Объявляем индексы элементов всех массивов:
int i, j, k;
//Задаем границы индексов 1-го массива myArrayVC(i, j):
int N_x = 201; int N_y = 2;
//Объявляем 1-й массив myArrayVC(i, j) переменных float,
//когда i = 0,1,2,3,...,(N_x - 1);
// j = 0,1,2,3,...,(N_y - 1):
float[,] myArrayVC = new float[N_x, N_y];
//Для считывания из файла
//по адресу D:\\MyDocs\\MyTest3D_Graphics.txt
//координат изображения в массив myArrayVC(201, 2)
//создаем объект sr класса StreamReader:
StreamReader sr =
new StreamReader(
@"D:\\MyDocs\\MyTest3D_Graphics.txt");
//Считываем из файла MyTest3D_Graphics.txt
//координаты изображения в массив myArrayVC(201, 2)
//при помощи метода ReadLine:
for (i = 0; i <= N_x - 1; i++)
for (j = 0; j <= N_y - 1; j++)
myArrayVC[i, j] =
Convert.ToSingle(sr.ReadLine());
sr.Close();
//Рисуем первое изображение по координатам из массива.
//Объявляем координаты двух точек:
float x1, y1, x2, y2;
//Будем рисовать пером myPen толщиной 3:
Pen myPen = new Pen(Color.Black, 3);
//Объявляем переменные для начала N_first_line
//и конца N_last_line цикла при рисовании:
int N_first_line, N_last_line;
//Передаем переменным для начала и конца цикла
//значения первых двух элементов массива myArrayVC:
N_first_line = Convert.ToInt32(myArrayVC[0, 0]);
N_last_line = Convert.ToInt32(myArrayVC[0, 1]);
//Рисуем изображение, начиная с точки (1,0; 1,1):
i = -1;
for (k = N_first_line; k <= N_last_line; k++)
{
i = i + 2;
x1 = myArrayVC[i, 0];
Для создания проекта установки:
1. На стартовой странице Visual Studio 2005 щелкаем кнопку или значок New Project (или в меню выбираем File, New, Project).
2. В панели New Project:
в окне Project Types выделяем тип проекта Setup and Deployment Projects; в окне Templates выделяем шаблон Setup Project;
в окне Name оставляем заданное по умолчанию имя проекта Setup1 (рис. 90.1) и щелкаем OK.
В ответ Visual Studio 2005 создает решение (Solution), состоящее пока из одного проекта установки приложения, и выводит следующий интерфейс этого проекта установки в виде панели File System (рис. 90.2).
В левой части этой панели File System показана файловая система компьютера, на который будет установлено приложение, а справа – содержимое выбранной папки из левой части. Пока в этих папках ничего нет, и нам необходимо их заполнить. И то, что мы сейчас видим в правом окне на рис. 90.2, будет добавлено позднее.
В Visual Studio 2005 существует еще несколько вариантов разработки баз данных с использованием специальных шаблонов проекта Database по следующей схеме. В VS щелкаем New Project (или File, New, Project), в панели New Project (рис. 22.1) в окне Project Types открываем папку Visual C# и выделяем Database, в окне Templates выделяем шаблон SQLServer Project; в окне Name оставляем записанное по умолчанию имя проекта SQLServerProject1, в окне Location оставляем по умолчанию (или выбираем новый) путь к папке, в которой будет расположен проект, щелкаем OK.
Появляется панель SQLServerProject1 (рис. 22.2), в окна которой мы должны записать (или выбрать из имеющихся) имена сервера и базы данных.
В данном примере видно (рис. 22.2), что на нашем компьютере имеется соединение сервера Z-1 с базой данных Northwind (которую мы уже применяли выше).
Щелкаем кнопку OK (рис. 22.2). Создается проект для базы данных.
Жарков В.А. Visual C# .NET в науке и технике. – М .: Жарков Пресс, 2002.
Жарков В.А. Самоучитель Жаркова по Visual Studio .NET: Visual Basic .NET, Visual C# .NET, Visual C++ .NET, Visual J# .NET. – М .: Жарков Пресс, 2002.
Жарков В.А. Самоучитель Жаркова по Visual Basic .NET. – М .: Жарков Пресс, 2002.
Жарков В.А. Самоучитель Жаркова по анимации и мультипликации в Visual Basic .NET 2003. – М .: Жарков Пресс, 2003.
Жарков В.А. Самоучитель Жаркова по анимации и мультипликации в Visual C# .NET 2003. – М .: Жарков Пресс, 2003.
Жарков В.А. Самоучитель Жаркова по анимации и мультипликации в Visual C++. – М .: Жарков Пресс, 2003.
Жарков В.А. Самоучитель Жаркова по интеграции Visual Basic .NET 2003 с другими платформами. – М .: Жарков Пресс, 2003.
Жарков В.А. Компьютерная графика, мультимедиа и игры на Visual Basic. – М.: Жарков Пресс, 2004.
Жарков В.А. Visual C++ на практике. – М.: Лаборатория Базовых Знаний, 2002.
Zharkov V.A. Theory and Practice of Deep Drawing. – London, Mechanical Engineering Publications Limited, 1995.
Гарнаев А.Ю. Самоучитель Visual Studio .NET 2003. – СПб.: БХВ-Петербург, 2003.
Stephens R. Visual Basic Graphics Programming. 2nd Edition. New York, Wiley Computer Publishing, 1999.
Microsoft Visual Studio 2005.
Microsoft DirectX 9.0 SDK Update – (Summer 2004).
Для установки на компьютер среды разработки (платформы) 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 System | Visual Studio 2005 can be installed on any of the following systems:
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 Drive | Required | ||
| Display | Minimum: 800 x 600 256 colors
Recommended: 1024x768 High Color — 16-bit | ||
| Smart Device Development | ActiveSync 3.7.1
Microsoft .NET Framework Version 1.1 (for Smartphone 2003 projects) | ||
| Mouse | Microsoft mouse or compatible pointing device |
Все платформы Visual Studio 2005, Visual Studio 2004, Visual Studio .NET 2003 и Visual Studio .NET 2002 созданы в виде редакций: Enterprise Architect, Enterprise Developer, Professional. Каждая редакция включает такие основные языки программирования: Visual Basic, Visual C#, Visual C++, Visual J#. Установка на компьютер любой версии этой платформы подробно описана в нашей книге [1].
Проверяем в работе новую форму. Для этого строим программу и запускаем ее на выполнение обычным образом: Build, Build Solution; Debug, Start Without Debugging. В ответ Visual C# выполняет программу и на рабочий стол выводит первую форму (с оглавлением нашей системы) в режиме выполнения. После щелчка переключателя 1 (или кнопки Next>>, или нажатия клавиш Alt+1) появляется наша Form3, показанная выше на рис. 17.1.
После щелчка первой кнопки “Запуск Word (Starting Word)” на Form3, на экране монитора появляется рабочий стол с интерфейсом Word, при помощи которого стандартным образом можно создавать новый документ, открывать существующий документ и далее редактировать этот документ всеми средствами Word.
На форму можно ввести эффекты анимации аналогично тому, как мы это сделали выше, а также мультипликационные персонажи, как это мы сделаем ниже. Несколько вариантов проверки орфографии и расчет статистических данных о тексте при помощи Word можно разработать по аналогии с нашими книгами [7, 8].
Cтроим программу и запускаем на выполнение обычным образом: Build, Build Solution; Debug, Start Without Debugging. В ответ Visual C# запускает программу и на рабочий стол выводит форму Form1 в режиме выполнения.
После загрузки Form1 на ней начинается показ нашего маленького мультфильма в следующей последовательности эпизодов.
Автоматически появляется Джин, выполняет первую анимацию и произносит (через динамики компьютера) первый текст (при этом губы персонажа шевелятся в такт с текстом), согласно приведенному выше нашему коду:
//Персонаж выполняет анимацию Announce:
myGenie.Play("Announce");
//Произносит записанную нами речь:
mySpeech =
"Здравствуйте, меня зовут Джин. " +
"Спасибо за Ваше внимание ко мне.";
myGenie.Speak(mySpeech, myObject);
Одновременно над головой персонажа выводится динамическая подсказка, и внутри этой подсказки анимационно (в динамике) буква за буквой выводится текст, согласовано с движениями губ персонажа (рис. 49.2).
Проверяем в работе новую форму. Для этого строим программу и запускаем ее на выполнение обычным образом: Build, Build Solution; Debug, Start Without Debugging.
В ответ Visual C# выполняет программу и на рабочий стол выводит первую форму (с оглавлением нашей системы) в режиме выполнения.
После щелчка переключателя 2 (или нажатия клавиш Alt+2, или щелчка кнопки Next>> на предыдущей Form3) появляется Form5, показанная на рис. 70.1.
После щелчка первой основной кнопки “Start Windows Media” на экране монитора появляется проигрыватель Windows Media Player соответствующей версии (показанный в предыдущей главе), в котором можно воспроизводить файлы.
После щелчка второй основной кнопки “clock.avi” появляется проигрыватель Windows Media и начинается воспроизведение видео файла с именем, которое мы записали в код. На рис. 70.2 видны часы, на которых перемещается секундная стрелка и изменяются цифры от 1 до 12 со звуковым сигналом каждую секунду.
После окончания воспроизведения можно продолжать выполнять любые операции, поддерживаемые интерфейсом Windows Media.
Аналогично воспроизводим любой другой файл.
Мы закончили часть нашей книги по методологии интеграции (взаимодействия) комплекса Visual С# (из платформы Visual Studio 2005) с проигрывателями серии Windows Media Player корпорации Microsoft для решения широко распространенных задач по воспроизведению аудио и видео файлов.
И теперь по этой методологии мы можем постепенно дополнять эти задачи другими возможностями данной интеграции.
Проверяем созданный нами второй калькулятор. Для этого строим программу и запускаем ее на выполнение обычным образом: Build, Build Solution; Debug, Start Without Debugging.