Как рисовать в visual studio
БлогNot. Visual Studio, простое рисование на графической канве формы и дисплея
Visual Studio, простое рисование на графической канве формы и дисплея
В блоге уже есть ряд заметок, показывающих работу с графической канвой формы в Visual C++ (раз, два). Цель этого примера — продемонстрировать, как одним и тем же кодом вывести программно созданный рисунок сначала в окно формы, а затем просто на дисплей вне окна. Сделать последнее позволяет метод GetDC из Windows API, получающий контекст графического устройства.
Итак, создадим пустой проект Windows Forms, я делал из сохранённого заранее шаблона в Studio 2015. Дальше процесс расписан по шагам.
1. В классе формы определён флажок, показывающий, нужно ли перерисовывать картинку:
private: bool Redraw;
2. Он инициализирован в методе Load формы (так как при загрузке нужно отрисовать в первый раз):
private: System::Void MyForm_Load(System::Object^ sender, System::EventArgs^ e) < this->DoubleBuffered = true; //Включить для формы двойную буферизацию, чтоб не было "мерцаний" Redraw = true; >
3. Всё рисование делается в методе Paint формы (исключений из этого правила мало):
private: System::Void MyForm_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) < if (Redraw) Draw(e->Graphics); //Удобнее иметь свой отдельный метод для рисования > void Draw(System::Drawing::Graphics^ g) < //Графический контекст передан в наш метод array ^pens = gcnew array (3) < Pens::Red, Pens::Green, Pens::Black >; //Разные перья для рисования int width = (this->ClientSize.Width-1) / 2, //Половинки ширины и высоты клиентской части окна height = (this->ClientSize.Height-1) / 2; for (int i = 0; i < 2; i++) //Демо - рисуем перьями g->DrawEllipse(pens[i], i*width, i*height, width, height); array ^brushes = gcnew array (2) < Brushes::Red, Brushes::Green >; //Разные кисти для выполнения заливки цветом for (int i = 0; i < 2; i++) //Демо - рисуем кистями g->FillEllipse(brushes[i], i*width, i*height, width, height); g->DrawLine(pens[2], 0, 0, width*2, height*2); //Рисуем линию пером Redraw = false; //Ставим состояние "перерисовано" >
4. Некоторые события формы должны будут инициализировать принудительную перерисовку, например, когда пользователь закончил изменение размеров окна (событие SizeChanged ):
private: System::Void MyForm_SizeChanged(System::Object^ sender, System::EventArgs^ e) < Redraw = true; //Установить флажок Invalidate(); //Принудительно перерисовать >
5. Передав в наш Draw другой графический контекст (например, контекст графического экрана Windows), можно нарисовать ту же графику «в другом месте», например, поверх всех окон или под ними.
Покажем в качестве примера перехват графического контекста основного дисплея (при изменении размеров окна нашей формы картинка будет перерисовываться вне окна формы, начиная с левого верхнего угла экрана). Решение работает только для Windows.
5.1. Заинклудить в самом начале файла формы .h:
#include
5.2. Подключить к проекту стандартную Windows-библиотеку user32 . Для этого перейти к меню Проект, Свойства проекта, открыть слева список Компоновщик, затем Ввод, и прописать в поле «Дополнительные зависимости» значение
user32.lib
5.3. Проверить, что в namespace проекта подключены
using namespace System::Drawing; using namespace System::Runtime::InteropServices;
5.4. Метод Paint формы изменится, так как перед вызовом Draw он будет получать графический контекст дисплея:
private: System::Void MyForm_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) < if (Redraw) < HDC DesktopPointer = GetDC(NULL); Graphics ^ g = Graphics::FromHdc((IntPtr)DesktopPointer); Draw(g); ReleaseDC(NULL, DesktopPointer); >>
Рисование по-прежнему зависит от положения окна приложения, но можно было вместо this->ClientSize попытаться использовать размеры экрана.
18.10.2016, 14:14 [16173 просмотра]
Рисование фигур и контуров
Область применения:
Visual Studio Visual Studio для Mac
Visual Studio Code ![]()
В конструкторе XAML фигура — это именно тот объект, который соответствует вашим представлениям. Например, прямоугольник, круг или эллипс. Объект контур является более универсальной версией фигуры. Можно, например, изменить эти объекты или объединить их в форме новых фигур.
Для фигур и контуров используется векторная графика, поэтому их легко масштабировать для дисплеев с высоким разрешением.
Рисование фигуры
Фигуры можно найти в окне Ресурсы.

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

