User Rating: 0 / 5

Рисуем фигуры на C# при помощи средств GDI+

Рисуем фигуры на C# при помощи средств GDI+

User Rating: 0 / 5

Изображение к статье создано при помощи нейросети Kandinsky

Доброго времени суток, друзья.

В сегодняшней статье мы разберём с вами некоторые возможности GDI+ и научимся рисовать различные простые графические фигуры и примитивы на форме в приложении Windows Forms.

Описание того, что такое GDI+, можно найти по следующей ссылке на официальном сайте: https://learn.microsoft.com/ru-ru/dotnet/desktop/winforms/advanced/about-gdi-managed-code?view=netframeworkdesktop-4.8

Отмечу лишь кратко, что аббревиатура GDI обозначает Graphics Device Interface (т.е. интерфейс графического устройства), и по сути это часть операционной системы Windows, которая предоставляет возможность для создания векторных изображений и рисования. Также стоит упомянуть, что GDI+ является частью .NET Framework.

Итак, в рамках этой статьи мы рассмотрим возможности рисования при помощи средств GDI+ следующих фигур:

  • Прямоугольник (Rectangle) - нарисуем контур прямоугольника и закрашенный прямоугольник на форме
  • Эллипс (Ellipse) - нарисуем контур эллипса и закрашенный эллипс на форме
  • Полигон (Polygon) - нарисуем контур полигона и закрашенный полигон на форме
  • Дуга (Arc) - нарисуем на форме небольшой отрезок дуги. Дугой называется часть окружности или эллипса, заключённая между двумя заданными точками, принадлежащими этой окружности/эллипсу.
  • Сектор (Pie) - нарисуем на форме сектор и закрашенный сектор. Сектор похож на дугу, но отличается от неё тем, что две крайние точки дуги соединены радиальными линиями с центром окружности/эллипса.
  • Линии (Line) - нарисуем на форме 3 различных линии, каждая из которых будет иметь свой стиль штриха.
  • Фундаментальный сплайн (Curve) - мы нарисуем на форме несколько фундаментальных сплайнов. Три из них будут открытыми, и два из них будут закрытыми. О том, какие есть различия между открытыми и закрытыми фундаментальными сплайнами, мы посмотрим далее по тексту статьи.
  • Графический путь (GraphicsPath) - нарисуем на форме графический путь, состоящий из нескольких линий и дуги
  • Текст - выведем на форме текст, содержащийся в тестовой строковой переменной

Давайте сразу посмотрим на тот результат, который мы получим в конце статьи. Итак, у нас будет простое приложение для Windows Forms, с единственной главной формой, отображающейся при старте приложения. И на форме будут нарисованы перечисленные выше фигуры следующим образом:

 

Добавить комментарий
Пишем 2D-игру в стиле Arkanoid на C#

Пишем 2D-игру в стиле Arkanoid на C#

User Rating: 0 / 5

Изображение к статье создано при помощи нейросети Kandinsky

Всем привет.

В сегодняшней статье мы напишем с вами игру в стиле Arkanoid, используя для этого язык C#.

Прежде, чем мы начнём погружение в разработку самой игры, подсвечу некоторые примерные входные навыки и знания, которые будут нужны от читателя для лучшего понимания изложенного ниже материала. Итак, читатель:

  • должен уже иметь некоторый опыт разработки программ на C# и понимать основные принципы объектно-ориентированного программирования (наследование, инкапсуляция, полиморфизм), а также быть знакомым с понятием классов и интерфейсов в C#, включая понятие универсальных методов, классов и интерфейсов в C#
  • должен понимать различия в модификаторах доступа public, protected, private, которые используются в языке C# и применяются к методам, полям и свойствам классов
  • должен иметь опыт создания проектов в среде Microsoft Visual Studio с типом проекта "Приложение Windows Forms (.NET Framework)", а также понимать, где и как настраиваются свойства формы и её элементов управления, а также что такое события и как создавать обработчики событий
  • должен быть знаком с понятием действий (Action) и классом Func, доступном в C#, а также понимать принцип работы лямбда-выражений
  • должен понимать, как работают события (event) и что такое делегаты (delegate) в языке C#
  • должен быть знаком с UML-нотацией и понимать диаграмму классов на UML
  • должен в общих чертах понимать, что такое GDI+ и основные принципы обработки события Paint, работу с классами Pen, Brush, Font, Graphics 

Если по одному из вышеперечисленных пунктов вы видите, что пока не полностью владеете одной из этих тем, это не означает, что вы не поймете эту статью (я буду стараться излагать материал максимально понятно), но всё же могут возникнуть определённые сложности в понимании некоторых аспектов разработки рассматриваемой в статье игры. Поэтому если какие-то части статьи будут не полностью понятны, я рекомендую просто отдельно углубиться в одну из данных тем и изучить её более глубоко, если это необходимо, а затем вернуться к анализу тех сложных участков кода, которые встретятся в статье.

В конце данной статьи-урока вы найдёте ссылку на архив с готовым решением и разработанной игрой.

Итак, давайте приступим к созданию игры.

Добавить комментарий
Поддержка нескольких языков в приложении Windows Forms

Поддержка нескольких языков в приложении Windows Forms

User Rating: 0 / 5

Photo by Brett Zeck on Unsplash | Использованное фото к статье от Brett Zeck на Unsplash

