/*//////////////////////文件说明//////////////////////////
// //
//文件名: WinProc.cpp //
//功 能: 功能函数的定义和实现 //
//作 者: //
// //
////////////////////////////////////////////////////////*/
#define Timer_ID 1
//########################################################
// 雷区左上角坐标(12,55)
//
#define MAIN_LEFTSTND 12
#define MAIN_TOPSTND 55
#define MAIN_RIGHTSTND 8
#define MAIN_BOTTOMSTND 8
//########################################################
// 功能区左上角坐标(12,12)
//
#define FUN_LEFTPOS 12
#define FUN_TOPPOS 12
#define FUN_RIGHTSTND 8
#define FUN_BOTTOMSTND 12
//########################################################
// 记雷区左上角坐标(12,12)
//
#define COUNT_LEFTPOS 17
#define COUNT_TOPPOS 16
#define COUNT_RIGHTPOS 56
#define COUNT_BOTTOMPOS 39
//########################################################
// 初级、中级、高级
// 行数、列数、雷数
#define BEGINER_COL_NUM 9
#define BEGINER_LN_NUM 9
#define BEGINER_BOMB_NUM 10
#define INTER_COL_NUM 16
#define INTER_LN_NUM 16
#define INTER_BOMB_NUM 40
#define ADVANCED_COL_NUM 30
#define ADVANCED_LN_NUM 16
#define ADVANCED_BOMB_NUM 99
#define MAX_COL_NUM 30
#define MAX_LN_NUM 24
#define MAX_BOMB_NUM 667
#define MIN_COL_NUM 9
#define MIN_LN_NUM 9
#define MIN_BOMB_NUM 10
//########################################################
//雷区图片 16*16 表情图片 24*24
//
#define MINE_BITMAP_WIDTH 16
#define MINE_BITMAP_HEIGHT 16
#define FACE_BITMAP_WIDTH 24
#define FACE_BITMAP_HEIGHT 24
#define NUM_BITMAP_WIDTH 13
#define NUM_BITMAP_HEIGHT 23
//########################################################
//自定义状态标志
//
#define FLAG_ALREADPLAYED 0x0001
#define FLAG_ALREADTIME 0x0002
#define FLAG_COLOR 0x0004
#define FLAG_MARK 0x0008
#define FLAG_SOUND 0x0010
#define FLAG_TIMECOUNT 0x1000
//###############################################################
//定义全局变量
static int max_colum_num=16,max_row_num=16,bomb_num=40,flagState;
#include "windows.h"
#include "resource.h"
/*###########################################################
功能:初始化地图基本信息
参数:窗口句柄、等级、宽、高、雷、标志数、时间计数标志、表情标志
返回值:成功 返回TRUE
###########################################################*/
BOOL IinitializeMapInfo(HWND hWnd,int level,int col,int ln,int bomb,int playFlag,int timeFlag,int faceFlag);
/*###########################################################
//功能:生成随机地图
//参数:窗口句柄
//返回值:
//###########################################################*/
BOOL CreateRandomMap(HWND hWnd);
/*###########################################################
功能:获得当前等级窗口的位置和大小信息
参数:窗口句柄
返回值:区域 左上的坐标(left,top)大小(right,bottom)
###########################################################*/
RECT getLevelWindowSize(HWND hWnd);
/*###########################################################
功能:主窗口的消息处理回调函数
参数:
返回值:
###########################################################*/
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ,hdcMem;
HBITMAP hBitmap ;
static HMENU hMenu;
static HICON hIcon;
static BITMAP bitmap;
static int cxClient, cyClient;
static int time_begin=0,time=0;
static int flagstate=0;
static int mine_colum_num,mine_row_num,max_colum_num=16,max_row_num=16,bomb_num=40;
static int board [16] [ 16 ] = { 0 };
static int facenum=4,bombCount=0;
static HINSTANCE hInstance;
PAINTSTRUCT ps ;
HBRUSH hBrush;
HPEN hPen;
static RECT timer_rect,face_rect,bombnum_rect,rbutton_rect, rcWnd;
int mouse_x,mouse_y;
static int rbuttonflag=0;
switch (message)
{
case WM_CREATE:
hInstance = (( CREATESTRUCT * ) lParam)->hInstance;
hMenu=((LPCREATESTRUCT)lParam)->hMenu;
hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_APPLICATION)) ;
hBitmap = LoadBitmap( hInstance, MAKEINTRESOURCE ( IDB_BOARD_CLR ) );
GetObject ( hBitmap, sizeof ( BITMAP ) , &bitmap );
MoveWindow ( hwnd, MAIN_LEFTSTND, MAIN_TOPSTND, MAIN_LEFTSTND+FUN_RIGHTSTND+MAIN_RIGHTSTND+max_colum_num*bitmap.bmWidth, MAIN_TOPSTND*2+FUN_BOTTOMSTND+max_row_num*bitmap.bmWidth, TRUE );
DeleteObject( hBitmap );
SetTimer (hwnd, Timer_ID, 1000, NULL) ;
return 0 ;
case WM_SIZE:
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
return 0 ;
case WM_COMMAND:
switch(LOWORD(wParam)) {
case IDM_BEGIN: //开始
//初始窗口信息
max_colum_num=INTER_COL_NUM;
max_row_num=INTER_LN_NUM;
bomb_num=INTER_BOMB_NUM;
//生成随机地图
//CreateRandomMap(hWnd);
//刷新窗口
InvalidateRect(hwnd,NULL,TRUE);
break;
case IDM_BEGINNER: //初级
//初始窗口信息
max_colum_num=BEGINER_COL_NUM;
max_row_num=BEGINER_LN_NUM;
bomb_num=BEGINER_BOMB_NUM;
InvalidateRect (hwnd, &bombnum_rect, FALSE) ;
//初始窗口信息得到窗口大小
//rcWnd=getLevelWindowSize(hWnd);
//生成随机地图
//CreateRandomMap(hWnd);
//改变窗口大小
//MoveWindow(hWnd,rcWnd.left,rcWnd.top,rcWnd.right,rcWnd.bottom,TRUE);
//设置等级菜单
//OnCheckLevelMenu(hMenu,LEVEL_BEGINNER);
break;
case IDM_INTERMEDIATE: //中级
max_colum_num=INTER_COL_NUM;
max_row_num=INTER_LN_NUM;
bomb_num=INTER_BOMB_NUM;
InvalidateRect (hwnd, &bombnum_rect, FALSE) ;
break;
case IDM_ADVANCED: //高级
max_colum_num=ADVANCED_COL_NUM;
max_row_num=ADVANCED_LN_NUM;
bomb_num=ADVANCED_BOMB_NUM;
InvalidateRect (hwnd, &bombnum_rect, FALSE) ;
break;
case IDM_COLOR: //设置颜色 flagState & FLAG_COLOR == FLAG_COLOR 为彩色
flagState=(((flagState&0x0004)==FLAG_COLOR)?0:0x0004)+(flagState&0xfffb);
InvalidateRect(hwnd,NULL,TRUE);
break;
}
return 0;
//设置计时器
case WM_TIMER:
if(time_begin)
{ time++;
while( time==1000)
time=0;
InvalidateRect (hwnd, &timer_rect, FALSE) ;//刷新计时器
}
return 0;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
hdcMem = CreateCompatibleDC( hdc );
hPen=(HPEN)GetStockObject(NULL_PEN);
SelectObject(hdc,hPen);
hBrush=CreateSolidBrush(RGB(192,192,192));
SelectObject(hdc,hBrush);
Rectangle(hdc,3,3,rcWnd.right+1,rcWnd.bottom+1);//绘制底层背景
DeleteObject(hBrush);
hBrush=CreateSolidBrush(RGB(8+(flagState&0x0004)*30,8+(flagState&0x0004)*30,8+(flagState&0x0004)*30));
SelectObject(hdc,hBrush);
Rectangle(hdc,MAIN_LEFTSTND+(max_colum_num*MINE_BITMAP_WIDTH-FACE_BITMAP_WIDTH)/2-1,(MAIN_TOPSTND-FACE_BITMAP_HEIGHT)/2-1,MAIN_LEFTSTND+(max_colum_num*MINE_BITMAP_WIDTH-FACE_BITMAP_WIDTH)/2+FACE_BITMAP_WIDTH+2,(MAIN_TOPSTND-FACE_BITMAP_HEIGHT)/2+FACE_BITMAP_HEIGHT+2); //绘制表情背景
DeleteObject(hBrush);
DeleteObject(hPen);
hPen=CreatePen(PS_SOLID,0,RGB(250,250,250));
SelectObject(hdc,hPen);
MoveToEx(hdc,MAIN_LEFTSTND-2 ,MAIN_RIGHTSTND ,NULL);
LineTo(hdc,cxClient-MAIN_RIGHTSTND,MAIN_RIGHTSTND); //右上
LineTo(hdc,cxClient-MAIN_RIGHTSTND,MAIN_TOPSTND-MAIN_BOTTOMSTND);//右下
LineTo(hdc,MAIN_LEFTSTND-2,MAIN_TOPSTND-MAIN_BOTTOMSTND);//左下
LineTo(hdc,MAIN_LEFTSTND-2,MAIN_RIGHTSTND);
DeleteObject(hPen);
////雷区贴图
hBitmap = LoadBitmap( hInstance, MAKEINTRESOURCE ( IDB_BOARD_CLR ) );
GetObject ( hBitmap, sizeof ( BITMAP ) , &bitmap );
SelectObject ( hdcMem,hBitmap );
for ( mine_colum_num=0;mine_colum_num<max_colum_num;mine_colum_num++ )
{
for (mine_row_num=0;mine_row_num<max_row_num;mine_row_num++ )
{
BitBlt( hdc, MAIN_LEFTSTND+mine_colum_num*bitmap.bm