别踩白块儿之禅模式 windows程序实现
代码如下
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain( //程序入口,WINAPI是一种函数调用约定,用于表明如何生成在堆栈中放置调用参数的机器代码
HINSTANCE hInstance //实例句柄,标识该程序
, HINSTANCE hPreInstance //16位中用于标识该程序前一实例,32位中不再采用,参数为NULL
, LPSTR szCmdLine //调用时的命令行
, int iCmdShow) //窗口显示方式
{
static TCHAR szName[] = TEXT("HIYUN");
HWND hwnd;
MSG msg;
WNDCLASS wc;
wc.style = CS_VREDRAW | CS_HREDRAW;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpfnWndProc = WndProc;
wc.lpszMenuName = NULL;
wc.lpszClassName = szName;
if (!RegisterClass(&wc))
{
MessageBox(NULL, TEXT("注册失败!"), TEXT("失败"), MB_OK | MB_ICONERROR);
}
hwnd = CreateWindow(szName, TEXT("别踩白块儿之禅模式 - 闲云野鹤制作,QQ群116920287"), WS_OVERLAPPEDWINDOW,
400, 100, 400, 600,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
TCHAR szBuff[50];
static HBRUSH brushPass = CreateSolidBrush(RGB(223, 223, 223));
static int i, j, x, y, tx, ty;
static int runing, cxChar, cyChar, cxClient, cyClient, cxSquare, cySquare;
static TCHAR PlayName[] = TEXT("YUN");
static ULONG score = 0, t;
static int Loc[20];
switch (message)
{
case WM_CREATE:
runing = 0;
hdc = GetDC(hwnd);
TEXTMETRIC tm;
GetTextMetrics(hdc, &tm);
cxChar = tm.tmAveCharWidth;
cyChar = tm.tmHeight + tm.tmExternalLeading;
ReleaseDC(hwnd, hdc);
return 0;
case WM_SIZE:
cxClient = LOWORD(lparam);
cyClient = HIWORD(lparam);
cxSquare = cxClient / 4;
cySquare = (int)(cxSquare * 1.5);
for (i = 0; i <= cyClient / cySquare + 2; ++i)
{
Loc[i] = rand() % 4;
}
return 0;
case WM_LBUTTONDOWN:
tx = x = LOWORD(lparam);
ty = y = HIWORD(lparam);
x /= cxSquare;
y = (cyClient - y) / cySquare;
if (Loc[0] == x && y == 0 && !runing)
{
runing = 1;
InvalidateRect(hwnd, NULL, true);
}
else if (Loc[1] == x && y == 1 && runing)
{
score++;
for (i = 0; i <= cyClient / cySquare + 1; ++i)
{
Loc[i] = Loc[i + 1];
}
Loc[i] = rand() % 4;
InvalidateRect(hwnd, NULL, true);
}
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
SetBkMode(hdc, TRANSPARENT);
SetTextColor(hdc, RGB(255, 0, 0));
for (i = 1; i < 4; ++i)
{
MoveToEx(hdc, cxSquare * i, 0, NULL);
LineTo(hdc, cxSquare * i, cyClient);
}
for (i = 0; i <= cyClient / cySquare + 1; ++i)
{
MoveToEx(hdc, 0, cyClient - cySquare * i, NULL);
LineTo(hdc, cxClient, cyClient - cySquare * i);
j = Loc[i];
if (i == 0 && runing)
SelectObject(hdc, brushPass);
else
SelectObject(hdc, GetStockObject(BLACK_BRUSH));
Rectangle(hdc, j * cxSquare, cyClient - cySquare * (i + 1),
cxSquare * (j + 1) + 1, cyClient - cySquare * i + 1);
if (!runing && i == 0)
{
TextOut(hdc, j * cxSquare + cxSquare / 2 - cxChar * 1.5, cyClient - cySquare / 2,
szBuff, wsprintf(szBuff, TEXT("开始")));
}
}
TextOut(hdc, cxChar, cyChar, szBuff,
wsprintf(szBuff, TEXT("Player:%s"), PlayName));
t = wsprintf(szBuff, TEXT("Score: %ld"), score);
TextOut(hdc, cxClient - (t + 2) * cxChar, cyChar, szBuff, t);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wparam, lparam);
}