190 likes | 309 Views
Počítače a programování 2. Přednáška 6 17.3.2014 Jiří Šebesta. TÉMA – grafika ve Visual C++. GDI, OpenGL, DirectX Událost Paint GDI - příklady. GDI, DirectX, OpenGL (1/2). GDI (Graphics Device Interface): 2D grafický ovladač
E N D
Počítače a programování 2 Přednáška 6 17.3.2014 Jiří Šebesta
TÉMA – grafika ve Visual C++ GDI, OpenGL, DirectX Událost Paint GDI - příklady
GDI, DirectX, OpenGL (1/2) • GDI (Graphics Device Interface): • 2D grafický ovladač • standardní součást Widowssloužící k reprezentaci grafických objektů a jejich transformací do výstupních zařízení (obrazovka, tiskárna) • zajišťuje kreslení čar, křivek a dalších grafických objektů, renderování fontů, správu barevných palet atd. • nezajišťuje přímo vykreslování vlastních Windows objektů (okna, dialogy, menu, atd.), GDI je k těmto úkolům využívána uživatelským subsystémem (v knihovně user32.dll) • všechny dále uvedené příklady jsou řešené pomocí GDI
DirectX (Graphics Device Interface): • - sada knihoven od Microsoftu pro funkce aplikačních rozhraní API pro Windows, mezi které jsou zařazeny i knihovny pro grafické výstupy DirectDraw (vykreslování 2D grafiky do okna, není jednoduché jako u GDI, avšak rychlejší) a Direct3D (výkonný 3D engine) GDI, DirectX, OpenGL (2/2) • OpenGL (Open Graphics Library): • - otevřenýAPI standard pro tvorbu aplikací počítačové grafiky ve3D, zdarma použivatelný. Hlavní výhodou je velký počet tutoriálů a návodůpro grafické výstupy.
Většina ovládacích prvků (objektů) včetně vlastního formuláře nabízí aplikaci události Paint, která umožňuje grafický výstup v rámci plochy daného objektu. GDI - událost Paint (1/3) vložení události Paint do formuláře aplikace hlavička události Paint aktivace grafického objektu se jménem e private: System::Void Form1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) { Graphics ^ g = e->Graphics; }
Modrá a červená čára ve formulářovém okně nový objekt pera se jménem MyPen GDI - událost Paint (2/3) private: System::Void Form1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) { Graphics ^ g = e->Graphics; Pen^ MyPen = gcnew Pen(Color::Blue,3.0f); Point point_A = Point(100,100); Point point_B = Point(300,300); e->Graphics->DrawLine(MyPen, point_A, point_B); e->Graphics->DrawLine(gcnew Pen(Color::Red,3.0f), 100, 300, 300, 100); } barva tloušťka bod se jménem point_A souřadnice x souřadnice y vykreslení čáry z point_A do point_B perem MyPen alternativní vykreslení čáry s přímou definicí pero XA YA XB YB
Událost Paint se volá při vykreslování okna GDI - událost Paint (3/3) A=[100, 100] B=[300, 300] Projekt: Ex108
Kreslení do objektu PictureBox ve smyčce GDI - příklady (1/11) • Událost Paint v PictureBoxu se jménem PictureBox
private: System::Void PictureBox_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) { Graphics ^g = e->Graphics; Pen^ BluePen = gcnew Pen(Color::Blue,2.0f); Pen^ RedPen = gcnew Pen(Color::Red,2.0f); Pen^ MyPen; Point point_A = Point(200,200); Point point_B; intangle=0;// starting angle for radial lines intanstep=5;// step of angle intanstop=360;// ending angle for rad. lines intwidth=200;// initial width of rectangle intwstep=10;// step of rectangle width intwstop=400;// ending width of rectangle MyPen=RedPen;// initial pen is red GDI - příklady (2/11)
while (angle<=anstop)//radial lines { point_B =Point((int)(200+100*cos(angle*PI/180.0)),(int)(200+100*sin(angle*PI/180.0))); e->Graphics->DrawLine(BluePen, point_A, point_B); angle+=anstep; } while (width<=wstop)//rectangles { e->Graphics->DrawRectangle(MyPen, 200-width/2, 200-width/2, width, width); width+=wstep; if (MyPen==RedPen)//color change MyPen=BluePen; else MyPen=RedPen; }} GDI - příklady (3/11) Projekt: Ex109
Volání obnovení (překreslení) Refresh() + dialog ColorDialog GDI - příklady (4/11) • Při změně hodnoty v NUD se změní globální proměnná a udávající úhel koláče ve stup-ních a volá se refresh (překre-slení) PictureBoxu, ve kte-rém je koláč vykreslován. • Při stisku tlačítka Btn_Color je vyvolán ColorDialog, na-stavená barva se vloží do pro-měnné MyBrush, která definuje barvu koláče a následně se zavolá refresh (překreslení) koláče.
#pragma once intangle=20;// global variable – angle of pie namespace Ex110{ public ref class Form1 : public System::Windows::Forms::Form { ……… private: System::Windows::Forms::Button^ Btn_Color; private: SolidBrush^ MyBrush;// private variable of Form1 – MyBrush ……… #pragma endregion private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {//MyBrush inicialization during Form1 loading - blue MyBrush = gcnew SolidBrush(Color::Blue); } GDI - příklady (5/11)
private: System::Void PB_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) { Graphics ^ g = e->Graphics; e->Graphics->Clear(System::Drawing::Color::White); e->Graphics->FillPie(MyBrush,100,100,200,200,0,-a); } private: System::Void NUD_ValueChanged(System::Object^ sender, System::EventArgs^ e) { a = System::Convert::ToInt32(this->NUD->Value); this->PB->Refresh(); } GDI - příklady (6/11) vykreslení koláče mazání grafiky v objektu, plátno bílé poč. úhel úhlová délka koláče překre-slení koláče obdélník koláče
private: System::Void Btn_Color_Click(System::Object^ sender, System::EventArgs^ e) { this->CDialog->ShowDialog(); MyBrush->Color = this->CDialog->Color; this->PB->Refresh(); } GDI - příklady (7/11) otevření dialogu barvy přiřazení barvy štětci pro kreslení koláče překreslení koláče Projekt: Ex110
Výběr kreslených objektů: Drawxxx() GDI - příklady (8/11) • Příklad: DrawArc() e->Graphics->DrawArc(MyPen,180,10,100,100,-135,180);
Text jako grafický objekt: DrawString() GDI - příklady (9/11) System::Drawing::Font^ MyTextFont = gcnewSystem::Drawing::Font("Arial",16); SolidBrush^ MyTextBrush = gcnew SolidBrush(Color::Black); String^ DrawRect_string = "DrawRectangle"; e->Graphics->DrawString(DrawRect_string, MyTextFont, MyTextBrush, 10, 130); e->Graphics->DrawString("DrawArc", MyTextFont, MyTextBrush, 190, 130); nový font string přes proměnnou string přímo jako parametr nový štětec pro text počáteční poloha textu
Pole bodů pro DrawPolygon(), DrawCurve()atd. GDI - příklady (10/11) array<Point>^ PolyPoints = {Point(670,10), Point(690,50), Point(750,50), Point(670,100), Point(590,50), Point(640,50)}; e->Graphics->DrawPolygon(MyPen, PolyPoints);
Výběr kreslených objektů: Fillxxx() GDI - příklady (11/11) • Příklad: FillPolygon() e->Graphics->FillPolygon(MyBrush, PolyPoints); Projekt: Ex111
TÉMA NÁSLEDUJÍCÍ PŘEDNÁŠKY Úvod do Matlabu DĚKUJI ZA POZORNOST