📄 sdkblock.cpp
字号:
// SDKBlock.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "resource.h"
#include "SDKBlock.h"
#include "commctrl.h"
#include "winuser.h"
//----------------------------------------------------------
extern int Shape[7][4][4][4];
extern int nShape;
extern int nState;
extern int nScore;
extern int nLevel;
extern int nNextShape;
extern int nCurrentX;
extern int nCurrentY;
extern int Map[20][12];
extern HMENU hPopupMenu;
extern HBRUSH hBrushInfo;
extern HBRUSH hBrushBack;
extern HBRUSH hBrushStatic;
//----------------------------------------------------------
extern HBITMAP hBitmap;
extern HBITMAP hStartBmp;
extern HBITMAP hStopBmp;
extern HBITMAP hNewBmp;
extern HBITMAP hExitBmp;
extern HBITMAP hUnitSmallBmp;
extern HBITMAP hUnitBigBmp;
extern HBITMAP hEraseBmp;
extern HBITMAP hOkBmp;
extern HBITMAP hCancelBmp;
extern HBITMAP hListHeadBmp;
HBITMAP hBlockBackBmp;
extern HWND hNewButton;
extern HWND hStartButton;
extern HWND hPauseButton;
extern HWND hExitButton;
extern HWND hMainWnd;
extern HWND hScoreWnd;
extern HWND hTimeWnd;
extern HWND hLevelProgress;
extern BOOL bFirst;
extern BOOL bHide ;
extern BOOL bSoundOn ;
//----------------------------------------------------------
extern HINSTANCE hInst;
TCHAR szTitle[MAX_LOADSTRING];
TCHAR szWindowClass[MAX_LOADSTRING];
//----------------------------------------------------------
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
HACCEL hAccelTable;
InitCommonControls();
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_SDKBLOCK, szWindowClass, MAX_LOADSTRING);
hPopupMenu = LoadMenu(hInstance,(LPCTSTR)IDR_POPUPMENU);
hBitmap=LoadBitmap(hInstance,(LPCTSTR)IDB_BITMAP1);
hStartBmp=LoadBitmap(hInstance,(LPCTSTR)IDB_START);
hStopBmp=LoadBitmap(hInstance,(LPCTSTR)IDB_STOP);
hNewBmp=LoadBitmap(hInstance,(LPCTSTR)IDB_NEW);
hExitBmp=LoadBitmap(hInstance,(LPCTSTR)IDB_EXIT);
hBlockBackBmp=LoadBitmap(hInstance,(LPCTSTR)IDB_BLOCKBACK);
hListHeadBmp=LoadBitmap(hInstance,(LPCTSTR)IDB_LISTHEAD);
hUnitBigBmp=LoadBitmap(hInstance,(LPCTSTR)IDB_BIGUNIT);
hUnitSmallBmp=LoadBitmap(hInstance,(LPCTSTR)IDB_SMALLUNIT);
hOkBmp=LoadBitmap(hInstance,(LPCTSTR)IDB_OK);
hCancelBmp=LoadBitmap(hInstance,(LPCTSTR)IDB_CANCEL);
hBrushInfo=CreateSolidBrush(RGB(100,200,255));
hBrushBack=CreatePatternBrush(hListHeadBmp);
hBrushStatic=CreateSolidBrush(RGB(240,255,240));
MyRegisterClass(hInstance);
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_SDKBLOCK);
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
DeleteObject(hBrushInfo);
DeleteObject(hBrushBack);
DeleteObject(hBrushStatic);
DeleteObject(hBitmap);
DeleteObject(hStopBmp);
DeleteObject(hNewBmp);
DeleteObject(hExitBmp);
DeleteObject(hStartBmp);
DeleteObject(hUnitBigBmp);
DeleteObject(hUnitSmallBmp);
DeleteObject(hEraseBmp);
DeleteObject(hBlockBackBmp);
DeleteObject(hOkBmp);
DeleteObject(hCancelBmp);
DeleteObject(hListHeadBmp);
DestroyMenu(hPopupMenu);
return msg.wParam;
}
//----------------------------------------------------------
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW ;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_ICON1);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCSTR)IDC_SDKBLOCK;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex);
}
//----------------------------------------------------------
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // Store instance handle in our global variable
hMainWnd = CreateWindowEx(WS_EX_CLIENTEDGE,szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
ShowWindow(hMainWnd, nCmdShow);
UpdateWindow(hMainWnd);
return TRUE;
}
//----------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
HDC dcMem;
HBITMAP hOldBmp;
switch (message)
{
case WM_CREATE:
DWORD WindowStyle;
int nPosX,nPosY;
nPosX = (GetSystemMetrics(SM_CXSCREEN)-(20*12+200))/2;
nPosY = (GetSystemMetrics(SM_CYSCREEN)-(20*20+49))/2;
WindowStyle=GetWindowLong(hWnd,GWL_STYLE);
SetWindowLong(hWnd,GWL_STYLE,WindowStyle&~WS_THICKFRAME&~WS_MAXIMIZEBOX);
SetWindowPos(hWnd,NULL,nPosX,nPosY,20*12+200,20*20+49,SWP_DRAWFRAME);
SendMessage(hWnd,WM_COMMAND,MAKELONG(ID_NEWGAME,0),0);
hLevelProgress = CreateWindow(PROGRESS_CLASS,NULL,WS_CHILD|WS_VISIBLE,310,38,100,20,hWnd,(HMENU)ID_PROGRESS,hInst,NULL);
SendMessage(hLevelProgress,PBM_DELTAPOS,(WPARAM)1,0);
SendMessage(hLevelProgress,PBM_SETRANGE32,(WPARAM)0,(LPARAM)8);
SendMessage(hLevelProgress,PBM_SETSTEP,(WPARAM)1,0);
SendMessage(hLevelProgress,PBM_SETBKCOLOR,0,(LPARAM)RGB(240,255,240));
SendMessage(hLevelProgress,PBM_SETBARCOLOR,0,(LPARAM)RGB(255,0,0));
SendMessage(hLevelProgress,PBM_SETPOS,0,0);
hScoreWnd = CreateWindow("STATIC","0",WS_CHILD|WS_VISIBLE|SS_RIGHT|SS_SUNKEN,310,64,100,20,hWnd,(HMENU)IDS_SCORE,hInst,NULL);;
hTimeWnd = CreateWindow("STATIC","00:00:00",WS_CHILD|WS_VISIBLE|SS_RIGHT|SS_SUNKEN,310,88,100,20,hWnd,(HMENU)IDS_TIME,hInst,NULL);;;
hStartButton=CreateWindow("BUTTON",NULL,WS_CHILD|WS_VISIBLE|BS_BITMAP,268,267,66,29,hWnd,(HMENU)ID_START,hInst,NULL);
hPauseButton=CreateWindow("BUTTON",NULL,WS_CHILD|WS_VISIBLE|BS_BITMAP,342,267,66,29,hWnd,(HMENU)ID_PAUSE,hInst,NULL);
hNewButton=CreateWindow("BUTTON",NULL,WS_CHILD|WS_VISIBLE|BS_BITMAP,268,333,66,29,hWnd,(HMENU)ID_NEWGAME,hInst,NULL);
hExitButton=CreateWindow("BUTTON",NULL,WS_CHILD|WS_VISIBLE|BS_BITMAP,342,333,66,29,hWnd,(HMENU)IDM_EXIT,hInst,NULL);
SendMessage(hStartButton,BM_SETIMAGE,(WPARAM)IMAGE_BITMAP,(LPARAM)hStartBmp);
SendMessage(hPauseButton,BM_SETIMAGE,(WPARAM)IMAGE_BITMAP,(LPARAM)hStopBmp);
SendMessage(hNewButton,BM_SETIMAGE,(WPARAM)IMAGE_BITMAP,(LPARAM)hNewBmp);
SendMessage(hExitButton,BM_SETIMAGE,(WPARAM)IMAGE_BITMAP,(LPARAM)hExitBmp);
SetTimer(hWnd,ID_SYSTIMER,1000,NULL);
return 0;
case WM_CTLCOLORSTATIC:
SetBkMode((HDC) wParam,TRANSPARENT);
return (LONG)hBrushStatic;
case WM_ERASEBKGND:
RECT rect ;
GetClientRect(hWnd,&rect);
FillRect((HDC)wParam,&rect,hBrushInfo);
rect.left=20*12;
dcMem = CreateCompatibleDC((HDC)wParam);
hOldBmp = (HBITMAP)SelectObject(dcMem,hBitmap);
BitBlt((HDC)wParam,rect.left,rect.top,200,400,dcMem,0,0,SRCCOPY);
DrawEdge((HDC)wParam,&rect,EDGE_RAISED,BF_RECT);
SelectObject(dcMem,hBlockBackBmp);
BitBlt((HDC)wParam,0,0,240,400,dcMem,0,0,SRCCOPY);
SelectObject(dcMem,hOldBmp);
DeleteDC(dcMem);
if(bFirst)
{
bFirst=FALSE;
GetBackBmp(hWnd);
}
return TRUE;
case WM_RBUTTONUP:
POINT pt;
pt.x = LOWORD(lParam);
pt.y = HIWORD(lParam);
ClientToScreen(hWnd,&pt);
TrackPopupMenu(GetSubMenu(hPopupMenu,0),TPM_LEFTALIGN|TPM_LEFTBUTTON ,pt.x,pt.y,0,hWnd,NULL);
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
dcMem = CreateCompatibleDC(hdc);
hOldBmp = (HBITMAP)SelectObject(dcMem,hUnitSmallBmp);
int i,j;
for(i=0;i<20;i++)
{
for(j=0;j<12;j++)
{
if(Map[i][j]==1)
{
SetRect(&rect,20*j,20*i,20*j+20,20*i+20);
BitBlt(hdc,20*j,20*i,20,20,dcMem,0,0,SRCCOPY);
DrawEdge(hdc,&rect,EDGE_RAISED,BF_RECT);
}
}
}
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(Shape[nShape][nState][i][j]==1)
{
rect.left=(nCurrentX+j)*20;
rect.top=(i+nCurrentY)*20;
rect.right=(nCurrentX+j+1)*20;
rect.bottom=(i+nCurrentY+1)*20;
BitBlt(hdc,rect.left,rect.top,20,20,dcMem,0,0,SRCCOPY);
DrawEdge(hdc,&rect,EDGE_RAISED,BF_RECT);
}
}
}
SelectObject(dcMem,hOldBmp);
EndPaint(hWnd, &ps);
DeleteDC(dcMem);
if(bHide == TRUE)
{
bHide = FALSE;
}
else
{
ShowPreview(hWnd);
}
break;
case WM_TIMER:
if(wParam==ID_SYSTIMER)
{
SYSTEMTIME systime;
GetLocalTime(&systime);
char s[30];
wsprintf(s,"%02d:%02d:%02d",systime.wHour,systime.wMinute,systime.wSecond);
SetWindowText(hTimeWnd,s);
return 0;
}
break;
case WM_DESTROY:
KillTimer( hWnd,ID_SYSTIMER);
PostQuitMessage(0);
break;
case WM_KEYDOWN:
switch( wParam)
{
case VK_LEFT:
GoLeft(hWnd);
break ;
case VK_RIGHT:
GoRight(hWnd);
break;
case VK_SPACE:
GoToBottom(hWnd);
break;
case VK_UP:
ChangeState(hWnd);
break;
case VK_DOWN:
if( GetKeyState(VK_SHIFT) & 0x8000 )
{
GoToBottom(hWnd);
}
else
GoFastDown(hWnd);
break;
}
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId)
{
case ID_SHOWHERO:
if(_access("BlockData.bsn",0)== -1)
{
MessageBox(hWnd,"记录还没有,你是第一位玩家!","Sorry!",0);
}
else
{
ShowWindow(hMainWnd,SW_HIDE);
DialogBox(hInst, (LPCTSTR)IDD_DIALOG2, hMainWnd, (DLGPROC)HeroProc);
ShowWindow(hMainWnd,SW_SHOW);
}
return 0;
case ID_SOUND_ON:
bSoundOn=TRUE;
CheckMenuItem(GetSubMenu(GetMenu(hWnd),1),ID_SOUND_ON,MF_BYCOMMAND|MF_CHECKED);
CheckMenuItem(GetSubMenu(GetMenu(hWnd),1),ID_SOUND_OFF,MF_BYCOMMAND|MF_UNCHECKED);
CheckMenuItem(GetSubMenu(hPopupMenu,0),ID_SOUND_ON,MF_BYCOMMAND|MF_CHECKED);
CheckMenuItem(GetSubMenu(hPopupMenu,0),ID_SOUND_OFF,MF_BYCOMMAND|MF_UNCHECKED);
return 0;
case ID_SOUND_OFF:
bSoundOn=FALSE;
CheckMenuItem(GetSubMenu(GetMenu(hWnd),1),ID_SOUND_ON,MF_BYCOMMAND|MF_UNCHECKED);
CheckMenuItem(GetSubMenu(GetMenu(hWnd),1),ID_SOUND_OFF,MF_BYCOMMAND|MF_CHECKED);
CheckMenuItem(GetSubMenu(hPopupMenu,0),ID_SOUND_ON,MF_BYCOMMAND|MF_UNCHECKED);
CheckMenuItem(GetSubMenu(hPopupMenu,0),ID_SOUND_OFF,MF_BYCOMMAND|MF_CHECKED);
return 0;
case ID_NEWGAME:
OnFileNew(hWnd);
if((HWND) lParam != NULL)
SetFocus(hWnd);
return 0;
case ID_START:
OnStart(hWnd);
if((HWND) lParam != NULL)
SetFocus(hWnd);
return 0;
case ID_PAUSE:
OnPause(hWnd);
if((HWND) lParam != NULL)
SetFocus(hWnd);
return 0;
case IDM_ABOUT:
ShowWindow(hWnd,SW_HIDE);
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
ShowWindow(hWnd,SW_SHOW);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
//----------------------------------------------------------
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
AnimateWindow(hDlg,500,AW_ACTIVATE|AW_CENTER);
SendMessage(GetDlgItem(hDlg,IDOK),BM_SETIMAGE,(WPARAM)IMAGE_BITMAP,(LPARAM)hOkBmp);
return TRUE;
case WM_CTLCOLORDLG :
return (LONG)hBrushInfo;
case WM_CTLCOLORSTATIC :
SetBkMode((HDC) wParam,TRANSPARENT);
SetTextColor((HDC) wParam,RGB(0,0,255));
return (LONG)hBrushInfo;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
AnimateWindow(hDlg,1000,AW_HIDE|AW_CENTER);
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -