?? tictac2.c
字號:
//----------------------------------------------------------------------
// DoInitMenuPopMain - Process WM_INITMENUPOPUP message for window.
//
LRESULT DoInitMenuPopMain (HWND hWnd, UINT wMsg, WPARAM wParam,
LPARAM lParam) {
HMENU hMenu;
hMenu = CommandBar_GetMenu (GetDlgItem (hWnd, IDC_CMDBAR), 0);
if (bLastMove == -1)
EnableMenuItem (hMenu, IDM_UNDO, MF_BYCOMMAND | MF_GRAYED);
else
EnableMenuItem (hMenu, IDM_UNDO, MF_BYCOMMAND | MF_ENABLED);
return 0;
}
//----------------------------------------------------------------------
// DoCommandMain - Process WM_COMMAND message for window.
//
//
LRESULT DoCommandMain (HWND hWnd, UINT wMsg, WPARAM wParam,
LPARAM lParam) {
WORD idItem, wNotifyCode;
HWND hwndCtl;
INT i;
// Parse the parameters.
idItem = (WORD) LOWORD (wParam);
wNotifyCode = (WORD) HIWORD(wParam);
hwndCtl = (HWND) lParam;
// Call routine to handle control message.
for (i = 0; i < dim(MainCommandItems); i++) {
if (idItem == MainCommandItems[i].Code)
return (*MainCommandItems[i].Fxn)(hWnd, idItem, hwndCtl,
wNotifyCode);
}
return 0;
}
//----------------------------------------------------------------------
// DoLButtonUpMain - Process WM_LBUTTONUP message for window.
//
LRESULT DoLButtonUpMain (HWND hWnd, UINT wMsg, WPARAM wParam,
LPARAM lParam) {
POINT pt;
INT cx, cy, nCell = 0;
pt.x = LOWORD (lParam);
pt.y = HIWORD (lParam);
// See if pen on board. If so, determine which cell.
if (PtInRect (&rectBoard, pt)){
// Normalize point to upper left corner of board.
pt.x -= rectBoard.left;
pt.y -= rectBoard.top;
// Compute size of each cell.
cx = (rectBoard.right - rectBoard.left)/3;
cy = (rectBoard.bottom - rectBoard.top)/3;
// Find column.
nCell = (pt.x / cx);
// Find row.
nCell += (pt.y / cy) * 3;
// If cell empty, fill it with mark.
if (bBoard[nCell] == 0) {
if (bTurn) {
bBoard[nCell] = 2;
bTurn = 0;
} else {
bBoard[nCell] = 1;
bTurn = 1;
}
// Save the cell for the undo command.
bLastMove = nCell;
// Force the screen to be repainted.
InvalidateRect (hWnd, NULL, FALSE);
} else {
// Inform the user of the filled cell.
MessageBeep (0);
return 0;
}
}
return 0;
}
//----------------------------------------------------------------------
// DoDestroyMain - Process WM_DESTROY message for window.
//
LRESULT DoDestroyMain (HWND hWnd, UINT wMsg, WPARAM wParam,
LPARAM lParam) {
PostQuitMessage (0);
return 0;
}
//======================================================================
// Command handler routines
//
//----------------------------------------------------------------------
// DoMainCommandNewGame - Process New Game command.
//
LPARAM DoMainCommandNewGame (HWND hWnd, WORD idItem, HWND hwndCtl,
WORD wNotifyCode) {
INT i, j = 0, rc;
// Count the number of used spaces.
for (i = 0; i < 9; i++)
if (bBoard[i])
j++;
// If not new game or complete game, ask user before clearing.
if (j && (j != 9)) {
rc = MessageBox (hWnd,
TEXT ("Are you sure you want to clear the board?"),
TEXT ("New Game"), MB_YESNO | MB_ICONQUESTION);
if (rc == IDNO)
return 0;
}
ResetGame ();
InvalidateRect (hWnd, NULL, TRUE);
return 0;
}
//----------------------------------------------------------------------
// DoMainCommandUndo - Process Undo Last Move command.
//
LPARAM DoMainCommandUndo (HWND hWnd, WORD idItem, HWND hwndCtl,
WORD wNotifyCode) {
if (bLastMove != -1) {
bBoard[bLastMove] = 0;
if (bTurn) {
bTurn = 0;
} else {
bTurn = 1;
}
// Only one level of undo
bLastMove = -1;
InvalidateRect (hWnd, NULL, TRUE);
}
return 0;
}
//----------------------------------------------------------------------
// DoMainCommandExit - Process Program Exit command.
//
LPARAM DoMainCommandExit (HWND hWnd, WORD idItem, HWND hwndCtl,
WORD wNotifyCode) {
SendMessage (hWnd, WM_CLOSE, 0, 0);
return 0;
}
//======================================================================
// Game-specific routines
//
//----------------------------------------------------------------------
// ResetGame - Initialize the structures for a game.
//
void ResetGame (void) {
INT i;
// Initialize the board.
for (i = 0; i < dim(bBoard); i++)
bBoard[i] = 0;
bTurn = 0;
bLastMove = -1;
return;
}
//----------------------------------------------------------------------
// DrawXO - Draw a single X or O in a square.
//
void DrawXO (HDC hdc, HPEN hPen, RECT *prect, INT nCell, INT nType) {
POINT pt[2];
INT cx, cy;
RECT rect;
cx = (prect->right - prect->left)/3;
cy = (prect->bottom - prect->top)/3;
// Compute the dimensions of the target cell.
rect.left = (cx * (nCell % 3) + prect->left) + 10;
rect.right = rect.left + cx - 20,
rect.top = cy * (nCell / 3) + prect->top + 10,
rect.bottom = rect.top + cy - 20;
// Draw an X?
if (nType == 1) {
pt[0].x = rect.left;
pt[0].y = rect.top;
pt[1].x = rect.right;
pt[1].y = rect.bottom;
Polyline (hdc, pt, 2);
pt[0].x = rect.right;
pt[1].x = rect.left;
Polyline (hdc, pt, 2);
// How about an O?
} else if (nType == 2) {
Ellipse (hdc, rect.left, rect.top, rect.right, rect.bottom);
}
return;
}
//----------------------------------------------------------------------
// DrawBoard - Draw the tic-tac-toe board.
//
void DrawBoard (HDC hdc, RECT *prect) {
HPEN hPen, hOldPen;
POINT pt[2];
LOGPEN lp;
INT i, cx, cy;
// Create a nice thick pen.
lp.lopnStyle = PS_SOLID;
lp.lopnWidth.x = 5;
lp.lopnWidth.y = 5;
lp.lopnColor = RGB (0, 0, 0);
hPen = CreatePenIndirect (&lp);
hOldPen = SelectObject (hdc, hPen);
cx = (prect->right - prect->left)/3;
cy = (prect->bottom - prect->top)/3;
// Draw lines down.
pt[0].x = cx + prect->left;
pt[1].x = cx + prect->left;
pt[0].y = prect->top;
pt[1].y = prect->bottom;
Polyline (hdc, pt, 2);
pt[0].x += cx;
pt[1].x += cx;
Polyline (hdc, pt, 2);
// Draw lines across.
pt[0].x = prect->left;
pt[1].x = prect->right;
pt[0].y = cy + prect->top;
pt[1].y = cy + prect->top;
Polyline (hdc, pt, 2);
pt[0].y += cy;
pt[1].y += cy;
Polyline (hdc, pt, 2);
// Fill in Xs and Os.
for (i = 0; i < dim (bBoard); i++)
DrawXO (hdc, hPen, &rectBoard, i, bBoard[i]);
SelectObject (hdc, hOldPen);
DeleteObject (hPen);
return;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -