#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:
[纯C语言 + Win32 API]一步一步写个围棋程序之二十二:最终代码(MinGW64-i686版)
需积分: 18 65 浏览量
2016-02-26
22:34:10
上传
评论 4
收藏 272KB RAR 举报
whoozit
- 粉丝: 39
- 资源: 36
最新资源
- Screenshot_20240427_031602.jpg
- 网页PDF_2024年04月26日 23-46-14_QQ浏览器网页保存_QQ浏览器转格式(6).docx
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
- Python排序算法.zip
- C语言实现直接插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序、计数排序,并带图详解.zip
- 常用工具集参考用于图像等数据处理
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