Рисование контура
Контур — это последовательность соединенных линий и кривых. Используйте контур для создания интересных фигур, которые недоступны в окне Ресурсы.
Контур можно нарисовать с помощью линии, пера или карандаша. Эти инструменты доступны на панели Средства.
Рисование прямой линии
Используйте средства Перо или Линия.
Использование средства «Перо»
Щелкните один раз в области рисования, чтобы определить начальную точку, а затем щелкните еще раз для задания конечной точки линии.
Использование средства «Линия»
В области рисования зажмите кнопку мыши в том месте, где должна начинаться линия, затем перетащите и отпустите кнопку мыши там, где линия завершается.
Рисование кривой
Используйте средство Перо.
В области рисования щелкните один раз, чтобы определить начальную точку линии, а затем зажмите и перетащите указатель мыши, чтобы задать нужную кривизну.
Если требуется замкнуть контур, щелкните начальную точку линии.
Изменение формы кривой
Используйте средство Непосредственное выделение.
Щелкните фигуру, а затем потяните за любую точку на фигуре, чтобы изменить форму кривой.
Рисование контура произвольной формы
Используйте средство Карандаш.
Нарисуйте произвольный контур в области рисования, как если бы вы пользовались настоящим карандашом.
Удаление части контура
Используйте средство Непосредственное выделение.
Выберите контур, содержащий сегмент, который требуется удалить, и нажмите кнопку Удалить .
Удаление точки контура
Используйте средство Выделение, чтобы выбрать контур. Затем с помощью средства Перо выделите точку, которую требуется удалить.
Добавление точки контура
Используйте средство Выделение, чтобы выбрать контур. С помощью средства Перо щелкните в любом месте контура, где необходимо добавить точку.
Преобразование фигуры в контур
Чтобы изменить фигуру теми же способами, которые вы использовали для изменения контура, преобразуйте фигуру в контур. Выберите фигуру, а затем щелкните Формат>Контур>Преобразовать в контур.
Функция Преобразовать в путь сейчас недоступна для приложений UWP с TargetPlatformVersion версии 10.0.16299.0 и выше.
Объединение контуров
Контуры и фигуры можно объединить в один контур.

| Число | Действие |
|---|---|
![]() |
Две фигуры до объединения |
![]() |
США |
![]() |
Разделить |
![]() |
Intersect |
![]() |
Исключение перекрытия |
![]() |
Вычитание |
Создание составного пути
При создании составного контура все пересекающиеся части контуров исключаются из результата, и результирующий контур принимает визуальные свойства нижнего контура.
В любой момент после создания составного пути он может быть разбит на составляющие части.

