Upload
kameko-mckenzie
View
60
Download
8
Embed Size (px)
DESCRIPTION
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č - PowerPoint PPT Presentation
Citation preview
OSNOVA:
a) Úvod - GDI, OpenGL, DirectXb) Událost Paint() c) GDI - příklady
Jiří ŠebestaJiří ŠebestaÚstav radioelektroniky, FEKT VUT v BrněÚstav radioelektroniky, FEKT VUT v Brně
Počítače a programování 2 pro obor ESTBPC2E
PŘEDNÁŠKA 6
Úvod – GDI, DirectX, OpenGL Úvod – GDI, DirectX, OpenGL (1/2)(1/2)• GDI (Graphics Device Interface):
– 2D grafický ovladač– standardní součást Widows slouží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
Úvod – GDI, DirectX, OpenGL Úvod – GDI, DirectX, OpenGL (2/2)(2/2)
• 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).
• OpenGL (Open Graphics Library):
- otevřený API standard pro tvorbu aplikací počítačové grafiky ve 3D, zdarma použivatelný. Hlavní výhodou je velký počet tutoriálů a návodů pro grafické výstupy.
GDI - uGDI - uddálostálost Paint()Paint() (1/3) (1/3)
private: System::Void Form1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
Graphics ^ g = e->Graphics;}
vložení události Paint() do
formuláře aplikace
aktivace grafického objektu se jménem
e
hlavička události Paint()
• 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 - uGDI - uddálost álost Paint()Paint() (2/3) (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);
}
nový objekt pera se jménem
MyPen
• Modrá a červená čára ve formulářovém okně
barva
tloušťkabod se jménem
point_A
souřadnice x
souřadnice y
vykreslení čáry z point_A do point_B
perem MyPenalternativní
vykreslení čáry s přímou definicí
pero XA YA XB YB
GDI - uGDI - uddálost álost Paint()Paint() (3/3) (3/3)
• Událost Paint() se volá při vykreslování okna
A=[100, 100] B=[300, 300]
Projekt: BPC2E_Ex115
GDI - příklady (1/11)GDI - příklady (1/11)
Příklad: Vykreslete do objektu PictureBox v cyklech následující obrazec:
• Vykreslení obdélníků a čar v metodě pro událost Paint() v objektu typu PictureBox se jménem PictureBox
GDI - příklady (2/11)GDI - příklady (2/11)
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; int angle=0; // starting angle for radial lines int anstep=5;// step of angle int anstop=360; // ending angle for rad. lines int width=200; // initial width of rectangle int wstep=10; // step of rectangle width int wstop=400; // ending width of rectangle
MyPen=RedPen; // initial pen is red
GDI - příklady (3/11)GDI - příklady (3/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;}}
Projekt: BPC2E_Ex116
GDI - příklady (4/11)GDI - příklady (4/11)
Příklad: Sestavte formulářovou aplikaci, která bude zobrazovat plný „koláč“ podle nastavené úhlové hodnoty ve stupních s výběrem barvy
Volání obnovení:
Refresh()
+ ColorDialog
• 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, nastave-ná barva se vloží do proměnné MyBrush, která definuje barvu koláče a následně se zavolá refresh (překreslení) koláče.
GDI - příklady (5/11)GDI - příklady (5/11)
#pragma onceint angle=20; // global variable – angle of pienamespace 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 endregionprivate: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { //MyBrush inicialization during Form1 loading - blue
MyBrush = gcnew SolidBrush(Color::Blue);}
GDI - příklady (6/11)GDI - příklady (6/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();}
mazání grafiky v objektu, plátno
bílé
vykresleníkoláčepřekre-
slení koláče
obdélníkkoláče
poč. úhel
úhlovádélka koláče
GDI - příklady (7/11)GDI - příklady (7/11)
private: System::Void Btn_Color_Click(System::Object^ sender, System::EventArgs^ e) { this->CDialog->ShowDialog(); MyBrush->Color = this->CDialog->Color; this->PB->Refresh();}
otevření dialogu barvy
přiřazení barvy štětci pro
kreslení koláče
překreslení
koláče
Projekt: BPC2E_Ex117
GDI - příklady (8/11)GDI - příklady (8/11)
e->Graphics->DrawArc(MyPen,180,10,100,100,-135,180);
• Výběr kreslených objektů: Drawxxx()
• Příklad: DrawArc()
GDI - příklady (9/11)GDI - příklady (9/11)
System::Drawing::Font^ MyTextFont = gcnew System::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);
• Text jako grafický objekt: DrawString()
nový font nový štětec pro
text
string přes proměnnoupočáteční
poloha textu
string přímo jako
parametr
GDI - příklady (10/11)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)};
• Pole bodů pro DrawPolygon(), DrawCurve()atd.
e->Graphics->DrawPolygon(MyPen, PolyPoints);
GDI - příklady (11/11)GDI - příklady (11/11)
e->Graphics->FillPolygon(MyBrush, PolyPoints);
• Výběr kreslených objektů: Fillxxx()
• Příklad: FillPolygon()
Projekt: BPC2E_Ex117
Téma následující přednášky
– Úvod do Matlabu
DĚKUJI ZA POZORNOST