Методуказания II семестр
.pdfDrawing2D :: DashStyle).
Стиль:
DashStyle::Dash |
Прерывистая линия |
DashStyle::DashDot |
Линия – точка |
DashStyle::DashDotDot |
Линия – точка – точка |
DashStyle::DashDot |
Линия точками |
DashStyle::Solid |
Сплошная линия |
Замкнутые фигуры можно закрашивать: однородным цветом (SolidBrush), штриховкой
(HatchBrush), текстурой (TextureBrush), линейным градиентом (LinearGradientBrush) и траекторный градиент (PathGradientBrush).
Примеры
Линии, прямоугольники, эллипсы
Graphics^ g = pictureBox1->CreateGraphics();// Создает графический объект и
// связываем его с графическим окном g->Clear(Color::White) ; // цвет фона задаем белым
// Рисуем линию определенного стиля
Pen^ pen1 = gcnew Pen(Color::Blue, 3.0); // создаем перо синего цвета и толщиной 3пик Pen1->DashStyle = System::Drawing::Drawing2D::DashStyle::Dash; // задаем стиль пера g->DrawLine(pen1, 20,120, 100,60); // рисуем линию
// Рисуем закрашенный квадрат
SolidBrush^ sb1 = gcnew SolidBrush(Color::Red); // задаем заливку g->FillRectangle(sb1, 60,30, 40,40); // рисуем закрашенный квадрат
//Рисуем закрашенный прямоугольник и его окантовку
SolidBrush^ sb2 = gcnew SolidBrush(Color::Yellow); Pen^ pen2 = gcnew Pen(Color::Aqua, 2.0);
Pen2->DashStyle = System::Drawing::Drawing2D::DashStyle::Dot; g->FillRectangle(sb2, 90,40, 60,45);
g->DrawRectangle(pen2, 90,40, 60,45);
//Рисуем закрашенный эллипс
HatchBrush^ hb1 = gcnew HatchBrush(HatchStyle::DiagonalCross, Color::Black, Color::Green);
g->FillEllipse(hb1, 30,100, 65,50); // Рисуем наклонный эллипс
Pen^ pen3 = gcnew Pen(Color::Fuchsia, 2.0);
pen3->DashStyle = System::Drawing::Drawing2D::DashStyle::DashDotDot; g->ResetTransform();
g->RotateTransform(45); g->DrawEllipse(pen3, 70, -10, 100, 50);
Кардинальные сплайны (Cardinal Spline)
Graphics^ g = pictureBox1->CreateGraphics(); g->Clear(Color::White);
Point point1 = Point(0,100); Point point2 = Point(50,80); Point point3 = Point(100,20); Point point4 = Point(150,80); Point point5 = Point(200,100);
array<Point>^ curvePoints = {point1,point2,point3,point4,point5}; Pen^ pen = gcnew Pen(System::Drawing::Color::Aquamarine, 2); g->DrawCurve(pen, curvePoints);
21
Ход работы:
|
Построить график функции |
|
|
||
|
|
ρ= a cos2 ϕ − b sin 2 ϕ |
|
|
|
|
|
a= 40 , 0≤ ϕ ≤ 2π , Δϕ = 0,05 , для b :10≤ b≤ 100 , заданный в полярных координатах |
|||
1. |
|
Создайте проект для проектирования приложения с графическим интерфейсом, и |
|||
назовите его, например, «Графика, ваша_фамилия» (Графика, Иванов Виктор). |
|||||
2. |
|
Для объекта Форма установите следующие свойства в окне свойств объекта: |
|||
|
|
Свойство |
Значение |
|
|
|
|
Text |
Графика, Иванов Виктор (Ваша фамилия) |
|
|
|
|
StartPosition |
CenterScreen |
|
|
3. |
|
Добавим объект PictureBox (Графическое окно) |
. |
|
PictureBox (Графическое окно) - окно, которое может использоваться для отображения графических объектов в различных форматах и графических элементов.
В свойство Name обычно добавляют префикс pct. Установим свойства графического окна:
Свойство |
Значение |
Name |
pctDraw |
BorderStyle |
FixedSingle |
Size |
272; 272 |
4. Добавим метку и установим ее свойства
Свойство |
Значение |
Name |
lblb |
Font |
Comic Sans MS; 12pt; style=Bold |
Text |
b=65 |
TextAlign |
MiddleCenter |
5. Добавим объект HScrollBar (Горизонтальная полоса прокрутки) |
. |
|
HScrollBar (Горизонтальная полоса прокрутки) |
используется для реализации |
возможности прокрутки в контейнерах, не предоставляющих собственных полос прокрутки, например PictureBox, или для ввода числовых данных вручную. Числовые данные могут отображаться в объекте или использоваться в коде.
Основные свойства полосы прокрутки:
Value – значение полосы прокрутки.
Minimum, Maximum – минимальное и максимальное значение; SmallChange – шаг изменения.
В свойство Name обычно добавляют префикс scr.
Основное событие:
Scroll – реакция на изменение значения.
Установим свойства полосы прокрутки
Свойство |
Значение |
Name |
scrb |
Maximum |
109 |
Minimum |
10 |
Value |
65 |
22
6.Добавим две кнопки и установим для них свойства
Name |
Text |
btnDraw |
Нарисовать |
btnExit |
Выход |
7.В результате получим форму
8.Сразу после строки
#pragma endregion
и перед
}; }
float x2,y2; static int a=40;
9. Определим функции и события объектов (цифрами проставлена очередность написания функций, с целью последовательной отладки приложения)
Функции приложения (сразу после объявления глобальных переменных)
! Функции приложения прописываются полностью: и заголовок, и тело функции.
(3) Функция вычисления значений координат private: System::Void func(float f, int b)
{
x2 = (a * pow(cos(f),2) - b * pow(sin(f),2)) * cos(f); y2 = (a * pow(cos(f),2) - b * pow(sin(f),2)) * sin(f);
}
Событие Формы
! События добавляются из списка событий () при двойном нажатии на соответствующем событии объекта. При этом, заголовок и скобки функции добавляются автоматически, вам остается добавить лишь код тела функции.
(1) Закрытие формы
private: System::Void btnExit_Click(System::Object * sender, System::EventArgs * e)
{
Close(); // закрытие формы
}
Событие Полосы прокрутки
(2) Отображение в метке значения полосы прокрутки
private: System::Void scrb_Scroll(System::Object^ sender, System::Windows::Forms::ScrollEventArgs^ e)
{
lblb->Text=String::Concat("b = ", (scrb->Value).ToString()); // Функция
String::Concat соединяет все элементы (строковые), в одну строку // Функция ToString() преобразует число в строку
}
23
Событие Кнопки
(4) Рисование графика функции
private: System::Void btnDraw_Click(System::Object^ sender, System::EventArgs^ e)
{
int b=scrb->Value; // запись в переменную значения полосы прокрутки float h=0.05,k_max,tt,x1,y1; // h - шаг
for(float f=0;f<=2*System::Math::PI;f=f+h) // определяем максимальное значение координат для правильного масштабирования
{
func(f,b); // вызов функции для вычисления значений координат if(f==0) // если первый шаг цикла
k_max=(x2>y2) ? x2 : y2; // в k_max записываем максимальное из значений координат
else
{
tt=(x2>y2) ? x2 : y2; // в tt записываем макс.из значений координат k_max=(tt>k_max) ? tt : k_max; // в k_max записываем макс.значение
}
}
Graphics^ g = pctDraw->CreateGraphics(); // создаем объект класса Graphics для объекта PictureBox pctDraw, на котором будет отображаться график функции
g->Clear(Color::White) ; // очищаем графич. окно белым цветом int pict_size=(pctDraw->Width<pctDraw->Height)? pctDraw->Width : pctDraw->Height; //
запоминаем минимальное значение из размеров графич. окна pict_size/=2;
g->ScaleTransform(pict_size/k_max, pict_size/k_max); // масштабируем будущий рисунок, чтобы он заполнил всю область рисования
g->TranslateTransform(pctDraw->Width/2, pctDraw->Height/2, Drawing2D::MatrixOrder::Append); // перемещаем точку начала координат на середину объекта
Pen^ p=gcnew Pen(Color::Black); // создаем объект перо для рисования графика черным цветом
g->DrawLine(p, -pctDraw->Width/2, 0.0, pctDraw->Width/2, 0.0); // рисуем ось Х g->DrawLine(p, 0.0, -pctDraw->Height/2, 0.0, pctDraw->Height/2);// рисуем ось Y float f = 0;
func(f,b); // вызов функции для вычисления значений координат x1 = x2; // запоминаем вычисленные координаты в точку начала y1 = y2; // -||-
p->Color=Color::Green; // задаем цвет пера как зеленый int xmax=0, ymax=0;
for(float f=h;f<=2*System::Math::PI+h;f=f+h) // цикл рисования графика
{
func(f,b); // вычисляем координаты последней точки
g->DrawLine (p, x1, y1, x2, y2); // рисуем линию с координатами
x1 = x2; // запоминаем координаты последней точки в качестве начальной y1 = y2; // -||-
xmax=(x1>xmax) ? x1 : xmax; // запоминаем макс. значение координаты Х ymax=(y1>ymax) ? y1 : ymax; // запоминаем макс. значение координаты У
}
g->DrawString( (xmax).ToString(),gcnew Drawing::Font("Arial", 8), gcnew SolidBrush(Color::Black), xmax,0, gcnew StringFormat()); // пишем значение максимальной точки по Х
g->DrawString( (ymax).ToString(),gcnew Drawing::Font("Arial", 8), gcnew SolidBrush(Color::Black), 0, -ymax, gcnew StringFormat());// пишем значение максимальной точки по У
delete p;
}
24
ПРИМЕР ОФОРМЛЕНИЯ ЛАБОРАТОРНОЙ РАБОТЫ
ФЕДЕРАЛЬНОЕ АГЕНСТВО ПО ОБРАЗОВАНИЮ
Государственное образовательное учреждение высшего профессионального образования
ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Факультет социально-экономический Кафедра «Прикладная информатика»
Лабораторная работа № __
Вар__
по дисциплине «Информатика и программирование»
Выполнил |
|
|
студент гр. |
_______________ |
/ Иванов И.С./ |
|
(дата, подпись) |
|
Проверила |
|
|
ст. преп.каф.БИ |
_______________ |
/ Козьминых Н.М./ |
|
(дата, подпись) |
2010
Задание: создать приложение с графическим интерфейсом для построения графика функции, заданного в полярных координатах.
ρ=acos2 ϕ − b sin2 ϕ
a= 40 , 0≤ ϕ ≤ 2π , Δϕ = 0,05 , для b:10≤ b≤ 100
25
Эскиз формы во время разработки и вид формы во время выполнения
Таблица свойств объектов
Объект |
Name |
Другие свойства |
|
Button |
btnDraw |
Text:= Нарисовать |
|
btnExit |
Text: Выход |
||
|
|||
|
lblb |
Font: Comic Sans MS; 12pt; style=Bold |
|
Label |
|
Text: b=65 |
|
|
|
TextAlign: MiddleCenter |
|
PictureBox |
pctDraw |
BorderStyle: FixedSingle |
|
|
scrb |
Maximum: 109 |
|
HScrollBar |
|
Minimum: 10 |
|
|
|
Value: 65 |
Список идентификаторов
Область видимости |
|
Назначение |
|
|
Иденти- |
Тип |
|
|
|
|
|
фикатор |
|
Глобальные |
Переменные координат |
|
|
x2, y2 |
float |
|
Статическая переменная коэффициента |
|
а |
static int |
|||
|
|
|||||
|
Переменные координат |
|
|
x1, y1 |
float |
|
|
Переменная коэффициента |
|
|
b |
int |
|
|
Переменная угла |
|
|
f |
float |
|
Локальные |
Переменная шага |
|
|
h |
float |
|
Переменная |
максимального |
из |
значений |
k_max |
float |
|
|
координат для масштабирования графика |
|
|
|
||
|
|
|
|
|
|
|
|
Временная переменная |
|
|
tt |
float |
|
|
Переменная минимального значения из размеров |
pict_size |
int |
|||
|
графического окна |
|
|
|
|
Программные коды
stdafx.h – файл с подключаемыми библиотеками проекта
#include <stdlib.h> #include <malloc.h> #include <memory.h> #include <tchar.h> #include <math.h>
Form.h – файл формы проекта
float x2,y2; static int a=40;
26
Функции приложения
Функция вычисления значений координат private: System::Void func(float f, int b){
x2 = (a * pow(cos(f),2) - b * pow(sin(f),2)) * cos(f); y2 = (a * pow(cos(f),2) - b * pow(sin(f),2)) * sin(f);
}
Событие Формы
Закрытие формы
private: System::Void btnExit_Click(System::Object^ sender, System::EventArgs^ e){ Close();
}
Событие Полосы прокрутки
Отображение в метке значения полосы прокрутки
private: System::Void scrb_Scroll(System::Object^ sender, System::Windows::Forms::ScrollEventArgs^ e){
lblb->Text=String::Concat("b = ", (scrb->Value).ToString());
}
Событие Кнопки
Рисование графика функции
private: System::Void btnDraw_Click(System::Object^ sender, System::EventArgs^ e){ int b=scrb->Value;
float h=0.05,k_max,tt,x1,y1;
for(float f=0;f<=2*System::Math::PI;f=f+h)
{
func(f,b); if(f==0)
k_max=(x2>y2) ? x2 : y2;
else
{
tt=(x2>y2) ? x2 : y2; k_max=(tt>k_max) ? tt : k_max;
}
}
Graphics^ g = pctDraw->CreateGraphics(); g->Clear(Color::White) ;
int pict_size=(pctDraw->Width<pctDraw->Height)? pctDraw->Width : pctDraw->Height; pict_size/=2;
g->ScaleTransform(pict_size/k_max, pict_size/k_max); g->TranslateTransform(pctDraw->Width/2, pctDraw->Height/2,
Drawing2D::MatrixOrder::Append); Pen^ p=gcnew Pen(Color::Black);
g->DrawLine(p, -pctDraw->Width/2, 0.0, pctDraw->Width/2, 0.0); g->DrawLine(p, 0.0, -pctDraw->Height/2, 0.0, pctDraw->Height/2); func(f,b);
x1 = x2;
y1 = y2; p->Color=Color::Green; int xmax=0, ymax=0;
for(float f=h;f<=2*System::Math::PI+h;f=f+h)
{
func(f,b);
g->DrawLine (p, x1, y1, x2, y2); x1 = x2;
y1 = y2;
xmax=(x1>xmax) ? x1 : xmax; ymax=(y1>ymax) ? y1 : ymax;
}
g->DrawString( (xmax).ToString(),gcnew Drawing::Font("Arial", 8), gcnew SolidBrush(Color::Black), xmax,0, gcnew StringFormat());
g->DrawString( (ymax).ToString(),gcnew Drawing::Font("Arial", 8), gcnew SolidBrush(Color::Black), 0, -ymax, gcnew StringFormat());
}
27
ЛАБОРАТОРНАЯ РАБОТА №9
Работа с массивами
Цель работы: создать приложение с графическим интерфейсом для работы с одномерными массивами.
План работы: в течение трех занятий студент должен изучить материал текущей лабораторной работы и продемонстрировать свои навыки преподавателю. В результате чего студент получает две оценки: за приложение и за изученный материал.
Задание: создать приложение для работы с одномерными массивами, для решения следующих задач:
1.Четные элементы массива переставить в конец массива.
2.Вставить заданное число перед последним положительным элементом.
Требование к отчету:
1.Номер и название лабораторной работы.
2.Текст задания.
3.Структура приложения.
4.Таблица свойств объектов.
5.Список идентификаторов.
6.Блок-схема алгоритма.
7.Программные коды.
Создадим приложение для работы с одномерными массивами, причем управление приложением будет возможно как при помощи кнопки мыши, так и при помощи только клавиатуры. Ход работы:
6. |
Создайте проект для проектирования приложения с графическим интерфейсом, и |
|||
назовите его, например, вашей фамилией с номером лабораторной работы (Иванов6). |
||||
7. |
Для объекта Форма установите следующие свойства в окне свойств объекта: |
|||
|
Свойство |
Значение |
|
|
|
Text |
|
Работа с массивом, Иванов Виктор (Ваша фамилия) |
|
|
StartPosition |
CenterScreen |
|
|
|
8. |
Для приложения создадим меню. |
Объект меню предоставляет следующие возможности:
1.эффективное использование пространства экрана;
2.меню для пользователей является привычным элементом. Создание меню:
3.поместите на форму объект меню ;
4.внизу окна дизайнера форм появится соответствующий значок, выделите его;
5.в верхнем левом углу разрабатываемой формы появится прямоугольник с текстом
TypeHere;
6.нажмите на него правой кнопкой мыши и выберите пункт Insert New (Вставить Новый);
7.в окне свойств можно изменить его свойства, в том числе Name (Имя объекта) и Text (Информация, выводимая на экран), например, mnuTask и Задачи соответственно, где mnu – префикс;
8.для создания подменю на нижележащий TypeHere нажмите правой кнопкой мыши и выберите пункт Insert New и т.д.
28
Создайте меню следующего вида со следующими свойствами:
Name |
Text |
Другие свойства |
mnuTask |
Задачи |
Enabled = False |
mnu1 |
Задача 1 |
- |
mnu2 |
Задача 2 |
- |
mnuExit |
Выход |
- |
9.Добавим в проект объект Panel (Панель) .
Панель – это контейнер, который служит для объединения элементов в группу, после чего, помещенными в него объектами, можно управлять как единым целым.
Основные свойства панели: Name, BackColor, ForeColor, Font, Enabled, Locked, Visible, Size и
др.
В свойство Name обычно добавляют префикс pnl. Поместите его на форму следующим
образом и определите свойства
Свойство |
Значение |
Name |
pnlz |
Visible |
False |
10. Добавим в проект объект GroupBox (Рамка) . Рамка – это контейнер, который служит для
объединения элементов в группу, после чего, помещенными в него объектами, можно управлять как единым целым.
Основные свойства рамки : Name, Text, BackColor, ForeColor, Font, Enabled, Locked, Visible, Size и др.
В свойство Name обычно добавляют префикс grb.
Поместите на форму три рамки и определите для них следующие свойства:
Name |
Text |
Visible |
grbEl |
Ввод элементов массива |
False |
grbBasic |
Исходный массив |
False |
grbWork |
Результат |
False |
11. Поместите на форму, уже известные вам объекты, метки (Label), текстовые окна (TextBox), кнопки (Button) со следующими свойствами:
Контейнер |
Объект |
Name |
Text |
Другие свойства |
|
Label |
lblVvod |
Введите количество элементов |
|
Form |
|
|
|
|
TextBox |
txtN |
|
|
|
|
Button |
btnN |
Ок |
|
|
Label |
lblz |
Введите задан.зн. |
|
pnlz |
TextBox |
txtz |
|
|
|
Button |
btnz |
Ок |
|
|
Label |
lblEl |
Введите 1 элем. |
Visible=false |
|
TextBox |
txtEl |
|
Visible=false |
grbEl |
|
btnEl |
Ок |
Visible=false |
|
Button |
|
|
|
|
btnRnd |
Случайным образом |
|
|
|
|
btnKlav |
С клавиатуры |
|
grbWork |
Label |
lblTask |
|
|
29
12.Добавим в проект объект ListView (Список просмотра).
Список просмотра – позволяет выводить список элементов, в том числе и в табличной форме. Поместите на форму две таблицы и определите для них следующие свойства:
Контейнер |
Name |
GridLines |
View |
grbBasic |
lvBasic |
True |
Details |
grbWork |
lvWork |
True |
Details |
13.В результате получим форму
14.Объявим глобальные переменные
int n, *a, *b;
15. Определим функции и события объектов (цифрами проставлена очередность написания функций, с целью последовательной отладки приложения)
Функции приложения (сразу после объявления глобальных переменных)
! Функции приложения прописываются полностью: и заголовок, и тело функции.
(6) Функция вывода элементов массива на экран
private:System::Void vivod(GroupBox^ grb,ListView^ lv,int * w,int kol,String^ text){ grb->Visible=true; // объект GroupBox сделать видимым
if(text!="") // если параметр text не пустой
lblTask->Text=text; // в метку выводим значение параметра text lv->Clear(); // очищаем объект ListView
ListViewItem^ item1 = gcnew ListViewItem(); // создаем объект элемента строки lv->Columns->Add(S"", 30, HorizontalAlignment::Center); // создаем заголовок
(столбец) для первого элемента строки
item1->Text=S"Arr[]"; // присваиваем этому элементу значение for(int i=0;i<kol;i++)
{
30