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

Глава 2

Файл SeaBattleDlg.cpp

// SeaBattleDlg.cpp : implementation file
//

#include "stdafx.h"
#include "SeaBattle.h"
#include "SeaBattleDlg.h"

//#ifdef CLIENTSERVER
//#define CLIENTSERVER
#include "ClientServer.h"
//#endif

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSeaBattleDlg dialog

CSeaBattleDlg::CSeaBattleDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSeaBattleDlg::IDD, pParent), m_iButtonState(BS_RESULTS) {

//{
{
AFX_DATA_INIT(CSeaBattleDlg) // NOTE: the ClassWizard will add member initialization here
//
}
}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_Process = FUCK;
OwnMove = true;
IsTurn = false;
m_MinResult = 0;
}


BEGIN_MESSAGE_MAP(CSeaBattleDlg, CDialog) //{

{
AFX_MSG_MAP(CSeaBattleDlg) ON_WM_PAINT()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_DESTROY()
ON_WM_SETCURSOR()
//
}
}AFX_MSG_MAP
ON_MESSAGE(WM_STATIC_TO_DLG, ReceiveMessage)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSeaBattleDlg message handlers

BOOL CSeaBattleDlg::OnInitDialog() {

CDialog::OnInitDialog();
HINSTANCE hInst;
RECT rect;
CDC* dc, tmpDC;
CSize sz;
int i, j;
CBitmap bmp, *ptmpBmp;
CPicture m_Fon;

SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
hInst = AfxGetInstanceHandle();

m_OwnField.Create(NULL, WS_CHILD|WS_VISIBLE|SS_NOTIFY, CRect(30, 100, 230, 300), this);
m_OwnField.SetMode(OWN_FIELD);
m_ForeignField.Create(NULL, WS_CHILD|WS_VISIBLE|SS_NOTIFY, CRect(260, 100, 460, 300), this);
m_ForeignField.SetMode(FOREIGN_FIELD);
m_NumberO.Create(NULL, WS_CHILD|WS_VISIBLE, CRect(30, 80, 230, 95), this);
m_NumberO.SetMode(NUMBERS);
m_NumberF.Create(NULL, WS_CHILD|WS_VISIBLE, CRect(260, 80, 460, 95), this);
m_NumberF.SetMode(NUMBERS);
m_LetterO.Create(NULL, WS_CHILD|WS_VISIBLE, CRect(10, 100, 25, 300), this);
m_LetterO.SetMode(LETTERS);
m_LetterF.Create(NULL, WS_CHILD|WS_VISIBLE, CRect(240, 100, 255, 300), this);
m_LetterF.SetMode(LETTERS);
m_Sight = (HCURSOR)::LoadCursor(hInst, MAKEINTRESOURCE(IDC_SIGHT));

m_Process = PLACE;
m_Operation = UNDEFINED;

GetClientRect(&rect);
dc = GetDC();
m_FonDC.CreateCompatibleDC(dc);
bmp.CreateCompatibleBitmap(dc, rect.right+150, rect.bottom);
ReleaseDC(dc);
pOld = m_FonDC.SelectObject(&bmp);
m_Fon.Load(JPG_BACKGROUND);
m_Fon.Render(&m_FonDC, CRect(0, 0, 50, 50));
for(i=0; i<=rect.right/50+3; i++)
for(j=0; j<=rect.bottom/50; j++)
m_FonDC.BitBlt(i*50, j*50, 50, 50, &m_FonDC, 0, 0, SRCCOPY);
m_FonDC.SetBkMode(TRANSPARENT);
m_FonDC.TextOut(32, 306, "Убито:");
m_FonDC.TextOut(262, 306, "Убито:");
m_OwnField.SetParent(this);
m_ForeignField.SetParent(this);
m_Fon.Load(JPG_TITLE);
m_Fon.Render(&m_FonDC, CRect(170, 1, 300, 20));

bClose.LoadBitmap(IDB_CLOSE);
bHide.LoadBitmap(IDB_HIDE);
bTnOn.LoadBitmap(IDB_TURNON);
bTnOut.LoadBitmap(IDB_TURNOUT);
tmpDC.CreateCompatibleDC(&m_FonDC);
ptmpBmp = tmpDC.SelectObject(&bClose);
m_FonDC.BitBlt(rect.right-21, 1, 20, 20, &tmpDC, 0, 0, SRCCOPY);
tmpDC.SelectObject(&bHide);
m_FonDC.BitBlt(rect.right-45, 1, 20, 20, &tmpDC, 0, 0, SRCCOPY);
tmpDC.SelectObject(&bTnOn);
m_FonDC.BitBlt(rect.right-69, 1, 20, 20, &tmpDC, 0, 0, SRCCOPY);
tmpDC.SelectObject(ptmpBmp);
tmpDC.DeleteDC();

m_FonDC.TextOut(rect.right+20, 83, "История игры");
m_FonDC.SetTextAlign(TA_CENTER);

m_cHand = LoadCursor(hInst, MAKEINTRESOURCE(IDC_HAND));
m_cDefault = LoadCursor(hInst, MAKEINTRESOURCE(IDC_DEFAULT));
SetWindowText("Морской бой. Автор: Волков Алексей");
Help.Create(IDD_HELP, this);

NetworkWnd.Create(IDD_NETWORK);
wnd = this;
NetworkWnd.parent = this;
Start();

//Красивые Кнопки
m_ShipWnd.Create(NULL, NULL, WS_CHILD|WS_VISIBLE, CRect(0, 0, 103, 88), this, 0);
m_ShipWnd.SetMode(BT_SHIPS, this);
m_NetWnd.Create(NULL, NULL, WS_CHILD|WS_VISIBLE, CRect(105, 20, 105+112, 20+65), this, 0);
m_NetWnd.SetMode(BT_NET, this);
m_SingleWnd.Create(NULL, NULL, WS_CHILD|WS_VISIBLE, CRect(220, 18, 220+142, 18+68), this, 0);
m_SingleWnd.SetMode(BT_SINGLE, this);
m_HelpWnd.Create(NULL, NULL, WS_CHILD|WS_VISIBLE, CRect(365, 20, 365+118, 20+58), this, 0);
m_HelpWnd.SetMode(BT_HELP, this);

m_MovesBox.Create(WS_CHILD|WS_BORDER|WS_HSCROLL|WS_TABSTOP|LVS_LIST,
CRect(rect.right-10, 100, rect.right+140, 300), this, 0);
m_MovesBox.Init(this);

m_Results.Create(WS_CHILD|WS_BORDER|LVS_LIST,
CRect(rect.right-10, 100, rect.right+140, 300), this, 0);
m_Results.SetBkColor(RGB(35, 89, 127));
m_Results.SetTextBkColor(RGB(35, 89, 127));

m_ResFile.Open("Data.dat", CFile::modeCreate | CFile::modeNoTruncate
| CFile::modeReadWrite | CFile::shareExclusive);
ReadFile();

m_SaveDialog.Create(IDD_SAVE_RESULT, this);
m_SaveDialog.SetParent(this);
m_SaveDialog.ShowWindow(SW_HIDE);
return TRUE; // return TRUE unless you set the focus to a control

}


