Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КУРСОВИК ПРОГРАММИРОВАНИЕ.docx
Скачиваний:
1
Добавлен:
27.10.2018
Размер:
1.61 Mб
Скачать

Добавление иконки к компоненте, описания к компоненте, добавление компоненты на Палитру элементов. Добавление иконки компоненты

Чтобы добавить иконку к компоненте, нужно:

  1. Сначала нужно нарисовать значок размером 16х16, палитра 16 цветов и формата BMP или ICO. Сохранить его нужно в папке, где написан наш проект.

  2. Так как значок должен храниться внутри *.dll компоненты, то соответствующий файл нужно добавить к проекту (меню Project/Add Existing Item).

  3. В свойствах файла иконки параметру Build Action нужно установить в значение Embedded Resource (Внедренный ресурс)

  1. Добавить атрибуты, указывающие как найти значок, перед объявлением класса компоненты (мы указываем тип, к которому добавляем иконку, а так же название рисунка для иконки):

[ToolboxBitmap(typeof(ManControl), "Man.bmp")]

public partial class ManControl: UserControl// класс компоненты

Добавление описания компоненты.

Чтобы добавить описание, нужно добавить следующий атрибут перед объявлением класса компоненты:

[Description("Двжущийся человек")]

public partial class ManControl: UserControl// класс компоненты

Он будет виден в сплывающей подсказке, при наведении курсора на компонент в Панели компонентов.

Добавление компоненты на палитру

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

  1. Выбрать команду Choose Items (Выбрать элементы) в контекстном меню панели Toolbox (Инструменты) в нужной группе компонент.

  1. Появится диалоговое окно, предлагающие выбрать компоненты (*.dll), которые будут отображаться в этой группе компонент. Если мы не находим нужную нам в предложенном списке, мы можем подгрузить её самостоятельно, нажав кнопку Browse и выбрать путь к файлу <Название компоненты>.dll

  1. После этого компоненты появится в списке. Выбираем ее и закрываем диалоговое окно. Компонент <Название компоненты> появится в палитре компонентов. Так же, как и картинка, и описание.

Текст программы

Rotary.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Drawing;

namespace ManComponent

{

enum RotateDir

{

ClockWise, // по часовой стрелки

CounterClockWise // против часовой стрелки

}

// класс описывающий вращающюся часть тела, относительно его центра

class Rotary

{

//ПОЛЯ

PointF pos; // начальная точка (центр вращения)

double angle; // угол

float length; // длина

double minAngle;// начальный угол

double maxAngle; // конечный угол - углы задают пределы вращения

public RotateDir dir; // положительное направление вращения

Rotary child; // другая вращ. часть тела, нач, точка которой совпадает с конечной

//стачичная переменая класса - "общая" для всех

static double da = Math.PI / 20d; // угловая скорость вращения

//СВОЙСТВА

public double MaxAngle { get { return maxAngle; } set { maxAngle = value; } }

public double MinAngle { get { return minAngle; } set { minAngle = value; } }

public double Angle

{

get { return angle; }

set

{// преобразуем новый угол, если он отрицательный или больше чем 360 градусов

double a = value;

if (value >= 2 * Math.PI)

a = value - Math.PI * 2;

else if (value < 0)

a = 2 * Math.PI + value;

//если новый угол попадает в заданый диапозон(между min и max)

if (IsAbleToRotate(a))

{

angle = a;

UpdateChild();

return;

}

//если угол находится радом с границей заданного диапазона

else if (Math.Abs(maxAngle - value) < da)

angle = maxAngle;

else if (Math.Abs(minAngle - value) < da)

angle = minAngle;

UpdateChild();

}

}

public PointF Pos { get { return pos; } }

public PointF EndPoint { get { return new PointF(X + (float)Math.Cos(angle) * length, Y + (float)Math.Sin(angle) * length); } }

public float X { get { return pos.X; } set { pos.X = value; } }

public float Y { get { return pos.Y; } set { pos.Y = value; } }

//стачиное свойства да переменой da

public static double dAngle { get { return da; } set { if (value >= 0 && value < Math.PI * 2) da = value; } }

void Initialize(float x, float y, float len, int ang, RotateDir direction)

{

pos = new PointF((float)x,(float)y);

dir = direction;

angle = (double)ang/180d*Math.PI; length = len;

child = null;

minAngle = 0; maxAngle = 2 * Math.PI;

}

public Rotary(float x, float y, float len, int ang,RotateDir direction, Rotary ch)

{

Initialize(x, y, len, ang, direction);

child = ch;

child.dir = dir;

UpdateChild();

}

public Rotary(float x, float y, float len, int ang, RotateDir direction)

{

Initialize(x, y, len, ang, direction);

}

public Rotary(float len, int ang)

{

Initialize(0, 0, len, ang, RotateDir.ClockWise);

}

void UpdateChild()

{

if (child != null)

{

child.X = X + (float)Math.Cos(angle) * length;

child.Y = Y + (float)Math.Sin(angle) * length;

}

}

public void Draw(Graphics g,Color color)

{

g.DrawLine(new Pen(color,5), pos, EndPoint);

if (child != null)

child.Draw(g,color);

g.FillEllipse(new SolidBrush(color),EndPoint.X-5f,EndPoint.Y -5f,10,10);

}

bool IsAbleToRotate(double a)

{

double lb = minAngle; // нижняя граница

double ub = maxAngle; //

if (dir ==RotateDir.CounterClockWise)

{

ub = minAngle;

lb = maxAngle;

}

if (ub > lb)

if (a >= lb && a <= ub) return true;

else return false;

else if ((a >= lb && a < Math.PI * 2) || (a >= 0 && a < ub))

return true;

else return false;

}

public void SetRange(int min, int max)

{

minAngle = (double)min/180d*Math.PI;

maxAngle = (double)max/180d*Math.PI;

}

public void RotateUp() // вращать по направлению

{

if (dir == RotateDir.CounterClockWise)

Angle -= da;

else Angle += da;

}

public void RotateDown() // вращать против направления

{

if (dir == RotateDir.CounterClockWise)

Angle += da;

else Angle -= da;

}

}

}

