Как рисовать в visual studio 2019

Обновлено: 07.07.2024

Под катом мы пошагово перепишем ту бутсекторную демку под UEFI, и она будет работать в полноцветном видеорежиме с высоким разрешением. С другой стороны, вместо 512 байт она будет занимать несколько десятков КБ.

▍ 1. Подготовка среды

Четыре года назад DarkTiger постил туториал о разработке под UEFI в Visual Studio, и даже опубликовал шаблон среды, позволяющий начать разработку, не ломая голову над настройками edk2: «Достаточно дать команду git clone . в корневом каталоге диска, и это на самом деле все, среда будет полностью установлена и готова к работе.» Шаблон этот был жёстко привязан не только к корневому каталогу, но и к Visual Studio 2015, к древней версии edk2, и к 32-битной компиляции. Чтобы работать в Visual Studio 2019, поддержка которой появилась в более новых версиях edk2, шаблон понадобится осовременить. Ещё одно изменение за эти четыре года — то, что для сборки в edk2 стал необходим Python.

Осовремененный шаблон (170 МБ трафика, 600 МБ на диске) развёртывается командой:

  1. Копия edk2 заменена ссылкой (git submodule) на официальный репозиторий;
  2. Добавлены бинарники Python 3.5, и сборочные скрипты внутри NT32.vcxproj задают переменную PYTHON_HOME , нужную для edk2;
  3. Захардкоженный путь C:\FW\ в файлах vcxproj заменён на $(SolutionDir)\..\;
  4. Скрипту edksetup.bat вместо ставшего неактуальным параметра --nt32 передаются Rebuild VS2019 : первый указывает на необходимость скомпилировать edk2\BaseTools\Bin\Win32 (несмотря на название параметра, компиляция выполняется инкрементально); второй — на используемый тулчейн.

Перед сборкой нужно поменять внутри edk2\BaseTools\Conf\target.template значения TARGET_ARCH на X64 и TOOL_CHAIN_TAG на VS2019 ; после этого можно открывать VS\NT32.sln , жать F5, и всё скомпилируется и запустится. Чтобы удостовериться, что среда полноценно работает, введите в UEFI Shell команду fs0:HelloWorld.efi :


Модуль HelloWorld мы и возьмём за основу для нашей демки.

▍ 2. Тригонометрия

Отрисовываемая демкой линия — это вертикально растянутая архимедова спираль, и для расчёта координат её точек Chris Fallin использовал инструкции fcos и fsin . Увы, но тригонометрические функции в Си не встроены: они относятся к стандартной библиотеке, а её из edk2 исключили. Нет в MSVC и инлайн-ассемблера для x64, так что функцию SinCos придётся реализовывать в отдельном ассемблерном файле, следуя примеру Benjamin Kietzman. Поместите его файл SinCos.asm рядом с исходником HelloWorld.c в каталоге edk2\MdeModulePkg\Application\HelloWorld , а в файл проекта HelloWorld.inf допишите секцию:


Символ _fltused должен быть объявлен в каждой MSVC-программе, использующей double . Обычно его экспортирует стандартная библиотека, но нам его приходится объявлять вручную.

▍ 3. Пиксельная графика

Стандартный для UEFI графический API называется GOP (Graphics Output Protocol), и он крайне прост: поддерживается ровно одна функция вывода, Blt , копирующая прямоугольный блок пикселей между памятью и экраном. Кроме этого, может быть доступен прямой доступ к видеопамяти, и тогда отображение пикселя на экране — это просто запись UINT32 по нужному адресу. Спираль-ёлочку удобно рисовать попиксельно, напрямую в видеопамять:


Увы, включённый в состав edk2 эмулятор не поддерживает прямой доступ к видеопамяти, так что в поле gop->Mode->FrameBufferBase будет NULL . Чтобы тестировать код, требующий прямого доступа к видеопамяти, можно использовать улучшенную версию эмулятора, собранную Alex Ionescu: запускается он командой:
— и каталог с результатами сборки будет подмонтирован как fs1:

