Глава 1
void CField::OnPaint()
{
CPaintDC dc(this); // device context for painting
int i, j;
RECT rect;
char *let = "abcdefghik";
CPen pn1, *oldpn1;
int count;
CBrush br;
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);
}
for(i=0; i<10; i++)
for(j=0; j<10; j++)
{
count = 0;
if(m_Event[i][j] == SHIP ||
m_Event[i][j] == SHIPWOUND
||
m_Event[i][j] == SHIPKILLED)
{
if((m_Event[i][j+1] == SHIP ||
m_Event[i][j+1] == SHIPWOUND ||
m_Event[i][j+1] == SHIPKILLED) && j+1 < 10)
{
count = 1;
do
{
count++;
} while(
(m_Event[i][j+count] == SHIP ||
m_Event[i][j+count] == SHIPWOUND ||
m_Event[i][j+count] == SHIPKILLED)
&& j+count<10);
DrawShip
(CRect(j*20, i*20, (j+count)*20, (i+1)*20), &dc);
j+=count;
continue;
}
else
{
if(
(m_Event[i+1][j] == SHIP ||
m_Event[i+1][j] == SHIPWOUND ||
m_Event[i+1][j] == SHIPKILLED)
&&
((m_Event[i-1][j] != SHIP &&
m_Event[i-1][j] != SHIPKILLED &&
m_Event[i-1][j] != SHIPWOUND) || i-1<0)
&& i+1<10)
{
count = 1;
do
{
count++;
} while(
(m_Event[i+count][j] == SHIP ||
m_Event[i+count][j] == SHIPWOUND ||
m_Event[i+count][j] == SHIPKILLED)
&& i+count<10);
DrawShip(CRect(j*20, i*20, (j+1)*20, (i+count)*20), &dc);
continue;
}
if(((m_Event[i+1][j] != SHIP &&
m_Event[i+1][j] != SHIPKILLED &&
m_Event[i+1][j] != SHIPWOUND) && i+1<10)||(i+1==10))
if(((m_Event[i-1][j] != SHIP &&
m_Event[i-1][j] != SHIPWOUND &&
m_Event[i-1][j] != SHIPKILLED) && i-1 >= 0) || (i-1<0))
if(((m_Event[i][j+1] != SHIP &&
m_Event[i][j+1] != SHIPWOUND &&
m_Event[i][j+1] != SHIPKILLED) && j+1<10) || (j+1==10))
if(((m_Event[i][j-1] != SHIP &&
m_Event[i][j-1] != SHIPWOUND &&
m_Event[i][j-1] != SHIPKILLED) && j-1>=0) || (j-1<0))
DrawShip(CRect(j*20, i*20, (j+1)*20, (i+1)*20), &dc);
}//else
}//if
}//for
if(m_Draw && m_Operation == PLACEMENT)
DrawShip(GetRect(), &dc);
}//if
GetClientRect(&rect);
if(m_Mode == FOREIGN_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);
}
for(i=0; i<10; i++)
for(j=0; j<10; j++)
{
count = 0;
if(m_Event[i][j] == SHIPKILLED)
{
if(m_Event[i][j+1] == SHIPKILLED && j+1<10)
{
count = 1;
do
{
count++;
} while(m_Event[i][j+count] == SHIPKILLED && j+count<10);
DrawShip(CRect(j*20, i*20, (j+count)*20, (i+1)*20), &dc);
j+=count;
continue;
}
else
{
if(m_Event[i+1][j] == SHIPKILLED && (m_Event[i-1][j] != SHIPKILLED
|| i-1==-1) && i+1 <10)
{
count = 1;
do
{
count++;
} while(m_Event[i+count][j] == SHIPKILLED
&& i+count<10);
DrawShip(CRect(j*20, i*20, (j+1)*20, (i+count)*20), &dc);
continue;
}
if((m_Event[i+1][j] != SHIPKILLED
&& i+1<10)||(i+1==10))
if((m_Event[i-1][j] != SHIPKILLED
&& i-1 >= 0) || (i-1<0))
if((m_Event[i][j+1] != SHIPKILLED
&& j+1<10) || (j+1==10))
if((m_Event[i][j-1] != SHIPKILLED
&& j-1>=0) || (j-1<0))
DrawShip(CRect(j*20, i*20, (j+1)*20, (i+1)*20), &dc);
}//else
}//if
}//for
}//for
pn1.CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
oldpn1 = dc.SelectObject(&pn1);
br.CreateSolidBrush(RGB(22, 60, 84));
for(i=0; i<10; i++)
for(j=0; j<10; j++)
{
if(m_Event[i][j] == CANNOT)
{
dc.MoveTo(j*20, i*20);
dc.LineTo((j+1)*20, (i+1)*20);
dc.MoveTo(j*20, (i+1)*20);
dc.LineTo((j+1)*20, i*20);
}
if(m_Event[i][j] == NEARKILLEDSHIP)
dc.FillRect(CRect(j*20+1, i*20+1, (j+1)*20, (i+1)*20), &br);
if(m_Event[i][j] == SHIPKILLED || m_Event[i][j] == SHIPWOUND)
DrawObject(CRect(j*20, i*20, (j+1)*20, (i+1)*20), &dc, m_bFire);
}
dc.SelectObject(oldpn1);
pn1.DeleteObject();
br.DeleteObject();
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, let[i/20]);
}
}
Назад |
Начало урока |
Вверх |
Вперед
Содержание