Man.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Drawing;

namespace ManComponent

{

class Head

{

const int r = 25;

int x, y;

public Head(int X, int Y)

{

x = X; y = Y;

}

public void Draw(Graphics g,Color color) { g.FillEllipse(new SolidBrush(color),x-r/2,y-r/2,r,r); }

}

class Man

{

int x, y, len;

public Color color;

public Rotary lArm, lElbow, rArm, rElbow,lLeg,lKnee,rLeg,rKnee;

public Head head;

public Man(int X,int Y, int length)

{// положение человечка центр головы, длина туловища

x = X; y = Y; len = length;

color = Color.Blue;

lElbow = new Rotary(30,90); // левый локоть(предплечее)

lElbow.SetRange(90,270);

lArm = new Rotary(x,y+length*0.2f,30, 135, RotateDir.ClockWise,lElbow); //левая рука

lArm.SetRange(135,225);

lKnee = new Rotary(35, 90);

lKnee.SetRange(90, 180);

lLeg = new Rotary(x, y + len, 35, 135, RotateDir.ClockWise, lKnee);

lLeg.SetRange(125, 180);

rElbow = new Rotary(30, 90); // правый локоть

rElbow.SetRange(90,270);

rArm = new Rotary(x, y + length * 0.2f, 30, 45, RotateDir.CounterClockWise, rElbow); // правая рука

rArm.SetRange(45, 315);

rKnee = new Rotary(35, 90);

rKnee.SetRange(90, 0);

rLeg = new Rotary(x, y + len, 35,45, RotateDir.CounterClockWise, rKnee);

rLeg.SetRange(45, 0);

head = new Head(x, y);

}

public void Draw(Graphics g)

{

lArm.Draw(g,color);// левая рука

rArm.Draw(g,color); // правая рука

lLeg.Draw(g,color);// левая нога

rLeg.Draw(g,color);// правая нога

head.Draw(g,color);//голова

g.DrawLine(new Pen(color,5), x, y, x, y + len);

}

}

}

ManControl.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Drawing;

using System.Data;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace ManComponent

{

[ToolboxBitmap(typeof(ManControl), "Man.bmp")]

[Description("Двжущийся человек")]

public partial class ManControl : UserControl

{

Man man;

[Category("Движущийся человек"), Description("Угловая скорость"), Browsable(true)]

public double dAngle { get { return Rotary.dAngle; } set { if (value >= 0 && value < Math.PI * 2) Rotary.dAngle = value; } }

[Category("Движущийся человек"), Description("Цвет человека"), Browsable(true)]

public Color Color { get { return man.color; } set { man.color = value; Refresh(); } }

public ManControl()

{

InitializeComponent();

man = new Man(Width/2,40,80);

Color = Color.Black;

}

private void ManControl_Paint(object sender, PaintEventArgs e)

{

man.Draw(this.CreateGraphics());

}

public void GetLeftArmUp()

{

man.lArm.RotateUp();

man.lElbow.RotateUp();

Refresh();

}

public void GetLeftLegUp()

{

man.lLeg.RotateUp();

man.lKnee.RotateUp();

Refresh();

}

public void GetRigthLegUp()

{

man.rLeg.RotateUp();

man.rKnee.RotateUp();

Refresh();

}

public void GetRightArmUp()

{

man.rArm.RotateUp();

man.rElbow.RotateUp();

Refresh();

}

public void GetLeftArmDown()

{

man.lArm.RotateDown();

man.lElbow.RotateDown();

Refresh();

}

public void GetLeftLegDown()

{

man.lLeg.RotateDown();

man.lKnee.RotateDown();

Refresh();

}

public void GetRigthLegDown()

{

man.rLeg.RotateDown();

man.rKnee.RotateDown();

Refresh();

}

public void GetRightArmDown()

{

man.rArm.RotateDown();

man.rElbow.RotateDown();

Refresh();

}

}

}

Внешний вид компоненты.

Внешний вид отладочного приложения

Пиктограмма для палитры компонентов.

Оглавление

Задание. 1

Анализ предметной области. Выявление состава, структуры, и возможных состояний объекта. 1

Анализ характерного поведения. 1

Класс Вращающаяся часть тела 2

Класс Голова 3

Класс Человек 4

Выбор и обоснование программного решения. 4

Разработка интерфейса и состава необходимых средств в виде свойств, событий и методов. 5

Добавление иконки к компоненте, описания к компоненте, добавление компоненты на Палитру элементов. 5

Добавление иконки компоненты 5

Добавление описания компоненты. 6

Добавление компоненты на палитру 6

Текст программы 7

Внешний вид компоненты. 12

Внешний вид отладочного приложения 13

Пиктограмма для палитры компонентов. 13

14