PostMessage
I wasn't sure if this was the approprite newsgroup to post in; but I wasn't
sure what other newsgroup to post in.
I'm new to programming Windows in C++ without MFC. I wrote a Tic-Tac-Toe
game. To take turns; I set up a user-defined message. I used PostMessage to
try to send the user-defined message; but WinProc doesn't recieve it; and
I'm not sure why... The code is pretty long; so I'll show the 3 files...
---------------------------------
[defs.h] - Header that I include in most of the modules
////////////////////////////////////////////////////////////////////////////////////////
// Tic-Tac-Toe
// (c) Copyright 2006 Edward Principe
// All Rights Reserved
// ***
// This program is liscenced under GPL
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// defs.h - Common header files and misc.
////////////////////////////////////////////////////////////////////////////////////////
#ifndef DEFS_H
#define DEFS_H
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <windowsx.h>
// .. Other common header files
// Defines
#define WM_TURN WM_USER + 1
#define WM_WIN WM_USER + 2
#define WM_TIE WM_USER + 3
#endif
[tictactoe.cpp - Where WinMain, WinProc, and some misc. functions]
/////////////////////////////////////////////////////////////////////////////////////////
// WinProc: Where messages from Windows is interpreted
/////////////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
HDC hdc; // Device context for GDI
PAINTSTRUCT ps; // Paint structure
RECT rect; // Client rectangle
static HINSTANCE hInstance; // The programs instance
static bool isGameStarted = false; // True if game is in progress
HMENU hmenu; // Handle to the menu
static Play *game; // The tic-tac toe game
int x, y;
// Process messages
switch(msg)
{
case WM_CREATE:
// Get the programs instance
hInstance = ((LPCREATESTRUCT) lparam)->hInstance;
// Allocate player structure
g_player = new Player;
if(g_player == NULL)
{
MessageBox(hwnd, TEXT("Out of Memory"), TEXT("FATAL ERROR"),
MB_ICONERROR);
SendMessage(hwnd, WM_CLOSE, 0, 0);
}
// Initilize player object
game = new Play;
if(game == NULL)
{
MessageBox(hwnd, TEXT("Out of memory"), TEXT("FATAL ERROR"),
MB_ICONERROR);
SendMessage(hwnd, WM_CLOSE, 0, 0);
}
// Initialize game object
game->Init(hInstance, hwnd);
// Get client rect
GetClientRect(hwnd, &rect);
game->SetClientRect(rect);
return 0;
// Other messages deleted for briefity
case WM_LBUTTONDOWN:
x = LOWORD(lparam);
y = HIWORD(lparam);
// Set DC
hdc = GetDC(hwnd);
game->SetDC(hdc);
// Check to see to place an X or an O
game->IsHit(hwnd, x,y);
// Release the DC
ReleaseDC(hwnd, hdc);
return 0;
case WM_TURN:
// Get DC
hdc = GetDC(hwnd);
// Print players turn
PrintTurn(hwnd, hdc, wparam);
// Set games DC
game->SetDC(hdc);
// Release DC
ReleaseDC(hwnd, hdc);
return 0;
}
}
[play.cpp --- The main game logic -- AI not implimented yet ----]
//////////////////////////////////////////////////////////////////
// Turn: Called when player takes a turn
//////////////////////////////////////////////////////////////////
void Play::Turn(HWND hwnd)
{
// Return is game hasn't started
if(!_is_started || _player == NULL)
return;
// Check for a win and a tie
if(CheckWin())
{
PostMessage(hwnd, WM_WIN, _turn == PLAYER1 ? 1 : 2, 0);
return;
}
if(CheckTie())
{
PostMessage(hwnd, WM_TIE, 0, 0);
return;
}
// Switch turn
_turn = _turn == PLAYER1 ? PLAYER2 : PLAYER1;
// If computers turn then generate message
switch(_turn)
{
case PLAYER1:
if(_player->player1 == PT_COMPUTER)
PostMessage(hwnd, WM_TURN, _turn == PLAYER1 ? 1 : 2, 0);
break;
case PLAYER2:
if(_player->player2 == PT_COMPUTER)
PostMessage(hwnd, WM_TURN, _turn == PLAYER1 ? 1 : 2 ,0);
break;
}
}
/////////////////////////////////////////////////////////////
// IsHit: Test to see if to place an X or O
/////////////////////////////////////////////////////////////
bool Play::IsHit(HWND hwnd, int x, int y)
{
// [Logic deleted; but the function gets called]
// Generate turn message
PostMessage(hwnd, WM_TURN, _turn == PLAYER1 ? 2 : 1, 0);
return true;
}