Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SSW_8_11.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
5 Мб
Скачать
☆

Working with brushes

The graphical objects are painted with current pen. In MFC, the pens are described by CPen class. Default thickness of pen is 1 pixel. There are three standard pens (Black, White, Null (transparent pen)). The pens are provided by CreateStockObject() function.

The constants of pens are the following: BLACK_PEN, WHITE_PEN, NULL_PEN.

Often (often of all), there are created its own pens. To make that, first of all there are created the object of CPen class, after, the function CreatePen() is called. There several variants of that function. The general look is the following:

BOOL CPen::CreatePen(int nPenStyle, int nWidth, COLORREF Color);

Here, nPenStyle   Specifies the style for the pen. nWidth   Specifies the width of the pen.

The provided pen styles:

PS_SOLID   Creates a solid pen.

PS_DASH   Creates a dashed pen. Valid only when the pen width is 1 or less, in device units.

PS_DOT   Creates a dotted pen. Valid only when the pen width is 1 or less, in device units.

PS_DASHDOT   Creates a pen with alternating dashes and dots. Valid only when the pen width is 1 or less, in device units.

PS_DASHDOTDOT   Creates a pen with alternating dashes and double dots. Valid only when the pen width is 1 or less, in device units.

PS_NULL   Creates a null pen.

The other way to construct a pen – is CPen constructor usage:

CPen( );

CPen( int nPenStyle, int nWidth, COLORREF crColor ); throw( CResourceException );

CPen( int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL );throw( CResourceException );

The user brushes creating

It’s described by CBrush class. The brushes are created with CreateSolidBrush() function using:

BOOL CBrush::CreateSolidBrush(COLORREF crColor ); // the filled brush

Parameter: crColor   A COLORREF structure that specifies the color of the brush. The color specifies an RGB value.

Class Cbrush also contains the constructor. Using this constructor, there is created the filled brush, simultaneously with brush object declaration:

CBrush(COLORREF Color); // the creation and initialization of the brush object are made at once.

After the brush creation, it is selected to the device context by SelectObject() function.

Brushes and pens are deleted by DeleteObject() function. Really, there is no possibility to delete the standard object and the deleted object would not be belong to the one of device contexts.

Short description how of program to work with program on graphics

Here is the set of changes in comparison to the usual MFC-framework.

  1. There is used the virtual window method. All the information is directed to the memory device context, and on WM_PAINT message is copied to the physical window.

  2. In the resource file there difined the menu items and their constants: IDM_LINES, IDM_RECTANGLES, IDM_ELLIPSES, IDM_RESET, IDM_EXIT, IDM_HELP.

  3. To describe the main window class.

class CMainWin : public CframeWnd

{CDC m_memDC; // the device context, linked to the virtual window;

CBitmap m_bmp; // the virtual window image;

CBrush m_bmp; // the brush for virtual window;

// The pens declaration

CPen m_RedPen, m_YellowPen, m_GreenPen, m_BluePen, m_OldPen;

// The handlers

OnPaint(); OnLines(); OnRectangles(); OnEllepses(); OnReset(); OnExit(); OnHelp();

};

The changes to the program text are in the Listing 5.1:

Listing 5.1 The constructor of program to work with graphics

CMainWin::CMainWin()

{Create(NULL,"MFC",WS_OVERLAPPEDWINDOW,rectDefault,

NULL,MAKEINTRESOURCE(IDR_MENU1));

m_X=m_Y=0;

maxX=GetSystemMetrics(SM_CXSCREEN);

maxY=GetSystemMetrics(SM_CYSCREEN);

CClientDC dc(this);

// The virtual window image creation

m_memDC.CreateCompatibleDC(&dc);

m_bmp.CreateCompatibleBitmap(&dc,maxX,maxY);

m_memDC.SelectObject(&m_bmp);

// The standard background selection

m_bkbrush.CreateStockObject(WHITE_BRUSH);

m_memDC.SelectObject(&m_bkbrush);

// The virtual window background fill

m_memDC.PatBlt(0,0,maxX,maxY,PATCOPY);

// The pens creation

m_RedPen.CreatePen(PS_SOLID,1,RGB(255,0,0));

m_GreenPen.CreatePen(PS_SOLID,2,RGB(0,255,0));

m_BluePen.CreatePen(PS_SOLID,3,RGB(0,0,255));

m_YellowPen.CreatePen(PS_SOLID,4,RGB(255,255,0));

m_OldPen.CreateStockObject(BLACK_PEN);

}

In Listing 5.2 you can see the function to make lines and points.

Listing 5.2 – The OnLines() handler;

afx_msg void CMainWin::OnLines()

{ // four points mapping

m_memDC.SetPixel(40, 14, RGB(255,0,0));

m_memDC.SetPixel(41, 14, RGB(0,255,0));

m_memDC.SetPixel(42, 14, RGB(0,0,255));

m_memDC.SetPixel(43, 14, RGB(0,0,0));

m_memDC.LineTo(100,50);

m_memDC.MoveTo(100,50);

// the color changing to green

m_memDC.SelectObject(&m_GreenPen);

m_memDC.MoveTo(200,100);

m_memDC.SelectObject(&m_BluePen);

m_memDC.LineTo(200,200);

m_memDC.SelectObject(&m_OldPen);

m_memDC.Arc(0,0,300,300,0,30,200,0);

InvalidateRect(NULL);

}

In Listing 5.3 there is the function to make rectangles, ellipses sector, the window reset.

Listing 5.3 – The OnRectangles(), OnEllipses(), OnReset() handler;

afx_msg void CMainWin::OnRectangles()

{CBrush HollowBrush;

// The “empty” fill creation

HollowBrush.CreateStockObject(HOLLOW_BRUSH);

m_memDC.Rectangle(50, 50, 300, 300);

m_memDC.RoundRect(125, 125, 220, 240, 15, 13);

// The red pen selection

m_memDC.SelectObject(&m_RedPen);

m_memDC.Rectangle(100, 100, 200, 200);

// The transparent pen restoration

m_memDC.SelectObject(&m_OldPen);

// The previous brush restoration

m_memDC.SelectObject(&m_bkBrush);

InvalidateRect(NULL);

}

afx_msg void CMainWin::OnEllipses()

{CBrush Brush;

// the blue brush creation

Brush.CreateSolidBrush(RGB(0,0,255));

m_memDC.SelectObject(&Brush);

// the filled ellipses mapping

m_memDC.Ellipse(50,200,100,280);

m_memDC.Ellipse(75,25,280,100);

// the red pen using

m_memDC.SelectObject(&m_RedPen);

// the green brush creation

Brush.DeleteObject(); // Blue brush erase

Brush.CreateSolidBrush(RGB(0,255,0));

m_memDC.SelectObject(&Brush);

m_memDC.Ellipse(100,100,200,200);

// sector mapping

m_memDC.Pic(200,200,340,340,225,200,200,150);

// The previous parameters restoration

m_memDC.SelectObject(&m_OldPen);

m_memDC.SelectObject(&m_bkBrush);

InvalidateRect(NULL);

}

afx_msg void CMainWin::OnReset()

{m_memDC.PatBlt(0,0,maxX,maxY,PATCOPY);

InvalidateRect(NULL);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]