Создание контура кадрирования
Контур обрезки — это контур или фигура, применяемая к другому объекту, чтобы скрыть части маскируемого объекта за пределами контура обрезки.
Как рисовать в visual studio
Процесс по шагам (на примере класса диалогового окна CmyDlg).
1.
void CmyDlg::OnPaint() < //Рисуем черный кружок с закрашенной внутри областью белым // цветом (параметры пера и кисти по умолчанию). RECT ellipse; CPaintDC dc(this); ellipse.top = 1; ellipse.left = 3; ellipse.bottom = 1+5; ellipse.right = 3+5; dc.Ellipse(&ellipse); //Рисуем квадратик с красным бордюром (сменим перо) // и зеленой закрашенной областью (сменим кисть). CPen aPen; aPen.CreatePen(PS_SOLID, 2, RGB(255, 0, 0)); CPen *pOldPen = dc.SelectObject(&aPen); CBrush aBrush; aBrush.CreateSolidBrush(RGB(0, 255, 0)); CBrush *pOldBrush = dc.SelectObject(&aBrush); dc.Rectangle(50,100,60,110); //Восстанавливаем старые перо и кисть. dc.SelectObject(pOldPen); dc.SelectObject(pOldBrush); . >
2. Чтобы принудительно перерисовать окно, нужно вызвать Invalidate().
Внимание! Вышеуказанное рисование работает только в методе OnPaint, к которому привязано сообщение WM_PAINT.
Практическое руководство. Создание объектов Graphics для рисования
Перед тем, как начать заниматься рисованием линий и фигур, отрисовкой текста или отображением изображений и управления ими с помощью GDI+, необходимо создать объект Graphics. Объект Graphics представляет собой поверхность рисования GDI+ и используется для создания графических изображений.
Существует два этапа работы с графикой:
- Создание объекта Graphics.
- Использование объекта Graphics для рисования линий и фигур, отрисовки текста или отображения изображений и управления ими.
Создание графического объекта
Графический объект можно создать несколькими способами.
Как создать графический объект
- Получите ссылку на графический объект как часть PaintEventArgs события формы или элемента управления Paint. Обычно ссылка на графический объект таким образом берется при создании кода рисования для элемента управления. Аналогичным образом можно также получить графический объект в качестве свойства PrintPageEventArgs при обработке события PrintPage для объекта PrintDocument. или
- Вызовите метод элемента управления или формы CreateGraphics, чтобы получить ссылку на объект Graphics, представляющий собой область рисования этого элемента управления или формы. Используйте этот метод, если необходимо нарисовать на форме или элементе управления, которые уже существуют. или
- Создайте объект Graphics из любого объекта, наследуемого от Image. Этот вариант подходит если вы хотите изменить уже существующее изображение. Необходимые действия будут более подробно описаны в следующих разделах.
PaintEventArgs в обработчике событий Paint
При программировании PaintEventHandler для элементов управления или PrintPage для объекта PrintDocument, графический объект предоставляется в качестве одного из свойств PaintEventArgs или PrintPageEventArgs.
Получение ссылки на графический объект из PaintEventArgs в событии Paint
- Объявите объект Graphics.
- Назначьте переменную для ссылки на объект Graphics, переданный как часть PaintEventArgs.
- Введите код, чтобы нарисовать форму или элемент управления. В следующем примере показано, как ссылаться на объект Graphics из PaintEventArgs в событии Paint :
Private Sub Form1_Paint(sender As Object, pe As PaintEventArgs) Handles _ MyBase.Paint ' Declares the Graphics object and sets it to the Graphics object ' supplied in the PaintEventArgs. Dim g As Graphics = pe.Graphics ' Insert code to paint the form here. End Sub
private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs pe) < // Declares the Graphics object and sets it to the Graphics object // supplied in the PaintEventArgs. Graphics g = pe.Graphics; // Insert code to paint the form here. >
private: void Form1_Paint(System::Object ^ sender, System::Windows::Forms::PaintEventArgs ^ pe) < // Declares the Graphics object and sets it to the Graphics object // supplied in the PaintEventArgs. Graphics ^ g = pe->Graphics; // Insert code to paint the form here. >
Метод CreateGraphics
Также можно воспользоваться методом элемента управления или формы CreateGraphics, чтобы получить ссылку на объект Graphics, представляющий собой область рисования этого элемента управления или формы.
Создание графического объекта с помощью метода CreateGraphics
- Вызовите метод CreateGraphics для формы или элемента управления, на которых требуется отрисовка графики.
Dim g as Graphics ' Sets g to a Graphics object representing the drawing surface of the ' control or form g is a member of. g = Me.CreateGraphics
Graphics g; // Sets g to a graphics object representing the drawing surface of the // control or form g is a member of. g = this.CreateGraphics();
Graphics ^ g; // Sets g to a graphics object representing the drawing surface of the // control or form g is a member of. g = this->CreateGraphics();
Создание из объекта изображения
Кроме того, можно создать графический объект из любого объекта, производного от класса Image.
Как создать графический объект на основе изображения
- Вызовите метод Graphics.FromImage, указав имя переменной изображения, из которой требуется создать объект Graphics. В приведенном ниже примере показано использование объекта Bitmap:
Dim myBitmap as New Bitmap("C:\Documents and Settings\Joe\Pics\myPic.bmp") Dim g as Graphics = Graphics.FromImage(myBitmap)
Bitmap myBitmap = new Bitmap(@"C:\Documents and Settings\Joe\Pics\myPic.bmp"); Graphics g = Graphics.FromImage(myBitmap);
Bitmap ^ myBitmap = gcnew Bitmap("D:\\Documents and Settings\\Joe\\Pics\\myPic.bmp"); Graphics ^ g = Graphics::FromImage(myBitmap);
Объекты Graphics можно создавать только из неиндексированных файлов формата .bmp, например 16-разрядных, 24-разрядных и 32-разрядных. Каждый пиксель неиндексированных файлов .bmp содержит цвет. В индексированных .bmp файлах же каждый пиксель содержит индекс таблицы цветов.
Рисование и обработка фигур и изображений
Объект Graphics после создания может использоваться для рисования линий и фигур, отрисовки текста или отображения изображений и управления ими. Вот основные объекты, которые используются с объектом Graphics:
- Класс Pen — используется для рисования линий, структурирования фигур или отрисовки других геометрических представлений.
- Класс Brush — используется для заполнения областей графики, в частности для заполненных фигур, изображений или текста.
- Класс Font — предоставляет собой описание фигур, используемых при отрисовке текста.
- Структура Color — представляет различные отображаемые цвета.
Использование созданного графического объекта
- Обратитесь к соответствующему объекту, указанному выше, чтобы нарисовать необходимые объекты. Дополнительные сведения см. в следующих разделах:
| Отрисовка | Смотрите |
|---|---|
| Позиции | Практическое руководство. Рисование линии в Windows Forms |
| Фигуры | Практическое руководство. Рисование контурной фигуры |
| Текст | Практическое руководство. Рисование текста в Windows Forms |
| изображения; | Практическое руководство. Прорисовка изображений с использованием GDI+ |
См. также
- Приступая к программированию графики
- Объекты Graphics и Drawing в Windows Forms
- Линии, кривые и фигуры
- Практическое руководство. Прорисовка изображений с использованием GDI+
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.





