Глава 4
// Field.cpp : implementation file
//
#include "stdafx.h"
#include "SeaBattle02.h"
#include "Field.h"
// CField
IMPLEMENT_DYNAMIC(CField, CStatic)
CField::CField()
{
m_Parent = NULL;
for(int i=0; i<10; i++)
for(int j=0; j<10; j++)
m_Event[i][j] = EMPTY;
}
CField::~CField()
{
WaterDC.DeleteDC();
bmp.Detach();
}
BEGIN_MESSAGE_MAP(CField, CStatic)
//{{AFX_MSG_MAP(CField)
ON_WM_PAINT()
ON_WM_SETCURSOR()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//----------------------
void CField::OnPaint()
{
CPaintDC dc(this); // device context for painting
int i;
RECT rect;
char *let = "abcdefghik";
GetClientRect(&rect);
if(m_Mode == OWN_FIELD)
{
//Нарисуем синюю воду
//интересно, что без этой функции фон нашего поля не будет нарисован
dc.BitBlt(dc.m_ps.rcPaint.left, dc.m_ps.rcPaint.top,
dc.m_ps.rcPaint.right - dc.m_ps.rcPaint.left,
dc.m_ps.rcPaint.bottom - dc.m_ps.rcPaint.top,
&WaterDC, dc.m_ps.rcPaint.left,
dc.m_ps.rcPaint.top, SRCCOPY);
//горизонтальные линии сетки
for(i=(dc.m_ps.rcPaint.top/20)*20; i<=(dc.m_ps.rcPaint.bottom/20)*20; i+=20)
{
dc.MoveTo(dc.m_ps.rcPaint.left, i);
dc.LineTo(dc.m_ps.rcPaint.right, i);
}
//вериткальные линии сетки
for(i=(dc.m_ps.rcPaint.left/20)*20; i<=(dc.m_ps.rcPaint.right/20)*20; i+=20)
{
dc.MoveTo(i, dc.m_ps.rcPaint.top);
dc.LineTo(i, dc.m_ps.rcPaint.bottom);
}
}//end (m_Mode == OWN_FIELD)
if(m_Mode == NUMBERS)
{
dc.SetBkMode(TRANSPARENT);
dc.TextOut(0, 4, " 1 2 3 4 5 6 7 8 9 10");
}
if(m_Mode == LETTERS)
{
dc.SetBkMode(TRANSPARENT);
for(i=0; i < rect.bottom-rect.top; i+=20)
dc.TextOut(8, i+2, (CString)let[i/20]);
}
}
//-----------------------------
void CField::SetMode(int mode)
{
m_Mode = mode;
}
//------------------------
void CField::SetParent(CWnd *wnd)
{
RECT rect;
CBitmap bmp;
CDC *dc = GetDC();
CPicture m_Fon;
m_Parent = wnd;
GetClientRect(&rect);
WaterDC.CreateCompatibleDC(dc);
bmp.CreateCompatibleBitmap(dc, rect.right, rect.bottom);
ReleaseDC(dc);
pOld = WaterDC.SelectObject(&bmp);
m_Fon.Load(JPG_BACKGROUND);
m_Fon.Render(&WaterDC, CRect(0, 0, 50, 50));
//замостим голубыми плитками 50х50 все главное окно
for(int i=0; i<=rect.right/50+3; i++)
for(int j=0; j<=rect.bottom/50; j++)
WaterDC.BitBlt(i*50, j*50, 50, 50, &WaterDC, 0, 0, SRCCOPY);
}
//---------------------------
BOOL CField::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
return CStatic::OnSetCursor(pWnd, nHitTest, message);
}
//--------------------
void CField::OnDestroy()
{
WaterDC.DeleteDC();
bmp.DeleteObject();
CStatic::OnDestroy();
}
Теперь, когда мы создали класс "Поле боя", надо внести изменения в файл главного окна,
в котором будет располагаться наше поле боя.
Назад |
Начало урока |
Вверх |
Вперед
Содержание