Сразу заметны три проблемы, унаследованные из бутсекторной демки:

  1. Экран вначале очищается вызовом gST->ConOut->ClearScreen , а затем на нём по одному зажигаются пиксели спирали-ёлочки. Вызываемое этим мерцание заметно даже на гифке. Чтобы от него избавиться, ёлочку надо отрисовывать в невидимый буфер, а затем вызовом Blt отправлять на экран одним целым. Мы же объявим мерцание воображаемых гирлянд тёплой и ламповой фичей демки, и оставим его как есть.
  2. Единственный способ выйти из демки — перезагрузка. Для загрузчика в режиме Legacy BIOS это нормально (куда ж из него выходить?), но из UEFI-приложения хотелось бы иметь возможность выйти обратно в UEFI Shell. В конце цикла, после задержки — проверим, была ли нажата какая-нибудь клавиша:

▍ 4. Графические ресурсы

Изображение, выводимое рядом со спиралью-ёлочкой в бутсекторной демке, захардкожено прямо в ассемблерном исходнике простынью из определений db . Это неудобно: как такое изображение редактировать? Гораздо удобнее работать с BMP-файлом. Такую возможность даёт HII Database (Human Interface Infrastructure), вскользь упомянутая в туториале от DarkTiger как хранилище шрифтов, доступных UEFI-приложениям. Изображения, как и шрифты, включаются в PE-образ приложения как ресурсы. Для того, чтобы добавить в ресурсы BMP-изображение, нужно несколько неочевидных шагов:


А в начало UefiMain — код для загрузки изображения:


После получения указателя на GOP можно проинициализировать структуру Output :


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

▍ 5. Работа с Blt

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


Теперь удалим объявление структуры Output и её инициализацию, и вместо этого создадим буфер:


В начале цикла нет надобности очищать весь экран: вместо этого вызовом Blt(EfiBltVideoFill) очистим лишь ту часть, где рисуется спираль-ёлочка.


Саму спираль сместим вниз на высоту логотипа:


И в завершение художества — в конце цикла, перед задержкой, рассчитываем и отрисовываем вызовом Blt(EfiBltBufferToVideo) плавно мигающий логотип:


Окончательный вариант кода лежит в репозитории в каталоге HelloWorld, а его работа показана на ролике в начале и конце статьи.

В Конструктор XAML фигура — это именно то, что нужно ожидать. Например, прямоугольник, круг или эллипс. Объект контур является более универсальной версией фигуры. Можно, например, изменить эти объекты или объединить их в форме новых фигур.

Для фигур и контуров используется векторная графика, поэтому их легко масштабировать для дисплеев с высоким разрешением.

Рисование фигуры

Фигуры можно найти в окне Ресурсы.

снимок экрана: категория "фигуры" окна "активы" в Blend для Visual Studio

Перетащите любую нужную фигуру в область рисования. Затем используйте маркеры фигуры, чтобы масштабировать, поворачивать, перемещать и наклонять фигуру.

Рисование контура

Контур — это последовательность соединенных линий и кривых. Используйте контур для создания интересных фигур, которые недоступны в окне Ресурсы.

Контур можно нарисовать с помощью линии, пера или карандаша. Эти инструменты доступны на панели Средства.

Рисование прямой линии

Используйте средства Перо или Линия.

Использование средства "Перо"

Щелкните один раз в области рисования, чтобы определить начальную точку, а затем щелкните еще раз для задания конечной точки линии.

Использование средства "Линия"

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

Рисование кривой

Используйте средство Перо.

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

Если требуется замкнуть контур, щелкните начальную точку линии.

Изменение формы кривой

Используйте средство Непосредственное выделение.

Щелкните фигуру, а затем потяните за любую точку на фигуре, чтобы изменить форму кривой.

Рисование контура произвольной формы

Используйте средство Карандаш.

Нарисуйте произвольный контур в области рисования, как если бы вы пользовались настоящим карандашом.

Удаление части контура

Используйте средство Непосредственное выделение.

Выберите контур, содержащий сегмент, который требуется удалить, и нажмите кнопку Удалить .

Удаление точки контура

Используйте средство Выделение, чтобы выбрать контур. Затем с помощью средства Перо выделите точку, которую требуется удалить.

Добавление точки контура

Используйте средство Выделение, чтобы выбрать контур. С помощью средства Перо щелкните в любом месте контура, где необходимо добавить точку.

Преобразование фигуры в контур

Чтобы изменить фигуру теми же способами, которые вы использовали для изменения контура, преобразуйте фигуру в контур. Выберите фигуру, а затем щелкните Формат > пути > Преобразование в путь.

Посмотрите короткое видео: , работающих с путями: Преобразование фигуры в контур.

