Рисование графическими объектами

Страницы работы

Содержание работы

Рисование графическими объектами

Paint отвечает на сообщения WM_PAINT, но она не является функцией-обработчиком событий, она вызывается функцией EvPaint (все функции с префиксом Ev откликаются на события Windows), которая и является настоящим обработчиком события WM_PAINT.

Ключевые факты:

·  EvPaint вызывает виртуальную функцию Paint. Простейший способ отклика на сообщения WM_PAINT – замена Paint в производном классе,

·  EvPaint конструирует объект контекста устройства класса TPaintDC, объект передается по ссылке в качестве параметра Paint,

·  объект TPaintDC автоматически удовлетворяет правилу Windows о том, что при отклике на WM_PAINT должны вызываться BeginPaint и EndPaint.

Чтобы направить сообщения WM_PAINTфункции отклика EvPaint в производном классе:

o  объявить в классе замещающую функцию EvPaint,

o  определить таблицу отклика с помощью макроса EV_WM_PAINT,

o  сконструировать объект класса TPaintDC.

Painter.rh

#define ID_MENU    100

Painter.rc

#include <owl/window.rh>

#include "painter.rh"

ID_MENU MENU

BEGIN

POPUP "&Demo"

BEGIN

MENUITEM "E&it", CM_EXIT

END

END   

Painter.cpp

//Respond directly to WM_PAINT

#include <owl\applicat.h>

#include <owl\framewin.h>

#include <owl\dc.h>

#include <owl\gdiobjec.h>

#include <owl\point.h>

#include <owl\color.h>

#pragma hdrstop

#include "painter.rh"

//The application's main window

class TPaintWin: public TFrameWindow {

TPen blackPen, redPen, greenPen, bluePen;

TBrush blueGreenBrush;

public:

TPaintWin(TWindow* parent, const char far* title);

void DrawEllipse(TDC& dc, TRect& cr);

protected:

void EvPaint();

void EvSize(UINT sizeType, TSize &size);

DECLARE_RESPONSE_TABLE(TPaintWin);

};

DEFINE_RESPONSE_TABLE1(TPaintWin, TFrameWindow)

EV_WM_PAINT,

EV_WM_SIZE,

END_RESPONSE_TABLE;

//Constructor

//Note how private member class objects are constructed

TPaintWin::TPaintWin(TWindow* parent, const char far* title)

: TFrameWindow(parent, title),

TWindow(parent, title),

blackPen(TColor::Black),

redPen(TColor::LtRed),

greenPen(TColor::LtGreen),

bluePen(TColor::LtBlue),

blueGreenBrush(TColor::LtCyan)

{

AssignMenu(ID_MENU);

}

//Draw a filled, outlined, colored ellipse

void

TPaintWin::DrawEllipse(TDC& dc, TRect& cr)

{

TColor foreground(255, 0, 128);

TColor background(0, 128, 255);

TPen pen(foreground);

TBrush brush(background);

dc.SelectObject(pen);

dc.SelectObject(brush);

TPoint origin((cr.right / 4) * 3, cr.bottom / 4);

TSize size(cr.right / 5, cr.bottom / 5);

TRect dimensions(origin, size);

dc.Ellipse(dimensions);

dc.RestorePen();

dc.RestoreBrush();

}

//Respond to WM_PAINT  messages

void

TPaintWin::EvPaint()

{

//Construct a device context object

TPaintDC dc(*this);

//Get client area dimensions

TRect cr;

GetClientRect(cr);

//Erase window background

TBrush whiteBrush(TColor::White);

dc.FillRect(cr, whiteBrush);

//Shrink a copy of rectangle cr 10 pixels on all sides

TRect outline(cr);

outline.Inflate(-10, -10);

//Draw a red rectangle using dimensions in TRect outline

dc.SelectObject(redPen);

dc.Rectangle(outline);

//Draw a black rectangle the "hard way"

dc.SelectObject(blackPen);

dc.Rectangle(25, 25, 150, 175);

//Draw a green rectangle using TPoint arguments

TPoint p1(20, 20);

TPoint p2(60, 80);

dc.SelectObject(greenPen);

dc.Rectangle(p1, p2);

//Draw a filled rectangle using TPoint and TSize arguments

TPoint p3(30, 90);

TSize size(48, 32);

dc.SelectObject(bluePen);

dc.SelectObject(blueGreenBrush);

dc.Rectangle(p1, p2);

//Draw colored lines

for (int i = 0; i < 3; ++i){

//Construct line start and stop points

TPoint startLine(cr.right / 2 + i * 8, cr.bottom / 2);

TPoint stopLine(startLine.x, cr.bottom - 20);

if(i == 0)

dc.SelectObject(redPen);

else  if(i == 1)

dc.SelectObject(greenPen);

else

dc.SelectObject(bluePen);

dc.MoveTo(startLine);

dc.MoveTo(stopLine);

}

//Restore original pen and brush in the device context

dc.RestorePen();

dc.RestoreBrush();

DrawEllipse(dc, cr);

}

//Respond to WM_SIZE message

void

TPaintWin::EvSize(UINT sizeType, TSize &size)

{

TFrameWindow::EvSize(sizeType, size);

Invalidate();

}

//The application class

class TPaintApp: public TApplication {

public:

TPaintApp(const char far* name)

:TApplication(name){};

void InitMainWindow();

};

//Initialize the program's main window

void

TPaintApp::InitMainWindow()

{

MainWindow = new TPaintWin(0, "Paint Demonstration");

}

#pragma argsused

//Main program

int

OwlMain(int argc, char* argv[])

{

TPaintApp app("Painter");

return app.Run();

Похожие материалы

Информация о работе