Всем привет.

В сегодняшней статье я расскажу про один из возможных вариантов поддержки нескольких языков в приложении Windows Forms, а в качестве языка программирования для демонстрационного приложения, которое мы разработаем в рамках статьи, будет использован язык C#. Также отмечу, что примерно аналогичную методику я использовал при разработке приложения AINSideBar, где была поддержана локализация на русский, английский, немецкий и китайский языки.

Итак, что мы разберём в рамках этой статьи:

  • разработаем простое приложение для Windows Forms, которое будет приветствовать пользователя по имени, введённому в текстовом поле на главной форме. Приложение будет поддерживать локализацию на следующие языки, в качестве примера: русский, белорусский, немецкий, английский, китайский, испанский и португальский. Аналогичным образом при необходимости вы сможете поддержать в своих программах любое требуемое вам количество других языков;
  • разработанное приложение будет использовать в качестве ссылки отдельную библиотеку классов, содержащую ресурсы, представляющие собой строки, переведённые на указанные языки. Эти строки - различные сообщения, которые программа будет использовать в своей работе, причём они не относятся к элементам главной формы приложения. Сами же элементы на главной форме приложения мы переведём на разные языки, используя другой способ;
  • приложение будет хранить настройку "последний использованный в программе язык" и считывать её при загрузке, сразу переводя интерфейс программы на этот язык;
  • программа сможет переключаться между поддерживаемыми в ней языками без необходимости перезапуска приложения;
  • посмотрим, как можно использовать свойство Tag для элемента ToolStripMenuItem, чтобы хранить метаинформацию о языке, связанном с этим пунктом меню.
Добавить комментарий
Пример на C# с перегрузкой операторов, индексатором и реализацией IEnumerable для операций над множествами

Пример на C# с перегрузкой операторов, индексатором и реализацией IEnumerable для операций над множествами

User Rating: 0 / 5

Изображение к статье создано при помощи нейросети Kandinsky

Всем привет.

В этой статье мы постараемся затронуть следующие темы, относящиеся к разработке программ на C#:

  • перегрузка операторов (на примере перегрузки операторов +, -, /, *)
  • индексаторы (не основная тема статьи, но индексатор будет применён в примере рассматриваемого кода)
  • перечислители и реализация интерфейса IEnumerable

Предполагается, что читатель уже имеет некоторый опыт разработки программ на C#, поскольку в примерах кода ниже помимо перечисленных тем также будет рассмотрена и тема универсальных классов и методов. Если вы ещё не сталкивались с этими понятиями при разработке на C#, то могу порекомендовать официальную документацию, например, эту статью.

В контексте данной статьи прежде всего будет сделан упор на перегрузку операторов, и мы напишем консольную программу на C#, демонстрирующую возможности перегрузки операторов в языке C#.

В качестве задачи мы реализуем следующую несложную концепцию: предположим, что мы хотим в программе на C# уметь определять некоторые множества чисел, например, множество чисел, тип которых intdecimal или long и так далее. И мы хотим, чтобы эти множества поддерживали между собой операции сложения (+), вычитания (-), деления (/) и умножения (*).

Рассмотрим на примере. Пусть у нас есть 2 множества целых чисел, и имена этих множеств - A и B, а тип данных каждого элемента множества - это int:

Множество A: 

Позиция элемента: 0 1 2 3 4 5
Элемент множества в позиции: 5 7 10 15 35 25

Как видим, в множестве всего 6 элементов, первый равен 5, и его позиция 0. Второй равен 7, и его позиция 1 и так далее.

Множество B: 

Позиция элемента: 0 1 2 3 4 5
Элемент множества в позиции: 207 402 347 572 721 928

В этом множестве также 6 элементов, первый равен 207, и его позиция 0. Второй равен 402, и его позиция 1 и так далее.

Мы хотим сделать так, чтобы поддерживались следующие элементарные операции над множествами:

Добавить комментарий
Измеряем скорость кода на C#, или насколько быстр LINQ?

Измеряем скорость кода на C#, или насколько быстр LINQ?

User Rating: 0 / 5

Всем привет, друзья.

Эта статья не будет лонгридом, и в ней я просто покажу на примере, как можно выполнить измерение скорости кода в программе на C#. В качестве эксперимента я решил сегодня сравнить скорость работы двух циклов: один без использования LINQ (обычный цикл foreach), второй - с использованием LINQ в рамках очень простой и небольшой программы на C#.

С помощью мастера создания новых проектов я создал консольное приложение, назвал его CodeExecutionSpeedExample и создал в нём вот такой простой класс Book:

namespace CodeExecutionSpeedExample {
    internal class Book {
        internal string Title { get; set; }
        internal int PagesCount { get; set; }
        internal int YearPublished { get; set; }

        public Book(string title, int pagesCount, int yearPublished) {
            Title = title;
            PagesCount = pagesCount;
            YearPublished = yearPublished;
        }

        public override string? ToString() {
            return string.Format("Книга {{ Название={0}, Кол-во страниц={1}, Год издания={2} }}", Title, PagesCount, YearPublished);
        }
    }
}

Как можно заметить, он имеет всего три свойства Title, PagesCount и YearPublished и описывает некоторую книгу, у которой есть название, количество страниц в ней и год её издания.

Добавить комментарий
Яндекс.Метрика