Функция Преобразовать в путь сейчас недоступна для приложений UWP с TargetPlatformVersion версии 10.0.16299.0 и выше.

Объединение контуров

Контуры и фигуры можно объединить в один контур.

Число Действие
Две фигуры до объединения
Две фигуры до объединения
Объединение
Объединение
Divide
Divide
Пересечение
Пересечение
Исключение наложения
Исключение перекрытия
Subtract
Subtract

Посмотрите короткое видео: , работающих с путями: объединение путей.

Создание составного пути

При создании составного контура все пересекающиеся части контуров исключаются из результата, и результирующий контур принимает визуальные свойства нижнего контура.

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

Прерывание составного контура

Посмотрите короткое видео: , работающих с путями: создание составного пути.

Создание контура кадрирования

Контур обрезки — это контур или фигура, применяемая к другому объекту, чтобы скрыть части маскируемого объекта за пределами контура обрезки.

Посмотрите короткое видео: , работающих с путями: создание обтравочного контура.

Как нарисовать геометрические фигуры
Помогите нарисовать геометрические фигуры (например треугольник,круг) в библиотеке dll. Пока что.

Как узнать пересекаются ли геометрические фигуры?
На форме рисую фигуры которые описываются Regionами Polygon = New Drawing2D.GraphicsPath().


Как рисовать фигуры?
Не так давно начал работать на си. Помогите пожалуйста. с помощью графики нарисовать такие картинки:

Всем привет. Вопрос конечно гулповатый, но все же. Нужно про помощи WinApi прорисовывать элементарные геометрические фигуры на какой либо форме. Все вроде бы проще простого, но как то синтаксис в голове не укладывается. Может кто нибудь исходник кинуть для прорисовки простой линии, а дальше я уже разберусь, заранее огромное срасибо. - да можно, в этом топике реализовывал более широкое задание, соединение линиями кликов мыши в консоли
Построить ломаную по заданным вершинам
Кроме LineTo есть Rectangle (рисует прямоугольник) и Elipse (овал, круг) Еще один вопрос, какую библу нужно подрубить и можно просто код, который рисует обычную линию на форме с получением дискриптора этой формы, пожалуйста, заранее спасибо

Решение

Еще один вопрос, какую библу нужно подрубить и можно просто код, который рисует обычную линию на форме с получением дискриптора этой формы, пожалуйста, заранее спасибо

, плохо что код не пытаешсь сам изучить
Ладно вот накидал проектик

Порядок действий при рисовании линии:
1: создаешь перо которым будешь рисовать: функция CreatePen
2: выбираешь это перо: функция SelectObject
3: используешь функции MoveToEx и LineTo
4: освобождаешь перья: функция DeleteObject
Пример по той же ссылке.

Простой способ - использовать gdi.
Отрисовка происходит по событию WM_PAINT.

- не стал бы так утверждать WM_PAINT потребует как минимум введения WindowProc, а тат в консоли рисуешь и всё +

Запустите Microsoft Visual Studio. Данный урок построен на базе версии 2012 года. Алгоритм работы с графикой аналогичен и для других версий.


Чтобы создать новый проект зайдите в меню "ФАЙЛ" в левом верхнем углу и выберите "Создать" -> "Проект" (или комбинацией клавиш Ctrl + Shift + N)как показано на рисунке.



После создания проекта у вас на экране появится Форма (Form1) и Панель Элементов. Выберите их этой панели объекты:

  • Button - кнопка,
  • PictureBox - поле для рисования,

и расположите эти объекты на созданной ранее форме.


Выбрав на форме объект PictureBox, на панели "Свойства" вы можете настроить его характеристики. Например: Во вкладке "Макет" -> "Size" вы можете указать точный размер объекта в пикселях.

  • Width - ширина по X ;
  • Height - высота по Y ;


Выберите на своей форме объект Button1. В окне "Свойства" найдите кнопку "События" , во вкладке "Действие" напротив "Click" выберите название метода, отвечающего за событие при нажатии на кнопку.


В файле Form1.cs будет создан метод, и будет представлять из себя:

Между фигурными скобками "< >" необходимо написать код, который будет выполняться на событие клика по кнопке.


Например, можно нарисовать прямоугольник следующим образом:



и файл Form1.cs будет иметь вид:

Чтобы запустить Проект нужно нажать на кнопку "Запуск" в виде зеленого треугольника на панели действий, или использовать "горячую клавишу" F5.

Читайте также: