Se știe că mulți programatori sunt intimidați de complexitatea utilizării graficii în Windows. Conceptele descriptorilor, contextelor, șabloanelor etc. lucrurile sperie multe. Dar, de fapt, înțelegând conceptul și principiile subsistemului grafic (GUI), veți vedea că acesta este un lucru simplu.
Cum și unde atrage Windows
Windows are conceptul de tag-uri fereastra (mâner), descriptorii device context și descriptori de obiect, respectiv termeni în engleză fereastra mâner (hWnd), mâner device context (HDC) și mâner obiect (un nume comun). Sub hWND sunt înțelese elemente precum forma, butoanele, panourile etc. cu acest descriptor elemente de transmis mesaje și date, dar folosind HDC produs operații grafice cu conținutul obiectului.
Dispozitiv de context - structura, care definește un set de obiecte grafice, proprietățile și metodele de influență asupra unui obiect lor. obiecte grafice includ un stilou (pen) pentru linie, perie (perii) pentru a umple, bit plan (bitmap) pentru a copia sau a derula părți ale ecranului, o paletă (paleta) pentru a determina setul de culori disponibile, regiune (regiune) pentru a trunchia câmpurile și alte activități.
Obiectul mâner - este, în general, un lucru independent, acesta poate exista separat de hWnd și HDC (aceeași muncă în perechi). Prin descriptorii obiectului (denumit în continuare hOBJ) penele sunt sistem de desen (Pen - culoare stilou, grosimea și tipul de linie), perie, umplere zona (Perie - culoare perie, stilul și tipul de modelul de umplere), etc.
Pentru a efectua operațiuni, trebuie să solicitați întotdeauna un descriptor. Solicitând hDC, trebuie să-l returnați în sistem, altfel după expirarea timpului, Windows va opri întreaga operațiune de desenare și va fi suspendat.
Să explicăm exemplul conceptului de descriptori. O foaie de hârtie este numită element de fereastră, adică ea are hWND să atragă ceva pe ea, să-l hDC. Aveți trei creioane de diferite culori (roșu, negru, verde). Luând un creion în mână, obiectul este selectat în contextul unei coli de hârtie. Apoi, folosind metodele de deplasare a creionului, trageți pe suprafață. Asta e totul.
Principiul general al muncii (simplificat) poate fi redus la următoarele:- Obțineți prin hWND, mânerul contextului dispozitivului hDC.
- Selectați obiectul dorit în contextul hDC și salvați starea anterioară.
- Efectuați operația.
- Reveniți conținutul vechi al contextului.
- Întoarceți hDC la sistem.
ATENȚIE! Când ați creat obiectul și l-ați selectat în context, salvați obiectul anterior. Apoi, după toate operațiile, reveniți la context și ștergeți obiectul creat. Aceasta este o operație foarte importantă.
Începem proiectarea și programarea
Nu ne vom grăbi să începem să desenăm, ci să ne gândim. Cea mai mare parte a timpului necesită o operație de afișare și, ca o consecință, o clipită. Prin urmare, trebuie să evităm aceste limitări.
Cele mai multe programe comerciale (de exemplu, cu excepția ErWin) utilizează principiul unei ferestre virtuale, adică ferestre în RAM cu dimensiunea și caracteristicile zonei de ieșire de pe ecran. Toate operațiunile de desen sunt efectuate cu ei, iar apoi este afișat în zona din dreapta a ecranului (deși nu neapărat pe ecran, dar, de asemenea, la imprimantă), operația de copiere a avionului de biți. Eficiența este evidentă.
Și acum să trecem de la teorii la practică. Citiți descrierea funcțiilor și structurilor graficului API pentru a înțelege în continuare funcționarea programului.
Structuri și constante
Stochează coordonatele dreptunghiului.
Tip public RECT
Stânga atât de lungă
Începutul este atât de lung
Atât de mult
Bottom As Long
Tip final
Stochează coordonatele unui punct.
Tip public POINTAPI
X Atâta timp
Cât de lungă
Tip final
Stochează parametrii stiloului injector (pen-ului).
Tip public LOGPEN
În stil stil lung
lopnWidth Ca POINTAPI - grosimea creionului (aceasta este structura)
Lungimea culorii în stilul pixel
Tip final
Stochează parametrii periei.
Tip public LOGBRUSH
lbStyle As Long - stil de perie
Culoare lbColor ca perie lungă
Modelul de umplere lungă
Tip final
Constantele nu sunt toate listate, pentru o listă completă, consultați SDK-ul grafice MSDN.
Pentru o declarație completă a descrierii funcției, consultați textul sursă. În cazul în care lipsește descrierea tipului, este tipul Long.
GetDC (hwnd) --- Obține descriptorul de context al dispozitivului pentru hWnd specificat.
CreateCompatibleBitmap (HDC, nWidth, nHeight) --- Creează context, bitmap HDC compatibil cu dimensiunile (nWidth, nHeight).
CreateCompatibleDC (HDC) --- Creează un descriptor de context compatibil din HDC specificat.
ReleaseDC (hwnd, HDC) --- Elimină mânerul contextului HDC pentru descriptorul de fereastră hWnd.
SelectObject (HDC, hObject) --- Selectează obiectul specificat în descriptorul hObject în contextul HDC.
PatBlt (HDC, x, y, nWidth, nHeight, dwRop) --- Umple context HDC a coordonatelor (x, y, nWidth, hHeight) folosind peria context curent conform funcționării dwRop.
DeleteObject (hObject) --- Înlăturarea descriptorului hObject.
DeleteDC (HDC) --- Sterge contextul HDC.
Bitblt (hDestDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, dwRop) --- câmp de biți Exemplarele contextului hSrcDC, pornind de la coordonatele (xSrc, ySrc), în conformitate cu operația de scanare în dwRop context câmp de biți hDestDC în coordonatele (x, y, nWidth, nHeight).
InvalidateRect (hwnd, pRect Ca Rect, bErase) --- ridică o suprafață fereastră actualizări eveniment să se ocupe de fereastră hWnd în regiunea dreptunghiulară definită prin coordonate pRect. Dacă bErase este adevărat, fundalul este șters.
Dreptunghi (HDC, X1, Y1, X2, Y2) --- Deseneaza un dreptunghi în contextul coordonatelor HDC (X1, Y1, X2, Y2).
Elipsă (HDC, X1, Y1, X2, Y2) --- HDC atrage un cerc în contextul coordonatelor (X1, Y1, X2, Y2).
Descrierea procedurilor programului
În forma Visual Basic, setați proprietatea AutoRedraw la True, altfel fereastra virtuală va clipi. Setați proprietatea ScaleMode la Pixeli, deoarece toate funcțiile funcționează cu pixeli, iar pentru alte unități este necesară efectuarea conversiei.
Mai întâi, vom crea o fereastră virtuală utilizând procedura CreateVirtualWindow. Iată textul ei.
'Această variabilă stochează un handle temporar al ferestrei temporare
Dim CDC la fel de lung
"Avem descriptorul de context al pânzei
CDC = GetDC (Me.hwnd)
'Creați un descriptor compatibil
MDC = CreateCompatibleDC (CDC)
'Creați o bitmap compatibilă cu o hartă de biți de canvas
MBM = CreateCompatibleBitmap (CDC, RectForm.Right, RectForm.Bottom)
'Ștergeți mânerul
ReleaseDC Me.hwnd, CDC
"Alegeți un bitmap într-un context temporar
SelectObject MDC, MBM
"Umpleți zona cu culoarea albă (pentru simplitate)
PatBlt MDC, 0, 0, RectForm.Right, RectForm.Bottom, WHITE
Explicație. Folosind funcția GetDC, obținem mânerul la forma obiectului prin hWnd Me. Apoi, trebuie să creați un context de dispozitiv compatibil pentru fereastra noastră virtuală, deoarece ar trebui să fie două obiecte diferite, dar cu caracteristici identice. Toate acestea se face funcțiile CreateCompatibleDC obținute HDC se păstrează într-o variabilă de tip globală MDC pe termen lung. Deoarece fereastra virtuală, în esență, un bitmap, puteți utiliza funcția CreateCompatibleBitmap creează un bitmap a ferestrei noastre la dimensiunea specificată de noi în avans (a se vedea codul sursă în procedura Form_Load) și descriptorul rezultat este stocat în variabila globală de tip MBM pe termen lung. Apoi, notă, ștergeți CDC mâner temporar prin funcția ReleaseDC este o operație importantă. În cele din urmă am ales în contextul nostru bitmap rezultat utilizând funcția SelectObject. Curățăm zona folosind funcția PatBlt.
Distrugerea ferestrei virtuale se face prin procedura DestroyVirtualWindow.
Sub DestroyVirtualWindow ()
'Ștergeți bitmap-ul
DeleteObject MBM
'Ștergeți mânerul
Șterge MDDC
End Sub
Explicație. După terminarea aplicației, fereastra virtuală trebuie distrusă pentru a elibera resurse. Mai întâi ștergeți bitmapul cu funcția DeleteObject, apoi ștergeți contextul cu ajutorul funcției DeleteDC.
Afișarea unei ferestre virtuale pe ecran, utilizând procedura InvalidateCanvas.
Explicație. Pentru a afișa fereastra noastră pe ecran, apelați funcția InvalidateRect care trimite un mesaj la forma pe care ar trebui să fie redesenate (aici se află o subtilitate asociat cu formele de evenimente cu vopsea și proprietatea AutoRedraw, sugerăm să se ocupe de acest lucru, atunci intelegi cu siguranta desenul de subtilitate). Apoi, din nou, goliți fereastra cu culoarea albă. Afișăm formele din fereastră prin propria noastră procedură DrawFigures. Și cel mai important, vom obține o fereastră virtuală în forma copiei bitblt biți funcție.
Afișarea unei forme într-o fereastră virtuală, utilizând procedura DrawFigures.
Sub DrawFigures (HDC la fel de lung, IndexFigure As Byte)
Descriptorii de manevră
Dim NewPen, OldPen As Long
"Descriptorii mâinilor
Dim NewBrush, OldBrush As Long
"Creați un stilou din structura formei date
NewPen = CreatePenIndirect (Cifre (IndexFigure) .Pen)
"Creați o pensulă din structura formei date
NewBrush = CreateBrushIndirect (Cifre (IndexFigure) .Frunza)
'Selectați descriptorii creați ai stiloului și periei în context
OldPen = SelectObject (HDC, NewPen)
OldBrush = SelectObject (HDC, NewBrush)
Selectați cifrele Case (IndexFigure) .Formă
Cauza SHAPE_RECT:
Apel ShapeRect (HDC, Cifre (IndexFigure) .Coord)
Caz SHAPE_ELLIPSE:
Apelați ShapeEllipse (HDC, Cifre (IndexFigure) .Coord)
Sfârșit Selectați
"Alegeți contextul periei și stiloului vechi
"Aceasta este o operație foarte importantă
SelectObject HDC, OldBrush
SelectObject HDC, OldPen
"Îndepărtați o perie și un stilou nou
"Și aceasta este o operație foarte importantă
DeleteObject (NewBrush)
DeleteObject (NewPen)
End Sub
Explicație. În această procedură, se trece un mâner de context și un index al tipului figura care urmează să fie desenată. Apoi, folosind funcțiile CreatePenIndirect și CreateBrushIndirect, creăm un nou stilou și o perie din structuri. Salvați descriptorii obiectelor primite în variabilele locale (după terminarea procedurii nu vom avea nevoie de ele) NewPen și NewBrush de tip Long. Alegeți un nou stilou și pensulă în contextul menținerii valorilor anterioare, în care variabilele și OldPen OldBrush, funcția SelectObject. Desenați formele. Reveniți la valorile anterioare. Ștergem descriptorii obiectelor noi. Tot ceea ce veți înțelege din codul sursă atașat la articol.