Назад | Начало урока | Вперед
Содержание

Глава 4

Файл Field.cpp

// 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();
}

Теперь, когда мы создали класс "Поле боя", надо внести изменения в файл главного окна,
в котором будет располагаться наше поле боя.


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz