Как рисовать в visual studio
Перейти к содержимому

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

  • автор:

Как рисовать в 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 [16009 просмотров]

Рисование в консоли Visual Studio c++

Учился писать код в паскале. По ходу учебы перешел на с++ и Visual Studio. В борланд паскале был удобный канвас в котором можно было рисовать фигуры/графики функций etc. есть ли в visual studio аналог?

Отслеживать
задан 29 ноя 2017 в 11:31
Андрей Лобанович Андрей Лобанович
129 1 1 золотой знак 1 1 серебряный знак 7 7 бронзовых знаков
Псевдографикой?
29 ноя 2017 в 11:33
неа, нужно качать дополнительные библиотеки из вне
29 ноя 2017 в 11:38
@user272591, что за библиотеки?
29 ноя 2017 в 11:49
@VladimirGamalyan да, почему нет.
29 ноя 2017 в 11:50

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

В Windows на окне можно рисовать средствами GDI, консольное окно не исключение. Естественно такое решение будет непереносимым. Пример:

#include #include #include int main() < HWND hwnd = GetConsoleWindow(); HDC hdc = GetDC(hwnd); int x = 0; for (float i = 0; i < 3.14 * 10; i += 0.05) < SetPixel(hdc, x, 50 + 25 * cos(i), RGB(255, 255, 255)); x += 1; >ReleaseDC(hwnd, hdc); std::cin.ignore(); return 0; > 

введите сюда описание изображения

Кроме установки пикселя в наличии большое кол-во функций для рисования различных примитивов, с применением разных кистей (толщины, узора и т.п.).

Внимание! Работает сносно только в старых версиях Windows (Windows XP). Не использовать для современных систем, начиная с Vista.

Как рисовать в 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.

Как рисовать в visual studio c++ 2010?

Здравствуйте. Подскажите, пожалуйста, как нарисовать линию на PictureBox в visual studio? Делал вот так, ошибок нет, но ни чего не происходит.

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) < pictureBox1->Refresh(); > private: System::Void pictureBox1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) < // Create pen. Pen^ blackPen = gcnew Pen( Color::Black,3.0f ); // Create location and size of ellipse. int x = 0; int y = 0; int width = 100; int height = 100; // Draw ellipse to screen. e->Graphics->DrawEllipse( blackPen, x, y, width, height ); >
  • Вопрос задан более трёх лет назад
  • 3455 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *