/*
*/
#include <windows.h>
#include <commctrl.h>
#include <mmsystem.h>
#include <stdio.h>
#include "Resource.h"
#include "GoBoard.h"
#include "sgfSupport.h"
//定时器间隔
#define TIMER_TIME 200
//左边面板占用客户区宽度的百分率(为了好看棋盘放在屏幕靠左部)
//涉及改动:RefreshBoardSizeData 中棋盘线左上角坐标、线距, OnPaint 中棋盘图片位置
#define LeftWndPercent 70
//盘面状态:下棋,打谱,点目
typedef enum tag_boardMode
{
GAME = 1, //对弈
STUDY = 2, //打谱
TRY = 4, //试下
EXAM = 8, //点目
} BOARDMODE;
//装载图片文件 s,返回其句柄
#define LoadbmpFile(s) (LoadImage(NULL, s, IMAGE_BITMAP,0,0,LR_LOADFROMFILE))
//将资源中 ID 字符串读入 sz
#define LoadszRes(ID, sz) (LoadString(g_hInstance, ID, sz, sizeof(sz)))
//状态栏第 i 格显示文字 s
#define SetStatusbarText(i, s) (SendMessage(g_hwndStatusbar, SB_SETTEXT, (WPARAM)(i-1), (LPARAM)s))
//判断 h菜单 的 ID项 是否有对勾
#define IsMenuItemChecked(h, id) ((GetMenuState(h, id, MF_BYCOMMAND) & MF_CHECKED) == MF_CHECKED)
//判断 工具栏h 的 ID按钮 是否按下
#define IsToolBtnPressed(h, id) ((SendMessage(h, TB_GETSTATE, id, 0) & TBSTATE_CHECKED) == TBSTATE_CHECKED)
//申明响应消息处理函数
LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);
void OnCreate(HWND);
void OnTimer(HWND);
void OnSize(HWND, UINT, WPARAM, LPARAM);
void OnPaint(HWND, HDC, int, int);
void OnNotify(LPARAM);
void OnDestroy(void);
void OnLButtonUp(HWND, LPARAM);
void OnMouseMove(LPARAM);
void OnMenuSet(HWND, UINT);
void OnSpecialLastStone(HWND, UINT);
void OnRestract(HWND);
void OnFileSaveAsSGF(HWND);
void OnFileSaveAsBMP(HWND);
void OnFileOpen(HWND);
void OnGameNew(HWND);
void OnGameTry(HWND, UINT);
void OnGameExam(HWND, UINT);
void OnAbout(HWND);
void OnFirstNext(HWND, UINT);
void DrawBoardLine(HDC, POINT, int, int);
void ShowBoarCoordinate(HDC, POINT, int, int);
void ShowStone(HDC, POINT, int, int, STONEDATA *, BOOL, HDC, int, int, COLORREF);
void DrawStone(HDC, POINT, int, int, STONEDATA *, BOOL);
void DrawDiamond(HDC, POINT, int, int, STONECOLOR *s);
void ShowStoneNumber(HDC, POINT, int, int, STONEDATA *, BOOL, BOOL, BOOL);
void ShowGameMsg(HDC, int, int, int, int, int, STONEDATA *, SGFHEADER);
void DrawString(HDC, int, int, int, COLORREF, char *);
//刷新全局棋盘线数据
void RefreshBoardSizeData(HWND);
//申明功能函数,各函数须能独立使用(所需外部数据由参数传入,不使用全局变量)
int GetWndHeight(HWND);
HWND CreateToolbar(HWND);
void DivisionStatusbar(HWND, HWND);
void SetToolbarBtnState(void);
void SetStatusbarText1(void);
void SetStatusbarText2(BOOL);
void SetStatusbarText3(BOOL);
void SetStatusbarText4(STONECOLOR);
unsigned short int GetMouseLogicPoint(LPARAM, POINT, int, int);
char *LoadwaveFile(char *);
BOOL GetFileName(HWND, char, char *, char *);
void SaveData2BMP(char *);
void SaveHBITMAP2File(HBITMAP, FILE *);
//定义全局界面变量
TCHAR g_szCaption[MAX_PATH]; //主窗口标题栏文字
HINSTANCE g_hInstance; //本程序实例句柄
HWND g_hwndToolbar, g_hwndStatusbar; //工具栏、状态栏句柄
int g_htToolbar, g_htStatusbar; //工具栏、状态栏的高度
HBITMAP g_hbmpBoard, g_hbmpStone; //棋盘、棋子背景图片句柄
char *g_hwave[3]; //音效内存指针
BOOL g_bShowLastStone; //是否显示最后一子(用于闪烁提示)
BOARDMODE g_iMode; //盘面状态
//定义全局棋盘线变量
int g_wdBoardLine; //棋盘线距
POINT g_ptBoardLine; //棋盘线左上角坐标
int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
{
char szClassName[MAX_PATH] = "TryHandTalk";
WNDCLASSEX wc;
HWND hwnd;
MSG msg;
g_hInstance = hThisInstance;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW|CS_VREDRAW; //窗口大小改变时重绘
wc.lpfnWndProc = WinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hThisInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = MAKEINTRESOURCE(IDM_MENU);
wc.lpszClassName = szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc))
return 0;
LoadszRes(IDS_MAINCAPTION, g_szCaption);
hwnd = CreateWindow(szClassName, g_szCaption, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,0,CW_USEDEFAULT,0, NULL, NULL, hThisInstance, NULL);
if(NULL == hwnd) return 0;
ShowWindow(hwnd, nCmdShow);
//保存工具栏和状态栏的高度
g_htToolbar = GetWndHeight(g_hwndToolbar) - 1; // -1是消除边框影响
g_htStatusbar = GetWndHeight(g_hwndStatusbar); // 创建时不带 WS_BORDER 就不需 -1
RefreshBoardSizeData(hwnd);
OnGameNew(hwnd);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
static int cx = 400, cy = 300; //主窗口客户区宽高
switch(msg)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_FILE_SAVEAS_SGF:
OnFileSaveAsSGF(hwnd);
break;
case IDM_FILE_SAVEAS_BMP:
OnFileSaveAsBMP(hwnd);
break;
case IDM_FILE_OPEN:
OnFileOpen(hwnd);
break;
case IDM_GAME_NEW:
OnGameNew(hwnd);
break;
case IDM_GAME_TRY:
if(g_iMode == STUDY || g_iMode == TRY)
OnGameTry(hwnd, LOWORD(wParam));
break;
case IDM_GAME_EXAM:
OnGameExam(hwnd, LOWORD(wParam));
break;
case IDM_HELP_ABOUT:
OnAbout(hwnd);
break;
case IDM_SET_SHOW_TOOLBAR:
case IDM_SET_SHOW_STATUSBAR:
case IDM_SET_BMP_BOARD:
case IDM_SET_BMP_STONE:
case IDM_SET_SHOW_STONENUMBER:
case IDM_SET_SHOW_BOARDCOORDINATE:
OnMenuSet(hwnd, LOWORD(wParam));
break;
case IDM_SET_SHOW_SPECIALLASTSTONE:
OnSpecialLastStone(hwnd, LOWORD(wParam));
break;
case IDM_SET_WAVE_SOUND:
CheckMenuItem(GetMenu(hwnd), IDM_SET_WAVE_SOUND, (GetMenuState(GetMenu(hwnd), IDM_SET_WAVE_SOUND, MF_BYCOMMAND) & MF_CHECKED) == MF_CHECKED ? MF_UNCHECKED : MF_CHECKED);
break;
case IDT_TOOLBAR_RESTRACT:
OnRestract(hwnd);
break;
case IDT_TOOLBAR_TURN:
SetStatusbarText4(g_cNextColor);
break;
case IDT_TOOLBAR_BLACK:
SetStatusbarText4(BLACK);
break;
case IDT_TOOLBAR_WHITE:
SetStatusbarText4(WHITE);
break;
case IDT_TOOLBAR_FIRST:
case IDT_TOOLBAR_PREVIOUS:
case IDT_TOOLBAR_NEXT:
case IDT_TOOLBAR_LAST:
OnFirstNext(hwnd, LOWORD(wParam));
break;
}
break;
case WM_CREATE:
OnCreate(hwnd);
break;
case WM_TIMER:
OnTimer(hwnd);
break;
case WM_NOTIFY:
OnNotify(lParam);
break;
case WM_SIZE:
cx = LOWORD(lParam);
cy = HIWORD(lParam);
OnSize(hwnd, msg, wParam, lParam);
break;
case WM_MOUSEMOVE:
OnMouseMove(lParam);
break;
case WM_LBUTTONUP:
OnLButtonUp(hwnd, lParam);
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
OnPaint(hwnd, hdc, cx, cy);
EndPaint(hwnd, &ps);
break;
case WM_ERASEBKGND:
break;
case WM_DESTROY:
OnDestroy();
- 1
- 2
- 3
- 4
前往页