Grafikus ablakok és api

Ismeretes, hogy sok programozó megijedt a Windows grafikus használatának bonyolultságától. A leírók, kontextusok, sablonok stb. a dolgok megijesztik sokat. De valójában a grafikus alrendszer (GUI) koncepciójának és elveinek megértése, látni fogja, hogy ez egyszerű dolog.







Hogyan és hol húzza a Windowsot

A Windows az a koncepció tag (Handle) ablakban az eszköz keretében jellemzők és objektum leírásokat, illetve angol kifejezések kezelni ablak (hwnd), fogantyú eszköz keretében (hdc) és kezeli tárgy (közös név). A hWND alatt olyan elemeket értünk, mint az űrlap, a gombok, a panelek stb. Ezzel a leíróval az elemek üzenetet és adatokat küldenek, de az hDC segítségével a grafikai műveletek az objektum tartalmával kerülnek végrehajtásra.

Context eszköz - szerkezet, amely meghatározza egy sor grafikus objektumok, azok tulajdonságait és eljárások hatását egy tárgy. Grafikus objektumok közé tartozik a toll (pen) a vonal, ecset (kefe), hogy töltse, kicsit sík (bitmap) másolni vagy lapozáshoz részei a képernyőn, a paletta (paletta) határozza meg a készlet rendelkezésre álló színek, a térség (régió) levágni a mezőket és egyéb tevékenységek.

Az objektumleíró általában egy független dolog, a hWND-től és az hDC-től függetlenül létezhet (ugyanaz a munka párban). A leírások a tárgy (a továbbiakban: hOBJ) tollakat rajz rendszer (Pen - toll színét, vastagságát és vonaltípus), ecset, töltő terület (ecset - kefe szín, stílus és típusát, a kitöltési minta) stb

A műveletek végrehajtásához mindig kérjen leírást. Az hDC kérésével vissza kell adnia a rendszerhez, különben az idő leteltével a Windows leállítja a teljes rajzműveletet és csak lefagy.

Mutassuk meg a leírók fogalmát. Egy papírlapot ablakelemnek neveznek, azaz. azt hWND rajzolni valamit rajta, kap ez hDC. Három különböző színű ceruza van (piros, fekete, zöld). A ceruza kézben tartásával az objektumot egy papírlapra választják ki. Ezután a ceruza mozgatásának módjaival felhúzza a felületet. Ez alapvetően minden.

A munka általános elve (egyszerűsített) az alábbiakra korlátozható:

  • Lépjen be a hWND-ről, a hDC eszköz kontextusának fogantyújáról.
  • Válassza ki a kívánt objektumot az hDC környezetben, és mentse el az előző állapotot.
  • Végezze el a műveletet.
  • Visszaadja a kontextus régi tartalmát.
  • Húzza vissza a hDC-t a rendszerbe.

FIGYELEM! Az objektum létrehozásakor és a kontextusban történő kiválasztásakor mentse el az előző objektumot. Ezután minden művelet után térjen vissza a kontextusba és törölje a létrehozott objektumot. Ez egy nagyon fontos művelet.

Elkezdjük a tervezést és a programozást

Nem sietünk a rajz elkezdéséhez, hanem üljünk és gondolkodunk. Az idő nagy részében egy művelet jelenik meg, és ennek következtében villog. Ezért el kell kerülnünk ezeket a korlátozásokat.

A legtöbb kereskedelmi program (például az Erwin kivételével) a virtuális ablak elvét használja, azaz ablakokat a RAM-ban, a képernyő kimeneti területének méretével és jellemzőivel. Minden rajzműveletet elvégeznek vele, majd a képernyőn a kívánt helyre (bár nem feltétlenül a képernyőn, hanem a nyomtatón) is megjelenik, a bittérképek másolásával. A hatékonyság nyilvánvaló.

És most lépjünk át az elméletektől a gyakorlatig. Olvassa el a grafikai API funkcióinak és struktúráinak leírását, hogy jobban megértse a program működését.

Szerkezetek és állandók

A téglalap koordinátáit tárolja.

Nyilvános típus RECT
Balra hosszú ideig
A leghosszabb ideig
Jobbra
Alsó hosszú ideig
Vége típusa

Egy pont koordinátáit tárolja.

Nyilvános típusú POINTAPI
X Hosszú
Y Mint Long
Vége típusa

A toll paramétereit tárolja.

Nyilvános típus LOGPEN
lopnStyle Mint Long - toll stílus
lopnWidth Mint POINTAPI - a toll vastagsága (ez a szerkezet)
lopnColor Mint Long - tollszín
Vége típusa

Az ecset paramétereit tárolja.

Nyilvános típus LOGBRUSH
lbStyle Mint hosszú stílusú ecset
lbColor Hosszú kefe színű
lbHatch Mint Long - fill minta
Vége típusa

A konstansok nincsenek felsorolva, a teljes listához lásd az MSDN grafikus SDK-t.







A funkció leírás teljes körű deklarálásához olvassa el a forrásszöveget. Ha a típusleírás hiányzik, a Long típus.

GetDC (hwnd) --- Megadja az eszköz kontextusleíróját a megadott hWnd-nek.

CreateCompatibleBitmap (HDC, nWidth, nHeight) --- hoz létre kompatibilis bittérképes HDC összefüggésben méretek (nWidth, nHeight).

CreateCompatibleDC (HDC) --- Kompatibilis kontextusleírást hoz létre a megadott HDC-ből.

ReleaseDC (hwnd, HDC) --- Eltávolítja a HDC kontextus fogantyúját a hWnd ablakleíróhoz.

SelectObject (HDC, hObject) --- Kiválasztja a hObject descriptorban megadott objektumot a HDC környezetben.

PatBlt (HDC, x, y, nWidth, nHeight, dwRop) --- kitölti HDC összefüggésben a koordináták (x, y, nWidth, hHeight) az aktuális összefüggésben szerinti kefe dwRop működését.

DeleteObject (hObject) --- Eltávolítja a hObject-leírót.

DeleteDC (HDC) --- Törli a HDC kontextust.

BitBlt (hDestDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, dwRop) --- másolatok bites mező a kontextus hSrcDC kiindulva koordinátákat (xSrc, ySrc) összhangban a letapogatási műveletet dwRop bites mező keretében hDestDC koordinátákra (x, y, nWidth, nHeight).

InvalidateRect (hwnd, pRect Amint RECT, bErase) --- emel esemény frissítések ablak felületének kezelésére HWnd ablakhoz belül négyszögletes által meghatározott régió koordinátákkal pRect. Ha a bErase igaz, akkor a háttér törlődik.

Téglalap (HDC, X1, Y1, X2, Y2) --- Egy négyszöget rajzol összefüggésben a HDC koordináták (X1, Y1, X2, Y2).

Ellipszis (HDC, X1, Y1, X2, Y2) --- HDC egy kört rajzol az összefüggésben a koordináták (X1, Y1, X2, Y2).

A programmechanizmusok leírása

A Visual Basic formában állítsa az AutoRedraw tulajdonságot True értékre, ellenkező esetben a virtuális ablak villogni fog. Állítsa a ScaleMode tulajdonságot pixelre, mert minden funkció képpontokkal működik, és más egységek esetén az átalakítást végre kell hajtani.

Először is létrehozunk egy virtuális ablakot a CreateVirtualWindow eljárással. Itt van a szövege.

'Ez a változó ideiglenes ablak kontextus fogantyúját tárolja
Dim CDC Mint Hosszú
"Megkapjuk a vászon kontextusleíróját
CDC = GetDC (Me.hwnd)
'Hozzon létre egy kompatibilis leíró
MDC = CreateCompatibleDC (CDC)
'Hozzon létre egy kompatibilis bitképet egy vászonbit térkép segítségével
MBM = CreateCompatibleBitmap (CDC, RectForm.Right, RectForm.Bottom)
'Törölje le a fogantyút
ReleaseDC Me.hwnd, CDC
'Válasszon egy bittérképet átmeneti környezetbe
SelectObject MDC, MBM
'Töltse fel a területet fehér színnel (egyszerűség kedvéért)
PatBlt MDC, 0, 0, RectForm.Right, RectForm.Bottom, WHITENESS