void CSeaBattleDlg::OnPaint() {

CPaintDC dc(this); // device context for painting
RECT rect;
CString str;

GetClientRect(&rect);

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,
&m_FonDC, dc.m_ps.rcPaint.left,
dc.m_ps.rcPaint.top, SRCCOPY);

dc.SetBkMode(TRANSPARENT);
str.Format("%d", m_OwnField.KilledShips);
dc.TextOut(77, 306, str);
str.Format("%d", m_ForeignField.KilledShips);
dc.TextOut(307, 306, str);
dc.SetBkMode(OPAQUE);
DrawMove();

}


// The system calls this to obtain the cursor to display while the user drags
// the minimized window.

HRESULT CSeaBattleDlg::ReceiveMessage(WPARAM wParam, LPARAM lParam) {

DATA *data;
NET_DATA *netdata;
LISTDATA *listdata;
CDC *dc;
CSize sz;
RECT rect;
CString str;
int cnt, res, i, j;
char *buf, tmp[100];

data = (DATA*)lParam;

switch(wParam) {

case WM_ADD_RESULT:
buf = (char *)lParam;
cnt = m_Results.GetItemCount();
str.Format("%s %d", buf, m_ForeignField.GetReport());
if(cnt == 0) {
m_Results.InsertItem(cnt, str.GetBuffer(100));
m_Results.SetItemData(cnt, m_ForeignField.GetReport());
break;
}
for(i=0; i res = m_Results.GetItemData(i);
if(res <= m_ForeignField.GetReport()) {
m_Results.GetItemText(cnt-1, 0, tmp, 100);
m_Results.InsertItem(cnt, tmp);
m_Results.SetItemData(cnt, m_Results.GetItemData(cnt-1));
for(j=cnt-1; j>i; j--) {
m_Results.SetItemData(j, m_Results.GetItemData(j-1));
m_Results.GetItemText(j-1, 0, tmp, 100);
m_Results.SetItemText(j, 0, tmp);
}
m_Results.SetItemText(i, 0, str.GetBuffer(100));
m_Results.SetItemData(i, m_ForeignField.GetReport());
if(cnt >= 15) m_Results.DeleteItem(cnt-1);
break;
}
else if(i == cnt-1 && cnt < 15) {
m_Results.InsertItem(cnt, str.GetBuffer(100));
m_Results.SetItemData(cnt, m_ForeignField.GetReport());
}
}
break;
case WM_LBUTTONDOWN_BUT:
if(m_iButtonState == BS_RESULTS) {
m_Results.ShowWindow(SW_SHOW);
m_MovesBox.ShowWindow(SW_HIDE);
m_iButtonState = BS_HISTORY;
}
else {
m_Results.ShowWindow(SW_HIDE);
m_MovesBox.ShowWindow(SW_SHOW);
m_iButtonState = BS_RESULTS;
}
break;
case WM_NEW_GAME:
m_OwnField.ReceiveMessage(WM_IS_OK, 0);
m_ForeignField.ReceiveMessage(WM_CLEARFIELD, 0);
break;
case WM_SET_MOVE:
listdata = (LISTDATA*)lParam;
if(listdata->y == 9) listdata->y++;
switch(listdata->state) {
case EMPTY:
str.Format("%s:[%c%d] - промах", listdata->str, listdata->y+97, listdata->x+1);
break;
case SHIPKILLED:
str.Format("%s:[%c%d] - убил", listdata->str, listdata->y+97, listdata->x+1);
break;
case SHIPWOUND:
str.Format("%s:[%c%d] - ранил", listdata->str, listdata->y+97, listdata->x+1);
break;
}
cnt = m_MovesBox.GetItemCount();
m_MovesBox.InsertItem(cnt, str);
m_MovesBox.Scroll(CSize(cnt/13*100, 0));
break;
case WM_LBT_DOWN:
SetBtDown((int)lParam);
break;
case WM_FILL_DC:
m_OwnField.GetClientRect(&rect);
dc = (CDC*)lParam;
dc->BitBlt(0, 0, rect.right, rect.bottom, &m_FonDC, 0, 0, SRCCOPY);
break;
case WM_FILL_LIST_DC:
m_OwnField.GetClientRect(&rect);
dc = (CDC*)lParam;
dc->BitBlt(0, 0, 150, 300, &m_FonDC, 0, 0, SRCCOPY);
break;
case WM_SEND_DATA:
netdata = (NET_DATA *)lParam;
SendData(netdata->buf, netdata->lenght);
break;
case WM_SET_STEP:
OwnMove = (bool)lParam;
InvalidateRect(CRect(340, 307, 430, 325));
break;
case WM_OWN_STEP:
// m_OwnField.Invalidate();
OwnMove = true;
DrawMove();
m_ForeignField.ReceiveMessage(WM_FIRE, 0);
break;
case WM_INV_STR:
InvalidateRect(CRect(340, 307, 430, 325));
break;
case WM_COMP_MOVE:
InvalidateRect(CRect(305, 303, 330, 325));
OwnMove = false;
DrawMove();
m_OwnField.CompMove();
// m_OwnField.Invalidate();
InvalidateRect(CRect(77, 303, 110, 325));
if(m_Process == SINGLE_PLAY) {
OwnMove = true;
DrawMove();
m_ForeignField.ReceiveMessage(WM_FIRE, 0);
}
return 1;
case WM_WIN_COMP:
m_ForeignField.ReceiveMessage(WM_FINISH, 0);
str.Format("К сожалению ты проиграл. :-(( Твой рейтинг: %d",
m_ForeignField.GetReport());
::AfxMessageBox(str);
m_Process = FUCK;
DrawMove();
break;
case WM_WIN_YOU:
str.Format("Поздаравляю. Ты выйграл. :-))) Твой рейтинг: %d",
m_ForeignField.GetReport());
::AfxMessageBox(str);
m_Process = FUCK;
DrawMove();
if(m_ForeignField.GetReport() <= m_MinResult) break;
MoveOwnWnd(&m_SaveDialog);
m_SaveDialog.ShowWindow(SW_SHOW);
break;
case WM_KILL:
InvalidateRect(CRect(305, 303, 330, 320));
InvalidateRect(CRect(77, 303, 110, 320));
break;
}
return NULL;
}


int CSeaBattleDlg::GenerateNumber(int a) {

CTime t = CTime::GetCurrentTime();
srand(t.GetHour()+t.GetMinute()+t.GetSecond());
return rand()%a;
}


void CSeaBattleDlg::OnMouseMove(UINT nFlags, CPoint point) {

RECT rect;
int x, y;
int cx, cy;

x = point.x;
y = point.y;
cx = GetSystemMetrics(SM_CXSCREEN);
cy = GetSystemMetrics(SM_CXSCREEN);
GetWindowRect(&rect);
if(m_Operation == LBUTTONDOWN) {

rect.left += point.x - MovePoint.x;
rect.right += point.x - MovePoint.x;
rect.top += point.y - MovePoint.y;
rect.bottom += point.y - MovePoint.y;
if(rect.right >= cx-10 && rect.right <= cx+10) {
rect.left = cx - (rect.right - rect.left);
rect.right = cx;
}
if(rect.bottom >= cy-10 && rect.bottom <= cy+10) {
rect.top = cy - (rect.bottom - rect.top);
rect.bottom = cy;
}
if(rect.left <= 10 && rect.left >= -10) {
rect.right -= rect.left;
rect.left = 0;
}
if(rect.top <= 10 && rect.top >= -10) {
rect.bottom -= rect.top;
rect.top = 0;
}
MoveWindow(&rect);
return;
}
/* if(IsButton(point) != B_NONE) {
m_Operation = FINDITEM;
// ::SetCursor(m_cHand);
}
else
if(m_Operation != LBUTTONDOWN) {
m_Operation = FUCK;
// ::SetCursor(m_cDefault);
}*/
CDialog::OnMouseMove(nFlags, point);
}


void CSeaBattleDlg::OnLButtonDown(UINT nFlags, CPoint point) {

int but;
RECT rect;
CDC *dc;

but = IsButton(point);
switch(but) {

case B_TURN:
if(IsTurn) IsTurn = false;
else IsTurn = true;
SetTurn();
break;
case B_HIDE:
CloseWindow();
break;
case B_CLOSE:
DestroyWindow();
break;
case B_RESHIS:
GetClientRect(&rect);
dc = GetDC();
dc->FillRect(CRect(rect.right-150, 83, rect.right, 15+83),
&CBrush(RGB(35, 89, 127)));
dc->SetTextAlign(TA_CENTER);
dc->SetBkColor(RGB(35, 89, 127));
if(m_iButtonState == BS_HISTORY) {

dc->TextOut(rect.right-85, 83, "История игры"); m_Results.ShowWindow(SW_HIDE);
m_MovesBox.ShowWindow(SW_SHOW);
m_iButtonState = BS_RESULTS;

}
else {
dc->TextOut(rect.right-85, 83, "Чемпионы");
m_Results.ShowWindow(SW_SHOW);
m_MovesBox.ShowWindow(SW_HIDE);
m_iButtonState = BS_HISTORY;
}
ReleaseDC(dc);
DrawHisResButton();
break;
default:
m_Operation = LBUTTONDOWN;
SetCapture();
MovePoint = point;
break;
}
CDialog::OnLButtonDown(nFlags, point);
}


