Baigėsi atostogėlės: zuikių mokyklėlėje vėl MFC
Plunksnos

Ankstesniuose Vartiklio numeriuose (žr. Nr.5, po to Nr.6 bei Nr.7) buvom pradėję aiškintis MFC. Nužydėjus liepoms vėl sugrįžtame prie šios temos. Bet prieš pamerkdami plunksną į rašalą, perskaitykite šią pastabėlę.

Kadangi DC ("Device Context") yra bendras dažnai naudojamas ir ribotas resursas, - nėra ko tikėtis, kad jį pasiėmus ir išsirinkus plunksną ar teptuką, manyti, kad šis bus toks pats ir kito DC "užgrobimo" metu. Kiekvieną kartą reikia juos inicializuoti iš naujo (nors yra būdų išlaikyti DC parametrus visą laiką, pvz., "pačiupti" DC "OnCreate" (lango kūrimo) procedūroje ir "išlaikyti pozicijas" iki pat WM_DESTROY pranešimo, - bet tokiai nedraugiškai programai reikia "duoti į kaulus", - juk sistemoje DC tėra labai ribotas kiekis.

GDI posistemė turi nemaža funkcijų savų plunksnų ir teptukų kūrimui: ::CreatePen, ::CreateSolidBrush, ::CreateHatchBrush ir ::CreatePatternBrush. (Priminsiu zuikiams, kad '::' priekyje reiškia, kad kviečiame tiesiog Windows API funkciją). MFC šias funkcijas "suvynioja" į "CPen" ir "CBrush" klases siekdama supaprastinti jų naudojimą, o taip pat leisdama programuoti objektiniu stiliumi, užmirštant archaiškus GDI valdiklius - "handles".

Paprasčiausiai plunksna sukuriama ją aprašant nurodant parametrus, kuriuos panaudoja plunksnos konstruktorius, pvz.,

CPen plunksna (PS_SOLID, 1, RGB(255,0,0));

Kitas būdas, - sukurti neiniciuotą plunksną, kuriai vėliau priskirti charakteristikas:

CPen plunksna();
plunksna.CreatePen (PS_SOLID, 1, RGB(255,0,0));

O trečiasis būdas naudojant LOGPEN struktūrą:

CPen plunksna();
LOGPEN lp_pl;

lp_pl.lopnStyle = PS_SOLID;
lp_pl.lopnWidth = 1;
lp_pl.lopnColor = RGB(255,0,0);
plunksna.CreatePenIndirect (&lp_pl);

Visuose šiuose pavyzdžiuose sukuriama vientisa (nenutrūkstama) viengubo pločio raudona plunksna. Specialus PS_INSIDEFRAME stilius brėžia vientisą atkarpą ar kreivę, pvz., elipsę, kuri visa sutelpa į gaubiantį stačiakampį. (iliustracija bus vėliau)

Su plunksna, turinčia stilių PS_NULL, nieko nenubrėžiama. Tai kokiam velniui jis reikalingas? Norit tikėkit, norit - ne, tačiau kartais be jo nepatogu apsieiti. Pvz., norite brėžti raudoną apskritimą be jokio rėmelio. Jei tą darote naudodami "CDC::Ellipse" funkciją, "Windows" automatiškai "įrėmins" apskritimą veiksnios plunksnos spalvos rėmeliu.

Antrasis parametras nurodo plunksnos plotį (loginiais vienetais, o fizinis plotis priklauso nuo DC atvaizdavimo būdo, kurių yra 8. Nutylint naudojamas MM_TEXT, o tai reiškia 1 = 1 pikselis, o jeigu būtų MM_LOMETRIC, tada 1 = 0,1 mm).

Kuriant vientisas (PS_SOLID, PS_INSIDEFRAME arba PS_NULL) plunksnas, jų plotis gali būti bet koks. Tačiau trūkių plunksnų (PS_DASH, PS_DOT, PS_DASHDOT ir PS_DASHDOTDOT) plotis privalo būti lygus 1. Jei nurodomas 0, - plunksnos plotis 1 fizinis taškas!

Spalva yra 24 bitų reikšmė susidedanti iš raudonos, žalios ir mėlynos (RGB) spalvų mišinio (kiekvienos reikšmė iš intervalo 0..255)

GDI suteikia galimybę naudoti 3 iš anksto aprašytas 1 pikselio pločio plunksnas: WHITE_PEN, BLACK_PEN ir NULL_PEN. Jas pasirinkti galima taip:

CPen plunksna();
plunksna.CreateStockObject(WHITE_PEN);

Kadangi šios plunksnos aprašytos iš anksto, jų nereikia kurti ir galima iškart pasirinkti naudojimui su bet kuriuo DC, pvz.,

CDC *pDC = GetDC();
pDC -> SelectStockObject(WHITE_PEN);

Daugiau bus vėliau, o dabar pavyzdėlis įvairių stilių ir pločių plunksnų iliustracijai (bus vėliau).