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.,
Kitas būdas, - sukurti neiniciuotą plunksną, kuriai vėliau priskirti
charakteristikas:
O trečiasis būdas naudojant LOGPEN struktūrą:
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:
Kadangi šios plunksnos aprašytos iš anksto, jų nereikia kurti ir galima
iškart pasirinkti naudojimui su bet kuriuo DC, pvz.,
Daugiau bus vėliau, o dabar pavyzdėlis įvairių stilių ir pločių plunksnų
iliustracijai (bus vėliau).
CPen plunksna (PS_SOLID, 1, RGB(255,0,0));
CPen plunksna();
plunksna.CreatePen (PS_SOLID, 1, RGB(255,0,0));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);CPen plunksna();
plunksna.CreateStockObject(WHITE_PEN);CDC *pDC = GetDC();
pDC -> SelectStockObject(WHITE_PEN);