void CSeaBattleDlg::OnLButtonUp(UINT nFlags, CPoint point) {

m_Operation = UNDEFINED;
ReleaseCapture();
CDialog::OnLButtonUp(nFlags, point);
}


void CSeaBattleDlg::OnDestroy() {

char buf;
CBitmap *bmp;

SaveFile();
m_ResFile.Close();

if(ServSock) {

SendBroadcast(ENDSERVER);
closesocket(ServSock);
ServSock = 0;
}
if(Sock) {
buf = CLOSECONNECT;
SendData(&buf, 1);
closesocket(Sock);
Sock = 0;
}
Exit();
CDialog::OnDestroy();
bmp = m_FonDC.SelectObject(pOld);
m_FonDC.DeleteDC();
bmp->DeleteObject();
bClose.DeleteObject();
bHide.DeleteObject();
bTnOn.DeleteObject();
bTnOut.DeleteObject();
::DeleteObject(m_Sight);
::DeleteObject(m_cHand);
::DeleteObject(m_cDefault);
}


BOOL CSeaBattleDlg::OnCommand(WPARAM wParam, LPARAM lParam) {

if(wParam == 1 || (wParam == 2 && !lParam)) return 1;
return CDialog::OnCommand(wParam, lParam);
}


BOOL CSeaBattleDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) {

/*
if(m_Operation == FINDITEM) {
::SetCursor(m_cHand);
return 1;
}
else {
::SetCursor(m_cDefault);
return 1;
}
*/
return CDialog::OnSetCursor(pWnd, nHitTest, message);
}


int CSeaBattleDlg::IsButton(POINT point) {

RECT rect;
GetClientRect(&rect);
int x, y;
x = point.x;
y = point.y;
if(x >= rect.right-20 && x <= rect.right && y>=0 && y<=20) return B_CLOSE;
if(x >= rect.right-45 && x <= rect.right-25 && y >= 0 &&
y <= 20) return B_HIDE;
if(x >= rect.right-69 && x <= rect.right-49 && y >= 0 &&
y <= 20) return B_TURN;
if(rect.right > 500 && x >= rect.right - 160 &&
x <= rect.right - 10 && y >= 307 && y <= 327)
return B_RESHIS;
return B_NONE;
}


void CSeaBattleDlg::MoveHelp() {

int w, h;
RECT WndRect, NetRect;

GetWindowRect(&WndRect);
Help.GetWindowRect(&NetRect);
w = NetRect.right-NetRect.left;
h = NetRect.bottom-NetRect.top;
NetRect.left = (WndRect.right-w+WndRect.left)/2;
NetRect.top = (WndRect.bottom-h+WndRect.top)/2;
NetRect.right = (WndRect.right+w+WndRect.left)/2;
NetRect.bottom = (WndRect.bottom+h+WndRect.top)/2;
Help.MoveWindow(&NetRect);

}


void CSeaBattleDlg::MoveNetworkWnd() {

int w, h;
RECT WndRect, NetRect;

GetWindowRect(&WndRect);
NetworkWnd.GetWindowRect(&NetRect);
w = NetRect.right-NetRect.left;
h = NetRect.bottom-NetRect.top;
NetRect.left = (WndRect.right-w+WndRect.left)/2;
NetRect.top = (WndRect.bottom-h+WndRect.top)/2;
NetRect.right = (WndRect.right+w+WndRect.left)/2;
NetRect.bottom = (WndRect.bottom+h+WndRect.top)/2;
NetworkWnd.MoveWindow(&NetRect);

}


