⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdkblock.cpp

📁 一个用SDK编写的方块程序
💻 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 + -