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