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.
#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
//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();
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.