Magyarázat. A GetDC funkció, megkapjuk a fogantyút a tárgy alakja révén HWND Me. Ezután létre kell hoznunk egy kompatibilis eszköz kontextust a virtuális ablakunkhoz, mert két különböző tárgynak kell lennie, de azonos jellemzőkkel. Mindezt CreateCompatibleDC funkciókat kapott hdc áruház egy globális változó MDC típusú Long. Mivel a virtuális ablak, amely lényegében egy bitmap, akkor CreateCompatibleBitmap függvény létrehoz egy bitmap az ablakunk a méretére utal minket előre (lásd a forráskód a Form_Load eljárás), és a kapott leíró tárolja a globális változó MBM típusú Long. Aztán, jegyzet, törölje az ideiglenes fogantyú CDC keresztül ReleaseDC funkció fontos művelet. Végül úgy döntünk, a mi összefüggésben a kapott bittérkép SelectObject funkciót. A területet a PatBlt funkció segítségével tisztítjuk.

A virtuális ablak elpusztítását a DestroyVirtualWindow eljárás végzi.

Sub DestroyVirtualWindow ()
'Törölje a bitképet
DeleteObject MBM
'Törölje le a fogantyút
DeleteDC MDC
End Sub

Magyarázat. Az alkalmazás befejezése után a virtuális ablakot el kell pusztítani az erőforrások felszabadítása érdekében. Először törölje a bitképet a DeleteObject függvénnyel, majd törölje a kontextust a DeleteDC függvénnyel.

Virtuális ablak megjelenítése a képernyőn az InvalidateCanvas eljárás használatával.

Magyarázat. Megjelenítéséhez a ablak a képernyőn, hívja InvalidateRect funkció, amely üzenetet küld a formában, hogy meg kell rajzolni (itt fekszik az egyik finomság az eseményhez tartozó festék formák és a tulajdon AutoRedraw, javasoljuk, hogy ezt a, akkor feltétlenül érti a rajz finomság). Ezután ismét törölje az ablakot fehér színnel. Az ablak formázása a saját DrawFigures eljárásunkon keresztül történik. És ami a legfontosabb, mi származik egy virtuális ablak formájában a funkció bit BitBlt példányt.

Az alak megjelenítése virtuális ablakban a DrawFigures eljárás használatával.

Sub DrawFigures (HDC hosszú, IndexFigure byte)
'Kezelje leírók
Dim NewPen, OldPen olyan hosszú
'Kéz leírók
Dim NewBrush, OldBrush olyan hosszú
"Hozzon létre egy tollat ​​az adott alak struktúrájából
NewPen = CreatePenIndirect (Figures (IndexFigure) .Pen)
"Hozzon létre ecsetet az adott alakzat szerkezetéből
NewBrush = CreateBrushIndirect (Ábrák (IndexFigure) .Brush)
'Válassza ki a toll és ecset létrehozott leíróit a kontextusban
OldPen = SelectObject (HDC, NewPen)
OldBrush = SelectObject (HDC, NewBrush)
Jelölje ki az esetszámokat (IndexFigure)
SHAPE_RECT eset:
Call ShapeRect (HDC, számok (IndexFigure) .Coord)
SHAPE_ELLIPSE eset:
Call ShapeEllipse (HDC, számok (IndexFigure) .Coord)
Vége kiválasztása
'Válassza ki a régi ecsetet és tollat
"Ez nagyon fontos művelet
SelectObject HDC, OldBrush
SelectObject HDC, OldPen
'Vegye ki az új ecsetet és tollat
"ÉS JÓ FENNÁLLÓ MŰKÖDÉS
DeleteObject (NewBrush)
DeleteObject (NewPen)
End Sub

Magyarázat. Ebben az eljárásban áthalad egy összefüggő fogantyú és egy rajzolandó alak típusának indexe. Ezután a CreatePenIndirect és CreateBrushIndirect függvények használatával új tollat ​​és kefét hozunk létre a struktúrákból. A fogadott objektumleírók helyi változókba mentése (az eljárás befejezése után nem lesz szükségünk rájuk) NewPen és NewBrush of Long típusúak. Válasszon egy új tollat ​​és kefét a kontextusban, miközben megőrzi a korábbi értékeket a OldPen és OldBrush változókban a SelectObject függvénnyel. Rajzolja le az alakzatokat. Vissza az előző értékek. Töröljük az új objektumok leíróit. Minden más megérteni a forráskódot, a cikkhez csatolva.




Kapcsolódó cikkek