Чертане на графика във Visual C++. Контекст на устройството. Класовете CPen, CBitmap и CPoint.
1. Контекст на устройство
От потребителска гледна точка изгледът е един обикновен прозорец, който може да се променя по размери, да се движи и затваря, така както всеки друг прозорец в Windows. От гледна точка на програмиста изгледът е клас на C++, производен на класа CView от библиотеката MFC. Този клас има вградени член-променливи и член-функции, които могат да се използват от програмиста.
Класът CView съдържа един метод, който се нарича OnDraw и прихваща събитието WM_PAINT на ОС. Този метод се извиква автоматично винаги когато трябва да се пречертае прозореца на приложението. Операционната система подава команда за пречертаване, когато потребителят промени размерите на прозореца, или разкрие част от него, която преди това е била скрита от друг прозорец или при промяна съдържанието на прозореца. Ако програмата променя съдържанието на прозореца, тя трябва да уведоми ОС за това чрез функция Invalidate на изгледа, която от своя страна генерира събитието WM_PAINT за прозореца.
Чертането в изгледа на приложението става чрез добавяне на функции към метода OnDraw на класа CView. Windows обаче не позволява директен достъп до графичния контролер на компютъра, поради което функциите за чертане комуникират с абстрактното устройство Device Context (DC). То представлява също клас, който трансформира функциите за чертане от високо ниво (потребителски функции) към ниско ниво (функции на драйвера на графичния контролер). Поради тази причина конкретния модел на графичния контролер е без значение, което опростява значително създаването на графични програми.
Класът на device context е CDC, който се предава чрез указател към метода OnDraw.
Пример:
void CEx03aView::OnDraw(CDC* pDC)
{
pDC->TextOut(0, 0, "Hello, world!"); // prints in default font
// & size, top left corner
pDC->SelectStockObject(GRAY_BRUSH); // selects a brush for the
// circle interior
pDC->Ellipse(CRect(0, 20, 100, 120)); // draws a gray circle
// 100 units in diameter
}
От примера се вижда, че извикването на всеки от методите за чертане (напр. TextOut) става със символа "->".
2. Функции за чертане
- SetPixel(CPoint(30,30),40);
- MoveTo (x, y) - премества молива в точка с координати x, y;
- LineTo (x, y) - чертае линия от текущата позиция на молива до позиция с коорд. x, y;
- Rectangle ( x1, y1, x2, y2) - чертае правоъгълник x1,y1 x2,y2;
- Ellipse ( CRect( x1, y1, x2, y2) ) - чертае елипса с обграждащ правоъгълник x1,y1 x2,y2;
- TextOut (x, y, "текст") - чертае текст с начало коорд. x, y;
- SetTextColor ( RGB ( червен, зелен, син) ) - задава цвят на предния план на текста;
- SetBkColor ( RGB ( червен, зелен, син) ) - задава цвят на задния фон на текста;
- CBrush brush( RGB(червен, зелен, син) ) - цвят за запълване;
- pDC->SelectObject( brush ) - избира създадения цвят за запълване
- CPen pen( молив , дебелина, RGB(червен, зелен, син) ) - дефинира молив за чертане;
- pDC->SelectObject( pen ) - избира създадения молив за чертане;
молив:
- PS_SOLID - плътна линия;
- PS_DASH - пунктирна линия;
- PS_DOT 2 - линия от точки.
Пример: Да се направи програма, която чертае синусоида.
void CEx07bView::OnDraw(CDC* pDC)
{
float z;
int x=10;
for (z=0; z<10; z+=0.01)
{
x++;
pDC->SetPixel(x,150+100*sin(z),RGB(255,0,0));
}
}
Класът CPoint служи за представяне координатите на точка върху екрана. Полетата x и y на класа CPoint указват положението на тази точка. Трябва да се има предвид, че началото на координатната система е в горния ляв ъгъл на прозореца на приложението. Класът CPoint се използва съвместно с функции за чертане на точки - SetPixel.
Пример:
CPoint p; // дефинираме точка p, която е реализация на класа CPoint
p.x = 10; // присвояваме х=10 на точката р
p.y = 20; // присвояваме y=20 на точката р
pDC->SetPixel ( p, RGB(255,0,0) ); // Задаваме червен цвят за точката р
Класът CPen служи за представяне на молива за чертане в графичен режим. Параметрите на молива се задават чрез функция CreatePen. Общият вид на тази функция е следния:
CreatePen ( молив , дебелина, RGB(червен, зелен, син) ;
където молив може да приема следните стойности:
- PS_SOLID - плътна линия;
- PS_DASH - пунктирна линия;
- PS_DOT 2 - линия от точки.
Пример:
CPen pen; // създава се реализация на класа CPen
pen.CreatePen(PS_SOLID,2,RGB(0,0,255)); // задават се параметрите на молива
pDC->SelectObject(pen); // избира се зададения молив като текущ обект за чертане
pDC->LineTo(200,200); // чертае линия с избрания молив
pDC->Rectangle ( 50,50,200,100); // чертае правоъгълник с избрания молив
Класът CBitmap служи за чертане на готови графични изображения. За целта се извиква методът LoadBitmap с параметър - идентификатор на bitmap ресурс от ресурсите на приложението.
Пример:
CBitmap b;
b.LoadBitmap(IDB_BITMAP1);
CDC dc;
dc.CreateCompatibleDC(pDC);
dc.SelectObject(&b);
pDC->BitBlt(0,0,100,100,&dc,0,0,SRCCOPY);