5 in rows (win32gui)
Zaključano
Zakačeno
Napravio sam polje 10x10.
Uspio sam napravit da mi prozore boji prilikom klikanja na crvenu/plavu boju (naizmjenicno), ali nisam uspio rjesit da mi "zastiti" polje koje obojeno. Dakle kad kliknem na neko polje koje je obojeno npr u crveno promjeni mu boju u plavu ili bijelu koja je default boja.
Uspio sam napravit da mi prozore boji prilikom klikanja na crvenu/plavu boju (naizmjenicno), ali nisam uspio rjesit da mi "zastiti" polje koje obojeno. Dakle kad kliknem na neko polje koje je obojeno npr u crveno promjeni mu boju u plavu ili bijelu koja je default boja.
Code:
//5 in a Row
#include <windows.h>
#define BR 10
LRESULT CALLBACK WndOtac (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndDijete (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndOtac;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = "Otac";
RegisterClass (&wc);
wc.lpfnWndProc = WndDijete;
wc.cbWndExtra = sizeof (long);
wc.hIcon = NULL;
wc.lpszClassName = "Dijete";
RegisterClass (&wc);
hwnd = CreateWindow ("Otac", // ime windows klase
"5 in a Row", // tekst u Window title bar-u
WS_OVERLAPPEDWINDOW, // stil prozora
112, // inicijalna x koordinata
84, // inicijalna y koordinata
800, // inicijalna sirina prozora
600, // inicijalna visina prozora
NULL, // handle na vlasnika (parent) prozora
NULL, // window menu handle
hInstance, // handle na instancu aplikacije
NULL); // dodatni kreacioni parametri
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndOtac (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND djeca [BR];
int i, j, cx, cy;
switch (message)
{
case WM_CREATE:
for (i = 0; i < BR * BR; i++) // kreiranje zadatog broja prozora
{
djeca [i] = CreateWindow ("Dijete", NULL, WS_CHILD | WS_VISIBLE,
0, 0, 0, 0, hwnd, NULL,
(HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL);
}
case WM_SIZE:
cx = LOWORD (lParam) / (1.25 * BR);
cy = HIWORD (lParam) / (1.25 * BR);
for (i = 0; i < BR; i++) // pomjeranje i skaliranje svih prozora radi dobijanja polja
{
for (j = 0; j < BR; j++)
MoveWindow (djeca [i * BR + j], i * cx + 1.25 * cx, j * cy + 1.50 * cy,
cx, cy, TRUE);
}
return 0;
case WM_DESTROY:
PostQuitMessage (0);
return 0;
}
return DefWindowProc (hwnd, message, wParam, lParam);
}
LRESULT CALLBACK WndDijete(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
HBRUSH brush;
static BOOL fFlipFlop = FALSE;
switch (message)
{
case WM_CREATE:
SetWindowLong (hwnd, 0, 0);
return 0;
case WM_LBUTTONDOWN:
SetWindowLong (hwnd, 0, !GetWindowLong (hwnd, 0));
InvalidateRect (hwnd, NULL, FALSE);
return 0;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps);
GetClientRect (hwnd, &rect);
Rectangle (hdc, 0, 0, rect.right, rect.bottom);
brush = CreateSolidBrush (fFlipFlop ? RGB (255, 0, 0) : RGB(0, 0, 255));
if (!GetWindowLong (hwnd, 0)) // aktivacija dvije boje naizmjenicno
{
fFlipFlop = !fFlipFlop;
FillRect (hdc, &rect, brush);
}
EndPaint (hwnd, &ps);
DeleteObject (brush);
return 0;
}
return DefWindowProc (hwnd, message, wParam, lParam);
}
//5 in a Row
#include <windows.h>
#define BR 10
LRESULT CALLBACK WndOtac (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndDijete (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndOtac;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = "Otac";
RegisterClass (&wc);
wc.lpfnWndProc = WndDijete;
wc.cbWndExtra = sizeof (long);
wc.hIcon = NULL;
wc.lpszClassName = "Dijete";
RegisterClass (&wc);
hwnd = CreateWindow ("Otac", // ime windows klase
"5 in a Row", // tekst u Window title bar-u
WS_OVERLAPPEDWINDOW, // stil prozora
112, // inicijalna x koordinata
84, // inicijalna y koordinata
800, // inicijalna sirina prozora
600, // inicijalna visina prozora
NULL, // handle na vlasnika (parent) prozora
NULL, // window menu handle
hInstance, // handle na instancu aplikacije
NULL); // dodatni kreacioni parametri
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndOtac (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND djeca [BR];
int i, j, cx, cy;
switch (message)
{
case WM_CREATE:
for (i = 0; i < BR * BR; i++) // kreiranje zadatog broja prozora
{
djeca [i] = CreateWindow ("Dijete", NULL, WS_CHILD | WS_VISIBLE,
0, 0, 0, 0, hwnd, NULL,
(HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL);
}
case WM_SIZE:
cx = LOWORD (lParam) / (1.25 * BR);
cy = HIWORD (lParam) / (1.25 * BR);
for (i = 0; i < BR; i++) // pomjeranje i skaliranje svih prozora radi dobijanja polja
{
for (j = 0; j < BR; j++)
MoveWindow (djeca [i * BR + j], i * cx + 1.25 * cx, j * cy + 1.50 * cy,
cx, cy, TRUE);
}
return 0;
case WM_DESTROY:
PostQuitMessage (0);
return 0;
}
return DefWindowProc (hwnd, message, wParam, lParam);
}
LRESULT CALLBACK WndDijete(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
HBRUSH brush;
static BOOL fFlipFlop = FALSE;
switch (message)
{
case WM_CREATE:
SetWindowLong (hwnd, 0, 0);
return 0;
case WM_LBUTTONDOWN:
SetWindowLong (hwnd, 0, !GetWindowLong (hwnd, 0));
InvalidateRect (hwnd, NULL, FALSE);
return 0;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps);
GetClientRect (hwnd, &rect);
Rectangle (hdc, 0, 0, rect.right, rect.bottom);
brush = CreateSolidBrush (fFlipFlop ? RGB (255, 0, 0) : RGB(0, 0, 255));
if (!GetWindowLong (hwnd, 0)) // aktivacija dvije boje naizmjenicno
{
fFlipFlop = !fFlipFlop;
FillRect (hdc, &rect, brush);
}
EndPaint (hwnd, &ps);
DeleteObject (brush);
return 0;
}
return DefWindowProc (hwnd, message, wParam, lParam);
}
Ovaj bFlipFlop mi je totalno sumnjiv. Obrati pažnju da se WM_PAINT okida na svakojake događaje. Pomeri pola prozora izvan ekrana, pa ga polako vraćaj nazad u ekran. Ako se ne varam zbog ove flip-flop logike deca koja su na ivici ekrana će početi da menjaju boje. Taj flip-flop treba da se flipuje u WM_LBUTTONDOWN a ne u WM_PAINT, i to ne uvek nego pod uslovom da je GetWindowLong 0 (jer to znači da je polje slobodno). Zapravo sve u WM_LBUTTONDOWN se radi isključivo ako je GetWindowLong == 0, inače klik treba da se ignoriše.
Dodatni problemi: U WndOtac napravio si niz static HWND djeca [ BR], ali treba zapravo BR * BR. Bezrazložno opterećenje s resursima: u detetovom WM_PAINT stalno kreiraš brush koji odmah tu i brišeš, a bolje je da na početku napraviš oba brusha koja ti trebaju i samo ih biraš po potrebi.
Dodatni problemi: U WndOtac napravio si niz static HWND djeca [ BR], ali treba zapravo BR * BR. Bezrazložno opterećenje s resursima: u detetovom WM_PAINT stalno kreiraš brush koji odmah tu i brišeš, a bolje je da na početku napraviš oba brusha koja ti trebaju i samo ih biraš po potrebi.
Poz,
Evo promjenili smo pristup i ne radimo vise preko childova, jer smo ograniceni sa vremenom, a i nemamo dovoljno znanja ni iskustva.
Mozes pogledat ovaj kod kojim smo rjesili precrtavanje, al smo zapeli kod funkcije za pobjedu. Svaka pomoc nam je dobrodošla!
Evo promjenili smo pristup i ne radimo vise preko childova, jer smo ograniceni sa vremenom, a i nemamo dovoljno znanja ni iskustva.
Mozes pogledat ovaj kod kojim smo rjesili precrtavanje, al smo zapeli kod funkcije za pobjedu. Svaka pomoc nam je dobrodošla!
Code:
//5 in a Row v 0.1
#include <windows.h>
#define BR 15
enum Marker {blank, X, O};
HINSTANCE hInst;
Marker Turn = X;
Marker MBoard [15][15] = {{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank}};
const int sqSize = 30;
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
void DBoard (HDC);
void CrtajX (HDC, int, int);
void CrtajO (HDC, int, int);
bool PostaviX (LPARAM);
bool PostaviO (LPARAM);
bool Win ();
bool Full ();
bool Reset ();
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = "Class";
RegisterClass (&wc);
hwnd = CreateWindow ("Class", // ime windows klase
"5 in a Row", // tekst u Window title bar-u
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX,
112, // inicijalna x koordinata
84, // inicijalna y koordinata
800, // inicijalna sirina prozora
600, // inicijalna visina prozora
NULL, // handle na vlasnika (parent) prozora
NULL, // window menu handle
hInstance, // handle na instancu aplikacije
NULL); // dodatni kreacioni parametri
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
/*void DBoard (HDC hdc)
{
HPEN Pen1;
HPEN Pen2;
COLORREF LineColor;
int iX, iY;
LineColor = RGB (0, 0, 0);
Pen2 = CreatePen (PS_SOLID, 2, LineColor);
Pen1 = (HPEN) SelectObject (hdc, Pen2);
for (iX = sqSize; iX < 15 * sqSize; iX += sqSize)
{
MoveToEx (hdc, 176 + iX, 81, NULL);
LineTo (hdc, 176 + iX, 81 + (15 * sqSize));
}
for (iY = sqSize; iY < 15 * sqSize; iY += sqSize)
{
MoveToEx (hdc, 176, 81 + iY, NULL);
LineTo (hdc, 176 + (15 * sqSize), 81 + iY);
}
SelectObject (hdc, Pen1);
DeleteObject (Pen2);
}*/
void DBoard (HDC hdc)
{
HPEN Pen1;
HPEN Pen2;
COLORREF LineColor;
int iX, iY;
LineColor = RGB (0, 0, 0);
Pen2 = CreatePen (PS_SOLID, 2, LineColor);
Pen1 = (HPEN) SelectObject (hdc, Pen2);
for (iX = sqSize; iX < 16 * sqSize; iX += sqSize)
{
MoveToEx (hdc, iX, 0, NULL);
LineTo (hdc, iX, 15 * sqSize);
}
for (iY = sqSize; iY < 16 * sqSize; iY += sqSize)
{
MoveToEx (hdc, 0, iY, NULL);
LineTo (hdc, 15 * sqSize, iY);
}
SelectObject (hdc, Pen1);
DeleteObject (Pen2);
}
void CrtajX (HDC hdc, int iX, int iY)
{
HPEN Pen1;
HPEN Pen2;
COLORREF LineColor;
const int SirinaP = 2;
const int PocX = iX * sqSize + 2 * SirinaP;
const int KrajX = (iX + 1) * sqSize - 2 * SirinaP;
const int PocY = iY * sqSize + 2 * SirinaP;
const int KrajY = (iY + 1) * sqSize - 2 * SirinaP;
LineColor = RGB (255, 0, 0);
Pen2 = CreatePen (PS_SOLID, SirinaP, LineColor);
Pen1 = (HPEN) SelectObject (hdc, Pen2);
MoveToEx (hdc, PocX, PocY, NULL);
LineTo (hdc, KrajX, KrajY);
MoveToEx (hdc, PocX, KrajY, NULL);
LineTo (hdc, KrajX, PocY);
SelectObject (hdc, Pen1);
DeleteObject (Pen2);
}
void CrtajO (HDC hdc, int iX, int iY)
{
HPEN Pen1;
HPEN Pen2;
COLORREF LineColor;
const int SirinaP = 2;
const int PocX = iX * sqSize + 2 * SirinaP;
const int KrajX = (iX + 1) * sqSize - 2 * SirinaP;
const int PocY = iY * sqSize + 2 * SirinaP;
const int KrajY = (iY + 1) * sqSize - 2 * SirinaP;
LineColor = RGB (0, 0, 255);
Pen2 = CreatePen (PS_SOLID, SirinaP, LineColor);
Pen1 = (HPEN) SelectObject (hdc, Pen2);
Arc (hdc, PocX, PocY, KrajX, KrajY, 0, 0, 0, 0);
SelectObject (hdc, Pen1);
DeleteObject (Pen2);
}
bool PostaviX(LPARAM lParam)
{
int iPozX = LOWORD(lParam);
int iPozY = HIWORD (lParam);
int iKvadratX = (iPozX/sqSize);
int iKvadratY = (iPozY/sqSize);
if((Turn==X)&&(iKvadratX<15)&&(iKvadratY<15)&&(MBoard[iKvadratY][iKvadratX])==blank)
{
MBoard[iKvadratY][iKvadratX]=X;
return true;
}
return false;
}
bool PostaviO(LPARAM lParam)
{
int iPozX = LOWORD(lParam);
int iPozY = HIWORD (lParam);
int iKvadratX = (iPozX/sqSize);
int iKvadratY = (iPozY/sqSize);
if((Turn==O)&&(iKvadratX<15)&&(iKvadratY<15)&&(MBoard[iKvadratY][iKvadratX])==blank)
{
MBoard[iKvadratY][iKvadratX]=O;
return true;
}
return false;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
int iX,iY;
bool Potez;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps);
DBoard (hdc);
for(iX=0 ; iX<15 ; ++iX)
{
for(iY=0 ; iY<15 ; ++iY)
{
if(MBoard[iY][iX]==X)
{
CrtajX(hdc, iX, iY);
}
else if (MBoard[iY][iX]==O)
{
CrtajO(hdc, iX, iY);
}
}
}
return 0;
case WM_DESTROY:
PostQuitMessage (0);
return 0;
case WM_LBUTTONDOWN:
{
bool Potez=PostaviX(lParam);
if(Potez)
{
Turn=O;
}
InvalidateRect(hwnd, 0, TRUE);
break;
}
case WM_RBUTTONDOWN:
{
bool Potez=PostaviO(lParam);
if(Potez)
{
Turn=X;
}
InvalidateRect(hwnd, 0, TRUE);
break;
}
}
return DefWindowProc (hwnd, message, wParam, lParam);
}
//5 in a Row v 0.1
#include <windows.h>
#define BR 15
enum Marker {blank, X, O};
HINSTANCE hInst;
Marker Turn = X;
Marker MBoard [15][15] = {{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank},
{blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank, blank ,blank ,blank}};
const int sqSize = 30;
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
void DBoard (HDC);
void CrtajX (HDC, int, int);
void CrtajO (HDC, int, int);
bool PostaviX (LPARAM);
bool PostaviO (LPARAM);
bool Win ();
bool Full ();
bool Reset ();
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = "Class";
RegisterClass (&wc);
hwnd = CreateWindow ("Class", // ime windows klase
"5 in a Row", // tekst u Window title bar-u
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX,
112, // inicijalna x koordinata
84, // inicijalna y koordinata
800, // inicijalna sirina prozora
600, // inicijalna visina prozora
NULL, // handle na vlasnika (parent) prozora
NULL, // window menu handle
hInstance, // handle na instancu aplikacije
NULL); // dodatni kreacioni parametri
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
/*void DBoard (HDC hdc)
{
HPEN Pen1;
HPEN Pen2;
COLORREF LineColor;
int iX, iY;
LineColor = RGB (0, 0, 0);
Pen2 = CreatePen (PS_SOLID, 2, LineColor);
Pen1 = (HPEN) SelectObject (hdc, Pen2);
for (iX = sqSize; iX < 15 * sqSize; iX += sqSize)
{
MoveToEx (hdc, 176 + iX, 81, NULL);
LineTo (hdc, 176 + iX, 81 + (15 * sqSize));
}
for (iY = sqSize; iY < 15 * sqSize; iY += sqSize)
{
MoveToEx (hdc, 176, 81 + iY, NULL);
LineTo (hdc, 176 + (15 * sqSize), 81 + iY);
}
SelectObject (hdc, Pen1);
DeleteObject (Pen2);
}*/
void DBoard (HDC hdc)
{
HPEN Pen1;
HPEN Pen2;
COLORREF LineColor;
int iX, iY;
LineColor = RGB (0, 0, 0);
Pen2 = CreatePen (PS_SOLID, 2, LineColor);
Pen1 = (HPEN) SelectObject (hdc, Pen2);
for (iX = sqSize; iX < 16 * sqSize; iX += sqSize)
{
MoveToEx (hdc, iX, 0, NULL);
LineTo (hdc, iX, 15 * sqSize);
}
for (iY = sqSize; iY < 16 * sqSize; iY += sqSize)
{
MoveToEx (hdc, 0, iY, NULL);
LineTo (hdc, 15 * sqSize, iY);
}
SelectObject (hdc, Pen1);
DeleteObject (Pen2);
}
void CrtajX (HDC hdc, int iX, int iY)
{
HPEN Pen1;
HPEN Pen2;
COLORREF LineColor;
const int SirinaP = 2;
const int PocX = iX * sqSize + 2 * SirinaP;
const int KrajX = (iX + 1) * sqSize - 2 * SirinaP;
const int PocY = iY * sqSize + 2 * SirinaP;
const int KrajY = (iY + 1) * sqSize - 2 * SirinaP;
LineColor = RGB (255, 0, 0);
Pen2 = CreatePen (PS_SOLID, SirinaP, LineColor);
Pen1 = (HPEN) SelectObject (hdc, Pen2);
MoveToEx (hdc, PocX, PocY, NULL);
LineTo (hdc, KrajX, KrajY);
MoveToEx (hdc, PocX, KrajY, NULL);
LineTo (hdc, KrajX, PocY);
SelectObject (hdc, Pen1);
DeleteObject (Pen2);
}
void CrtajO (HDC hdc, int iX, int iY)
{
HPEN Pen1;
HPEN Pen2;
COLORREF LineColor;
const int SirinaP = 2;
const int PocX = iX * sqSize + 2 * SirinaP;
const int KrajX = (iX + 1) * sqSize - 2 * SirinaP;
const int PocY = iY * sqSize + 2 * SirinaP;
const int KrajY = (iY + 1) * sqSize - 2 * SirinaP;
LineColor = RGB (0, 0, 255);
Pen2 = CreatePen (PS_SOLID, SirinaP, LineColor);
Pen1 = (HPEN) SelectObject (hdc, Pen2);
Arc (hdc, PocX, PocY, KrajX, KrajY, 0, 0, 0, 0);
SelectObject (hdc, Pen1);
DeleteObject (Pen2);
}
bool PostaviX(LPARAM lParam)
{
int iPozX = LOWORD(lParam);
int iPozY = HIWORD (lParam);
int iKvadratX = (iPozX/sqSize);
int iKvadratY = (iPozY/sqSize);
if((Turn==X)&&(iKvadratX<15)&&(iKvadratY<15)&&(MBoard[iKvadratY][iKvadratX])==blank)
{
MBoard[iKvadratY][iKvadratX]=X;
return true;
}
return false;
}
bool PostaviO(LPARAM lParam)
{
int iPozX = LOWORD(lParam);
int iPozY = HIWORD (lParam);
int iKvadratX = (iPozX/sqSize);
int iKvadratY = (iPozY/sqSize);
if((Turn==O)&&(iKvadratX<15)&&(iKvadratY<15)&&(MBoard[iKvadratY][iKvadratX])==blank)
{
MBoard[iKvadratY][iKvadratX]=O;
return true;
}
return false;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
int iX,iY;
bool Potez;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps);
DBoard (hdc);
for(iX=0 ; iX<15 ; ++iX)
{
for(iY=0 ; iY<15 ; ++iY)
{
if(MBoard[iY][iX]==X)
{
CrtajX(hdc, iX, iY);
}
else if (MBoard[iY][iX]==O)
{
CrtajO(hdc, iX, iY);
}
}
}
return 0;
case WM_DESTROY:
PostQuitMessage (0);
return 0;
case WM_LBUTTONDOWN:
{
bool Potez=PostaviX(lParam);
if(Potez)
{
Turn=O;
}
InvalidateRect(hwnd, 0, TRUE);
break;
}
case WM_RBUTTONDOWN:
{
bool Potez=PostaviO(lParam);
if(Potez)
{
Turn=X;
}
InvalidateRect(hwnd, 0, TRUE);
break;
}
}
return DefWindowProc (hwnd, message, wParam, lParam);
}