Недавно начал изучать c#, и не могу сделать вот такое задание: Создать программу которая позволяет рисовать в формате графических примитив: окружность, отрезок, прямоугольник, сектор, текст, эллипс, и закрашенный сектор. Выбор того или иного графического примитива осуществляется с помощью элемента управления listbox. Буду благодарен за помощь.
Только лишь для затравки...
Начнем с абстракции
public enum FigureType
{
Circle,
Line,
Rectangle,
Sector,
Text,
Ellipse,
ShadedSector
}
interface IFigure
{
FigureType Type { get; }
string Name { get; }
Point FirstPoint { get; set; }
Point SecondPoint { get; set; }
}
Далее реализуем интерфейс так
class Figure : IFigure
{
//ctor
public Figure(FigureType figureType, string name)
{
if (string.IsNullOrEmpty(name)) throw new ArgumentException(nameof(name));
Type = figureType;
Name = name;
}
public FigureType Type { get; private set; }
public string Name { get; private set; }
public Point FirstPoint { get; set; }
public Point SecondPoint { get; set; }
}
Сама форма такая
public partial class Form1 : Form
{
private IFigure _selectedFigure;
private bool _IsDrawing;
public Form1()
{
InitializeComponent();
SetDataToListBox();
_listBoxFigures.SelectedIndexChanged += ListBoxFigures_SelectedChanged;
_panelCanvas.MouseDown += PanelCanvas_MouseDown;
_panelCanvas.MouseUp += PanelCanvas_MouseUp;
_panelCanvas.Paint += PanelCanvas_Paint;
this.CenterToScreen();
this.Text = "Примерчик";
}
/// <summary>
/// Заполнение списка
/// </summary>
private void SetDataToListBox()
{
_listBoxFigures.DataSource = new List<IFigure>
{
new Figure(FigureType.Line, "Отрезок"),
new Figure(FigureType.Rectangle, "Прямоугольник"),
new Figure(FigureType.Circle, "Окружность"),
};
_listBoxFigures.DisplayMember = nameof(IFigure.Name);
}
/// <summary>
/// Обработка события выбора в списке
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ListBoxFigures_SelectedChanged(object sender, EventArgs e)
{
if (_listBoxFigures.SelectedItem == null) return;
_selectedFigure = _listBoxFigures.SelectedItem as IFigure;
}
/// <summary>
/// Обработка события нажатия левой кнопки мыши на Панели
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void PanelCanvas_MouseDown(object sender, MouseEventArgs e)
{
if (_selectedFigure == null) return;
_selectedFigure.FirstPoint = new Point(e.X, e.Y);
}
/// <summary>
/// Обработка события отпускания кнопки мыши на Панели
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void PanelCanvas_MouseUp(object sender, MouseEventArgs e)
{
if (_selectedFigure == null) return;
_selectedFigure.SecondPoint = new Point(e.X, e.Y);
_IsDrawing = true;
_panelCanvas.Refresh();
}
/// <summary>
/// Обработка события перерисовки Панели
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void PanelCanvas_Paint(object sender, PaintEventArgs e)
{
if (!_IsDrawing) return;
switch (_selectedFigure.Type)
{
case FigureType.Circle:
throw new NotImplementedException();
case FigureType.Line:
DrawLine(e.Graphics);
break;
case FigureType.Rectangle:
DrawRectangle(e.Graphics);
break;
case FigureType.Sector:
throw new NotImplementedException();
case FigureType.Text:
throw new NotImplementedException();
case FigureType.Ellipse:
throw new NotImplementedException();
case FigureType.ShadedSector:
throw new NotImplementedException();
}
_IsDrawing = false;
}
/// <summary>
/// Рисование Прямоугольника
/// </summary>
/// <param name="graphics"></param>
private void DrawRectangle(Graphics graphics)
{
var width = _selectedFigure.SecondPoint.X - _selectedFigure.FirstPoint.X;
var height = _selectedFigure.SecondPoint.Y - _selectedFigure.FirstPoint.Y;
var rectangle =
new Rectangle(_selectedFigure.FirstPoint.X, _selectedFigure.FirstPoint.Y, width, height);
Pen blackPen = new Pen(Color.Black, 5);
graphics.DrawRectangle(blackPen, rectangle);
blackPen.Dispose();
}
/// <summary>
/// Рисование Линии
/// </summary>
/// <param name="graphics"></param>
private void DrawLine(Graphics graphics)
{
Pen blackPen = new Pen(Color.Black, 5);
graphics.DrawLine(blackPen, _selectedFigure.FirstPoint, _selectedFigure.SecondPoint);
blackPen.Dispose();
}
}
Работает это так
Весь пример можно скачать здесь
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Имеется код html страницы, в котором есть такие теги как "span itemprop=\"name\">" Я без труда нахожу значение, но проблема в том, что находит значение самого...
Хочу начать использовать Sphinx, так как есть сайт с большой базой и медленными запросамиВсякая оптимизация не помогла достичь нужной скорости,...