void CSeaBattleDlg::NetworkStart() {

if(MultiSock) Exit();
Start();
RefreshList();
}


void CSeaBattleDlg::GetServName(char *name) {

name[0] = 0;
}


void CSeaBattleDlg::RefreshList() {

int c, i;
c = NetworkWnd.m_Servers.GetCount();
if(c)
for(i=0; i NetworkWnd.m_Servers.DeleteString(i);
c = GetCount();
for(i=0; i NetworkWnd.m_Servers.AddString(Data[i].name);
}


void CSeaBattleDlg::DrawMove() {

CDC *dc = GetDC();
CString str;

dc->SetBkMode(TRANSPARENT);
if(OwnMove)
str.Format("Ваш ход");
else {

if(m_Process == SINGLE_PLAY)
str.Format("Ход компа");
if(m_Process == NET_GAME)
str.Format("Ход cоперника");
}
dc->BitBlt(380, 307, 100, 20,
&m_FonDC, 380, 307, SRCCOPY);
if(m_Process == SINGLE_PLAY || m_Process == NET_GAME)
dc->TextOut(380, 307, str);
if(m_Process == FUCK && ServSock && !Sock) {
str.Format("Ожидание соерника");
dc->TextOut(340, 307, str);
}
ReleaseDC(dc);
}


void CSeaBattleDlg::SetBtDown(int but) {

int code;
char buf;
switch(but) {
case B_HELP:
MoveHelp();
Help.ShowWindow(SW_SHOW);
break;
case B_NETWORK:
if(m_OwnField.ReceiveMessage(WM_IS_OK, 0)) {
if(!NetworkWnd.m_hWnd) {
Create(IDD_NETWORK);
Exit();
Start();
TimeOut(3);
}
m_MovesBox.DeleteAllItems();
m_ForeignField.ReceiveMessage(WM_CLEARFIELD, 0);
RefreshList();
MoveNetworkWnd();
NetworkWnd.ShowWindow(SW_SHOW);
}
else {
::AfxMessageBox("Расставьте сначала свои корабли");
m_NetWnd.IsFocus = false;
m_NetWnd.Invalidate();
}
break;
case B_PLACEMENT:
if(ServSock || Sock) {
m_ShipWnd.IsFocus = false;
m_ShipWnd.Invalidate();
if(::AfxMessageBox("Желаете прервать соединение?", MB_YESNO) == IDNO)
return;
}
if(ServSock) {
SendBroadcast(ENDSERVER);
closesocket(ServSock);
ServSock = 0;
}
if(Sock) {
buf = CLOSECONNECT;
SendData(&buf, 1);
closesocket(Sock);
Sock = 0;
}
m_MovesBox.DeleteAllItems();
m_OwnField.ReceiveMessage(WM_PLACEMENT, 0);
m_ForeignField.ReceiveMessage(WM_CLEARFIELD, 0);
InvalidateRect(CRect(335, 300, 355, 345));
InvalidateRect(CRect(105, 300, 130, 345));
m_Process = PLACE;
DrawMove();
break;
case B_SINGLE:
if(ServSock || Sock) {
m_SingleWnd.IsFocus = false;
m_SingleWnd.Invalidate();
if(::AfxMessageBox("Желаете прервать соединение?", MB_YESNO) == IDNO)
return;
}
if(ServSock) {
SendBroadcast(ENDSERVER);
closesocket(ServSock);
ServSock = 0;
}
if(Sock) {
buf = CLOSECONNECT;
SendData(&buf, 1);
closesocket(Sock);
Sock = 0;
}
if(m_OwnField.ReceiveMessage(WM_IS_OK, 0)) {
m_Process = SINGLE_PLAY;
m_ForeignField.m_Operation = NONE;
m_ForeignField.IsNet = m_OwnField.IsNet = false;
code = ::AfxMessageBox("Вы первым начнете???", MB_YESNO);
m_MovesBox.DeleteAllItems();
m_SingleWnd.IsFocus = false;
m_SingleWnd.Invalidate();
if(IDYES == code) m_CompFirstStep = 0;
if(IDNO == code) m_CompFirstStep = 1;
m_ForeignField.ReceiveMessage(WM_COUNT_PLACEMENT, 0);
if(m_CompFirstStep) {
m_OwnField.CompMove();
m_OwnField.Invalidate();
}
m_ForeignField.ReceiveMessage(WM_FIRE, 0);
DrawMove();
ReceiveMessage(WM_INV_STR, 0);
}
else {
::AfxMessageBox("Расставьте сначала свои корабли");
m_SingleWnd.IsFocus = false;
m_SingleWnd.Invalidate();
}
break;
}
}


void CSeaBattleDlg::SetTurn() {

RECT rect;
CDC* dc = GetDC(), tmpDC;
CBitmap *old;

tmpDC.CreateCompatibleDC(dc);
GetWindowRect(&rect);
if(IsTurn) {

rect.right += 150;
MoveWindow(&rect);
m_FonDC.BitBlt(rect.right-rect.left-69-150, 1, 70, 20, &m_FonDC, 0, 0, SRCCOPY);
old = tmpDC.SelectObject(&bClose);
m_FonDC.BitBlt(rect.right-rect.left-21, 1, 20, 20, &tmpDC, 0, 0, SRCCOPY);
tmpDC.SelectObject(&bHide);
m_FonDC.BitBlt(rect.right-rect.left-45, 1, 20, 20, &tmpDC, 0, 0, SRCCOPY);
tmpDC.SelectObject(&bTnOut);
m_FonDC.BitBlt(rect.right-rect.left-69, 1, 20, 20, &tmpDC, 0, 0, SRCCOPY);
InvalidateRect(CRect(rect.right-rect.left-70-150-3, 1, rect.right, 20));
MoveButtons(true);
if(m_iButtonState == BS_RESULTS)
m_MovesBox.ShowWindow(SW_SHOW);
else
m_Results.ShowWindow(SW_SHOW);
DrawHisResButton();
}
else {
rect.right -= 150;
MoveWindow(&rect);
m_FonDC.BitBlt(rect.right-rect.left-69+150, 1, 70, 20, &m_FonDC, 0, 0, SRCCOPY);
old = tmpDC.SelectObject(&bClose);
m_FonDC.BitBlt(rect.right-rect.left-21, 1, 20, 20, &tmpDC, 0, 0, SRCCOPY);
tmpDC.SelectObject(&bHide);
m_FonDC.BitBlt(rect.right-rect.left-45, 1, 20, 20, &tmpDC, 0, 0, SRCCOPY);
tmpDC.SelectObject(&bTnOn);
m_FonDC.BitBlt(rect.right-rect.left-69, 1, 20, 20, &tmpDC, 0, 0, SRCCOPY);
MoveButtons(false);
m_MovesBox.ShowWindow(SW_HIDE);
m_Results.ShowWindow(SW_HIDE);
InvalidateRect(CRect(rect.right-rect.left-69-150, 1, rect.right, 20));
DrawHisResButton(false);
}
tmpDC.SelectObject(old);
tmpDC.DeleteDC();
ReleaseDC(dc);
}


void CSeaBattleDlg::MoveButtons(bool IsTn) {

RECT rect;
int w;

GetClientRect(&rect);
w = rect.right-118-103-112-142;
w = w/3;
if(IsTn) {

m_HelpWnd.MoveWindow(103+112+142+3*w, 20, 118, 58);
m_SingleWnd.MoveWindow(103+w+112+w, 18, 142, 68);
m_NetWnd.MoveWindow(103+w, 20, 112, 65);
}
else {
m_NetWnd.MoveWindow(103+w, 20, 112, 65);
m_SingleWnd.MoveWindow(103+w+112+w, 18, 142, 68);
m_HelpWnd.MoveWindow(103+112+142+3*w, 20, 118, 58);
}
}


void CSeaBattleDlg::DrawHisResButton(bool IsDraw) {

RECT rect;

GetClientRect(&rect);
if(IsDraw) {

m_FonDC.FillRect(CRect(rect.right-170, 307, rect.right, 331),
&CBrush(RGB(35, 89, 127)));
m_FonDC.MoveTo(rect.right - 160, 307);
m_FonDC.LineTo(rect.right - 10, 307);
m_FonDC.LineTo(rect.right - 10, 327);
m_FonDC.LineTo(rect.right - 160, 327);
m_FonDC.LineTo(rect.right - 160, 307);
if(m_iButtonState == BS_RESULTS)
m_FonDC.TextOut(rect.right - 85, 310, "Чемпионы");
else
m_FonDC.TextOut(rect.right - 85, 310, "История игры");
InvalidateRect(CRect(rect.right-170, 307, rect.right, 331));
}
else {
m_FonDC.FillRect(CRect(rect.right-170, 307, rect.right, 331),
&CBrush(RGB(35, 89, 127)));
InvalidateRect(CRect(rect.right-170, 307, rect.right, 331));
}
}


bool CSeaBattleDlg::ReadFile() {

char buf[100], tmp[100];
CString str;
int i, count, curpos, res, numb, digit;
bool IsName;

count = m_ResFile.Read(buf, 100);
if(count < 4) return false;
IsName = true;
curpos = 0;
res = 0;
digit = 0;
for(i=0; i if(IsName) {

if(buf[i] == 11) {
IsName = false; tmp[curpos] = 32;
} else tmp[curpos] = buf[i];
}
else {
if(buf[i] == 11 || buf[i] == 12) {
numb = m_Results.GetItemCount();
tmp[curpos] = 0;
m_Results.InsertItem(numb, tmp);
m_Results.SetItemData(numb, digit);
IsName = true;
curpos = 0;
// if(m_MinResult < digit) m_MinResult = digit;
digit = 0;
if(buf[i] == 12) break;
continue;
}
else {
if(buf[i] == 13)
tmp[curpos] = 48;
else
tmp[curpos] = buf[i]+48;
digit = digit*10 + tmp[curpos]-48;
}
}
curpos++;
}
return true;
}


void CSeaBattleDlg::MoveOwnWnd(CWnd *wnd) {

int w, h;
RECT WndRect, NetRect;

GetWindowRect(&WndRect);
wnd->GetWindowRect(&NetRect);
w = NetRect.right-NetRect.left;
h = NetRect.bottom-NetRect.top;
NetRect.left = (WndRect.right-w+WndRect.left)/2;
NetRect.top = (WndRect.bottom-h+WndRect.top)/2;
NetRect.right = (WndRect.right+w+WndRect.left)/2;
NetRect.bottom = (WndRect.bottom+h+WndRect.top)/2;
wnd->MoveWindow(&NetRect);

}


void CSeaBattleDlg::SaveFile() {

int cnt, i, j;
char buf[100];
CString str;
int data;

m_ResFile.SetLength(0);
cnt = m_Results.GetItemCount();
for(i=0; i m_Results.GetItemText(i, 0, buf, 100);
for(j=0; j<100; j++)
if(buf[j] == ' ') break;
buf[j] = 11;
j--;
data = m_Results.GetItemData(i); {

if(data/10)
buf[j+2] = data/10;
else
buf[j+2] = 13;
if(data%10)
buf[j+3] = data%10;
else
buf[j+3] = 13;
}
if(i != cnt-1)
buf[j+4] = 11;
else
buf[j+4] = 12;
buf[j+5] = 0;
m_ResFile.Write(buf, j+5);
}
str.Format(" ");
m_ResFile.Write(str.GetBuffer(str.GetLength()), str.GetLength());
}


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

Hosted by uCoz