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

📄 winproc.cpp

📁 实现了windows Xp 中自带的扫雷的基本全部功能
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/*//////////////////////文件说明//////////////////////////
//														//
//文件名: WinProc.cpp					       			//
//功  能: 功能函数的定义和实现							//
//作  者:												//
//														//
////////////////////////////////////////////////////////*/

#include "WinProc.h"

/*###########################################################
功能:主窗口的消息处理回调函数
参数:
返回值:
###########################################################*/
LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	HDC							hDC,hDCMem;		
	static	HICON				hIcon;						//程序图标句柄
	static	HINSTANCE			hInstance;					//程序实例句柄
	static	HMENU				hMenu;						//程序主菜单句柄
	PAINTSTRUCT					ps;
	HBRUSH						hBrush;
	HPEN						hPen;
	HBITMAP						hBmp;
	int							ix=0,iy=0;
	RECT						rcWnd,rcRefresh;			//窗口区域和刷新区域
	static tagMouseState		NowMousePos;				//鼠标状态结构体
	static int					mStartMousePos;
	HRSRC						hrWare;						//wave资源句柄
	HGLOBAL						hGlobal;					
	LPCTSTR						keyWinMine=TEXT("Software\\Microsoft\\winmine\\");	//注册表主键
	HKEY						hKey,hKeySub;				//注册表键句柄
	DWORD						dwTemp;						//临时变量
	LPCTSTR						lpsTime[3]={TEXT("Time1"),TEXT("Time2"),TEXT("Time3")};
	LPCTSTR						lpsName[3]={TEXT("Name1"),TEXT("Name2"),TEXT("Name3")};
	TCHAR						lpAnonymity[255];			//临时变量
	DWORD 						dwSize1=sizeof(DWORD),dwType1=REG_DWORD,dwType2=REG_SZ,dwSize2=sizeof(lpAnonymity);
//###########################################################################################################
	switch (message)
	{
	case WM_CREATE:
		hDC=GetDC(hWnd);
		hInstance=((LPCREATESTRUCT)lParam)->hInstance;
		hMenu=((LPCREATESTRUCT)lParam)->hMenu;
		//注册表读取已保存的信息,如果相关键值不存在则创建
		if (RegOpenKeyEx(HKEY_CURRENT_USER,keyWinMine,0,KEY_ALL_ACCESS,&hKey)!=ERROR_SUCCESS){
			RegCreateKey(HKEY_CURRENT_USER,keyWinMine,&hKey);			
		}			
		if (RegQueryValueEx(hKey,TEXT("Height"),NULL,&dwType1,(LPBYTE)&mineLineNum,&dwSize1)!=ERROR_SUCCESS){
			mineLineNum=BEGINER_LN_NUM;
			RegSetValueEx(hKey,TEXT("Height"),NULL,REG_DWORD,(LPBYTE)&mineLineNum,dwSize1);
		}
		if (RegQueryValueEx(hKey,TEXT("Width"),NULL,&dwType1,(LPBYTE)&mineRowNum,&dwSize1)!=ERROR_SUCCESS){
			mineRowNum=BEGINER_COL_NUM;
			RegSetValueEx(hKey,TEXT("Width"),NULL,REG_DWORD,(LPBYTE)&mineRowNum,dwSize1);
		}			
		if (RegQueryValueEx(hKey,TEXT("Mines"),NULL,&dwType1,(LPBYTE)&mineBomb,&dwSize1)!=ERROR_SUCCESS){
			mineBomb=BEGINER_BOMB_NUM;
			RegSetValueEx(hKey,TEXT("Mines"),NULL,REG_DWORD,(LPBYTE)&mineBomb,dwSize1);
		}			
		if (RegQueryValueEx(hKey,TEXT("Sound"),NULL,&dwType1,(LPBYTE)&dwTemp,&dwSize1)!=ERROR_SUCCESS){
			dwTemp=0;
			RegSetValueEx(hKey,TEXT("Sound"),NULL,REG_DWORD,(LPBYTE)&dwTemp,dwSize1);
		}
		flagState=(flagState&0xffef)+dwTemp*FLAG_SOUND;
		if (RegQueryValueEx(hKey,TEXT("Difficulty"),NULL,&dwType1,(LPBYTE)&dwTemp,&dwSize1)!=ERROR_SUCCESS){
			dwTemp=0;
			RegSetValueEx(hKey,TEXT("Difficulty"),NULL,REG_DWORD,(LPBYTE)&dwTemp,dwSize1);
		}		
		flagState=(flagState&0xf0ff)+dwTemp*0x0100;	
		if (RegQueryValueEx(hKey,TEXT("Mark"),NULL,&dwType1,(LPBYTE)&dwTemp,&dwSize1)!=ERROR_SUCCESS){
			dwTemp=1;
			RegSetValueEx(hKey,TEXT("Mark"),NULL,REG_DWORD,(LPBYTE)&dwTemp,dwSize1);
		}
		flagState=(flagState&0xfff7)+dwTemp*FLAG_MARK;
		if (RegQueryValueEx(hKey,TEXT("Color"),NULL,&dwType1,(LPBYTE)&dwTemp,&dwSize1)!=ERROR_SUCCESS){
			dwTemp=1;
			RegSetValueEx(hKey,TEXT("Color"),NULL,REG_DWORD,(LPBYTE)&dwTemp,dwSize1);
		}
		flagState=(flagState&0xfffb)+dwTemp*FLAG_COLOR;
		if (RegQueryValueEx(hKey,TEXT("AlreadyPlayed"),NULL,&dwType1,(LPBYTE)&dwTemp,&dwSize1)!=ERROR_SUCCESS){
			dwTemp=1;
			RegSetValueEx(hKey,TEXT("AlreadyPlayed"),NULL,REG_DWORD,(LPBYTE)&dwTemp,dwSize1);
		}
		flagState=(flagState&0xfffe)+1*FLAG_ALREADPLAYED;	dwTemp=999;	
		LoadString(hInstance,IDS_NORMAL_NAME,lpAnonymity,sizeof(lpAnonymity));	
		for (ix=0;ix<3;ix++){				
			if (RegOpenKeyEx(hKey,lpsTime[ix],NULL,KEY_WRITE,&hKeySub)!=ERROR_SUCCESS){
				RegSetValueEx(hKey,lpsTime[ix],NULL,REG_DWORD,(LPBYTE)&dwTemp,dwSize1);
				RegCloseKey(hKeySub);
			}
			if (RegOpenKeyEx(hKey,lpsName[ix],NULL,KEY_WRITE,&hKeySub)!=ERROR_SUCCESS){		
				RegSetValueEx(hKey,lpsName[ix],NULL,REG_SZ,(LPBYTE)&lpAnonymity,dwSize2);
				RegCloseKey(hKeySub);
			}
		}//初始化窗口信息			
		IinitializeMapInfo(hWnd,(flagState&0x0f00)/0x0100,mineRowNum,mineLineNum,mineBomb);	
		CheckMenuItem(hMenu,IDM_MARK,((flagState&0x0008)==FLAG_MARK) ? MF_CHECKED:MF_UNCHECKED);
		CheckMenuItem(hMenu,IDM_COLOR,((flagState&0x0004)==FLAG_COLOR) ? MF_CHECKED:MF_UNCHECKED);
		CheckMenuItem(hMenu,IDM_SOUND,((flagState&0x0010)==FLAG_SOUND) ? MF_CHECKED:MF_UNCHECKED);			
		OnCheckLevelMenu(hMenu,(flagState&0x0f00)/0x0100);				
		rcWnd=getLevelWindowSize(hWnd);//计算窗口大小,初始化地图数据
		if (RegQueryValueEx(hKey,TEXT("Xpos"),NULL,&dwType1,(LPBYTE)&dwTemp,&dwSize1)==ERROR_SUCCESS) rcWnd.left=dwTemp;
		if (RegQueryValueEx(hKey,TEXT("Ypos"),NULL,&dwType1,(LPBYTE)&dwTemp,&dwSize1)==ERROR_SUCCESS) rcWnd.top=dwTemp;				
		CreateRandomMap(hWnd);
		MoveWindow(hWnd,rcWnd.left,rcWnd.top,rcWnd.right,rcWnd.bottom,TRUE);
		RegCloseKey(hKey);
		ReleaseDC(hWnd,hDC);
		hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDC_APPICON)) ;
		return 0;
	case WM_PAINT:
		hDC = BeginPaint (hWnd, &ps);
		hDCMem= CreateCompatibleDC(hDC);
		GetClientRect(hWnd,&rcWnd);
		hPen=(HPEN)GetStockObject(NULL_PEN);
		SelectObject(hDC,hPen);
		hBrush=CreateSolidBrush(RGB(192,192,192));
		SelectObject(hDC,hBrush);
		Rectangle(hDC,3,3,rcWnd.right+1,rcWnd.bottom+1);//绘制底层背景		
		DeleteObject(hBrush);
		hBrush=CreateSolidBrush(RGB(8+(flagState&0x0004)*30,8+(flagState&0x0004)*30,8+(flagState&0x0004)*30));
		SelectObject(hDC,hBrush);	
		Rectangle(hDC,MAIN_LEFTSTND+(mineRowNum*MINE_BITMAP_WIDTH-FACE_BITMAP_WIDTH)/2-1,(MAIN_TOPSTND-FACE_BITMAP_HEIGHT)/2-1,MAIN_LEFTSTND+(mineRowNum*MINE_BITMAP_WIDTH-FACE_BITMAP_WIDTH)/2+FACE_BITMAP_WIDTH+2,(MAIN_TOPSTND-FACE_BITMAP_HEIGHT)/2+FACE_BITMAP_HEIGHT+2);	//绘制表情背景
		DeleteObject(hBrush);
		DeleteObject(hPen);
		//表情贴图
		hBmp=LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_SMILE_BLACK+(flagState&0x0004)/0x0004));
		SelectObject(hDCMem,hBmp);
		BitBlt(hDC,MAIN_LEFTSTND+(mineRowNum*MINE_BITMAP_WIDTH-FACE_BITMAP_WIDTH)/2,(MAIN_TOPSTND-FACE_BITMAP_HEIGHT)/2,FACE_BITMAP_WIDTH,FACE_BITMAP_HEIGHT,hDCMem,0, ((flagState & 0xf000)/0x1000) *FACE_BITMAP_HEIGHT,SRCCOPY);
		DeleteObject(hBmp);
		//计雷器贴图
		hBmp=LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_NUM_BLACK+(flagState&0x0004)/0x0004));
		SelectObject(hDCMem,hBmp);
		BitBlt(hDC,COUNT_LEFTPOS,COUNT_TOPPOS,NUM_BITMAP_WIDTH,NUM_BITMAP_HEIGHT,hDCMem,0,NUM_BITMAP_HEIGHT*(bombCount<0?0:11-(int)floor(bombCount/100)),SRCCOPY);
		BitBlt(hDC,COUNT_LEFTPOS+NUM_BITMAP_WIDTH,COUNT_TOPPOS,NUM_BITMAP_WIDTH,NUM_BITMAP_HEIGHT,hDCMem,0,NUM_BITMAP_HEIGHT*(11-(int)floor((abs(bombCount)-(int)floor(abs(bombCount)/100)*100)/10)),SRCCOPY);
		BitBlt(hDC,COUNT_LEFTPOS+NUM_BITMAP_WIDTH*2,COUNT_TOPPOS,NUM_BITMAP_WIDTH,NUM_BITMAP_HEIGHT,hDCMem,0,NUM_BITMAP_HEIGHT*(11-(abs(bombCount)-(int)floor(abs(bombCount)/10)*10)),SRCCOPY);
		//计时器贴图
		BitBlt(hDC,rcWnd.right-TIME_RIGHTSTND-TIME_WIDTH,TIME_TOPPOS,NUM_BITMAP_WIDTH,NUM_BITMAP_HEIGHT,hDCMem,0,NUM_BITMAP_HEIGHT*(11-(timeCount<1000?(int)floor(timeCount/100):9)),SRCCOPY);
		BitBlt(hDC,rcWnd.right-TIME_RIGHTSTND-TIME_WIDTH+NUM_BITMAP_WIDTH,TIME_TOPPOS,NUM_BITMAP_WIDTH,NUM_BITMAP_HEIGHT,hDCMem,0,NUM_BITMAP_HEIGHT*(11-(timeCount<1000?(int)floor((timeCount-(int)floor(timeCount/100)*100)/10):9)),SRCCOPY);
		BitBlt(hDC,rcWnd.right-TIME_RIGHTSTND-TIME_WIDTH+NUM_BITMAP_WIDTH*2,TIME_TOPPOS,NUM_BITMAP_WIDTH,NUM_BITMAP_HEIGHT,hDCMem,0,NUM_BITMAP_HEIGHT*(11-(timeCount<1000?(timeCount-(int)floor(timeCount/10)*10):9)),SRCCOPY);
		DeleteObject(hBmp);	
		//立体边框描绘
		rcRefresh=CreateRect(MAIN_LEFTSTND-LINE_LIGHTEN_THICK,MAIN_TOPSTND-LINE_LIGHTEN_THICK,rcWnd.right-MAIN_RIGHTSTND-MAIN_LEFTSTND+2*LINE_LIGHTEN_THICK,rcWnd.bottom-MAIN_TOPSTND-MAIN_BOTTOMSTND+2*LINE_LIGHTEN_THICK,FALSE);
		DrawSolidFrame(hDC,rcRefresh,LINE_LIGHTEN_THICK);
		rcRefresh=CreateRect(FUN_LEFTPOS-LINE_LIGHTEN_THICK,FUN_TOPPOS-LINE_LIGHTEN_THICK,rcWnd.right-FUN_LEFTPOS-FUN_RIGHTSTND+2*LINE_LIGHTEN_THICK,MAIN_TOPSTND-FUN_TOPPOS-FUN_BOTTOMSTND+2*LINE_LIGHTEN_THICK,FALSE);
		DrawSolidFrame(hDC,rcRefresh,LINE_LIGHTEN_NORMAL);		
		rcRefresh=CreateRect(COUNT_LEFTPOS-LINE_LIGHTEN_THIN,COUNT_TOPPOS-LINE_LIGHTEN_THIN,COUNT_WIDTH+2*LINE_LIGHTEN_THIN,COUNT_HEIGHT+2*LINE_LIGHTEN_THIN,FALSE);
		DrawSolidFrame(hDC,rcRefresh,LINE_LIGHTEN_THIN);
		rcRefresh=CreateRect(rcWnd.right-TIME_RIGHTSTND-TIME_WIDTH-LINE_LIGHTEN_THIN,TIME_TOPPOS-LINE_LIGHTEN_THIN,TIME_WIDTH+2*LINE_LIGHTEN_THIN,TIME_HEIGHT+2*LINE_LIGHTEN_THIN,FALSE);
		DrawSolidFrame(hDC,rcRefresh,LINE_LIGHTEN_THIN);
		//雷区贴图
		hBmp=LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_MINE_BLACK+(flagState&0x0004)/0x0004));
		SelectObject(hDCMem,hBmp);
		for(ix=0;ix<mineRowNum;ix++)
			for(iy=0;iy<mineLineNum;iy++) BitBlt(hDC,MAIN_LEFTSTND+MINE_BITMAP_WIDTH*ix,MAIN_TOPSTND+MINE_BITMAP_HEIGHT*iy,MINE_BITMAP_WIDTH,MINE_BITMAP_HEIGHT,hDCMem,0,MINE_BITMAP_HEIGHT* (btLandmineMapinfo[ix][iy]%0x10),SRCCOPY);		
		DeleteObject(hBmp);
		ReleaseDC(hWnd,hDCMem);
		DeleteObject(hDCMem);
		EndPaint (hWnd, &ps) ;
		return 0 ;
	case WM_COMMAND:
		switch(LOWORD(wParam)) {
			case IDM_BEGIN:				//开始
				IinitializeMapInfo(hWnd,(flagState & 0x0f00)/0x0100,mineRowNum,mineLineNum,mineBomb); //??
				CreateRandomMap(hWnd);
				InvalidateRect(hWnd,NULL,TRUE);
				break;
			case IDM_BEGINNER:			//初级
				IinitializeMapInfo(hWnd,0x0000,BEGINER_COL_NUM,BEGINER_LN_NUM,BEGINER_BOMB_NUM); //??
				rcWnd=getLevelWindowSize(hWnd);
				CreateRandomMap(hWnd);
				MoveWindow(hWnd,rcWnd.left,rcWnd.top,rcWnd.right,rcWnd.bottom,TRUE);
				OnCheckLevelMenu(hMenu,LEVEL_BEGINNER);
				break;
			case IDM_INTERMEDIATE:		//中级
				IinitializeMapInfo(hWnd,0x0001,INTER_COL_NUM,INTER_LN_NUM,INTER_BOMB_NUM); //??
				rcWnd=getLevelWindowSize(hWnd);
				CreateRandomMap(hWnd);
				MoveWindow(hWnd,rcWnd.left,rcWnd.top,rcWnd.right,rcWnd.bottom,TRUE);
				OnCheckLevelMenu(hMenu,LEVEL_INTER);			
				break;
			case IDM_ADVANCED:			//高级
				IinitializeMapInfo(hWnd,0x0002,ADVANCED_COL_NUM,ADVANCED_LN_NUM,ADVANCED_BOMB_NUM); //??
				rcWnd=getLevelWindowSize(hWnd);
				CreateRandomMap(hWnd);
				MoveWindow(hWnd,rcWnd.left,rcWnd.top,rcWnd.right,rcWnd.bottom,TRUE);
				OnCheckLevelMenu(hMenu,LEVEL_ADVANCED);
				break;
			case IDM_CUSTOMDEFINE:		//自定义等级自定义窗口				
				if (DialogBox(hInstance,MAKEINTRESOURCE(IDD_CUSTOMDLG),hWnd,WinDlgProc)){ //如果返回是 TRUE,即"确定"									
					IinitializeMapInfo(hWnd,0x0003,mineRowNum,mineLineNum,mineBomb); //??
					rcWnd=getLevelWindowSize(hWnd);
					CreateRandomMap(hWnd);
					MoveWindow(hWnd,rcWnd.left,rcWnd.top,rcWnd.right,rcWnd.bottom,TRUE);
					OnCheckLevelMenu(hMenu,LEVEL_CUSTOM);
				}
				break;
			case IDM_MARK:				//设置标记 flagState & FLAG_MARK == FLAG_MARK 为标记 
				flagState=(((flagState&0x0008)==FLAG_MARK)?0:0x0008)+(flagState&0xfff7);
				CheckMenuItem(hMenu,IDM_MARK,((flagState&0x0008)==FLAG_MARK) ? MF_CHECKED:MF_UNCHECKED);
				break;
			case IDM_COLOR:				//设置颜色	flagState & FLAG_COLOR == FLAG_COLOR 为彩色
				flagState=(((flagState&0x0004)==FLAG_COLOR)?0:0x0004)+(flagState&0xfffb);
				CheckMenuItem(hMenu,IDM_COLOR,((flagState&0x0004)==FLAG_COLOR) ? MF_CHECKED:MF_UNCHECKED);
				InvalidateRect(hWnd,NULL,TRUE);
				break;
			case IDM_SOUND:				//设置声音	flagState & FLAG_SOUND == FLAG_SOUND 为发声
				flagState=(((flagState&0x0010)==FLAG_SOUND)?0:0x0030)+(flagState&0xffef);
				CheckMenuItem(hMenu,IDM_SOUND,((flagState&0x0010)==FLAG_SOUND) ? MF_CHECKED:MF_UNCHECKED);
				break;
			case IDM_HEROLIST:			//显示排行榜
				DialogBox(hInstance,MAKEINTRESOURCE(IDD_HEROLISTDLG),hWnd,WinDlgProc);
				break;
			case IDM_EXIT:				//退出
				SendMessage(hWnd,WM_DESTROY,wParam,lParam);
				break;
			case IDM_ABOUT:				//关于
				LoadString(hInstance,IDS_AUTHER,lpAnonymity,sizeof(lpAnonymity));
				ShellAbout(hWnd,TEXT("扫雷 ..."),lpAnonymity,hIcon);
				break;
			case IDM_CONTENTS:			//帮助:目录
				LoadString(hInstance,IDS_HELPFILEPATH_WIN,lpAnonymity,sizeof(lpAnonymity));
				if (HtmlHelp(NULL,lpAnonymity,HH_DISPLAY_TOC,NULL)==0){		//系统帮助不存在,在当前目录寻找	
					GetCurrentDirectory(sizeof(lpAnonymity),lpAnonymity);
					strcat(lpAnonymity,TEXT("\\help\\winmine.chm"));
					if (HtmlHelp(NULL,lpAnonymity,HH_DISPLAY_TOC,NULL)==0)	//仍然无法打开,显示错误消息
						MessageBox(hWnd,TEXT("Sorry!\r\nYou have not the help file of \"WinMine.chm\"\t\r\n"),TEXT("Help Information"),MB_ICONINFORMATION);
				}
				break;
			case IDM_SEARCHHELP:		//帮助:索引
				LoadString(hInstance,IDS_HELPFILEPATH_WIN,lpAnonymity,sizeof(lpAnonymity));
				if (HtmlHelp(NULL, lpAnonymity, HH_DISPLAY_INDEX,0)==0){				
					GetCurrentDirectory(sizeof(lpAnonymity),lpAnonymity);
					strcat(lpAnonymity,TEXT("\\help\\winmine.chm"));
					if (HtmlHelp(NULL,lpAnonymity,HH_DISPLAY_INDEX,NULL)==0)
						MessageBox(hWnd,TEXT("Sorry!\r\nYou have not the help file of \"winmine.chm\"\t\r\n"),TEXT("Help Information"),MB_ICONINFORMATION);
				}				
				break;
			case IDM_USEHELP:			//帮助: 使用帮助
				LoadString(hInstance,IDS_HELPFILEPATH_HELP,lpAnonymity,sizeof(lpAnonymity));
				if (HtmlHelp(NULL, lpAnonymity, HH_DISPLAY_TOC,0)==0){
					GetCurrentDirectory(sizeof(lpAnonymity),lpAnonymity);
					strcat(lpAnonymity,TEXT("\\help\\nthelp.chm"));
					if (HtmlHelp(NULL,lpAnonymity,HH_DISPLAY_INDEX,NULL)==0) 
						MessageBox(hWnd,TEXT("Sorry!\r\nYou have not the help file of \"nthelp.chm\"\t\r\n"),TEXT("Help Information"),MB_ICONINFORMATION);
				}	
				break;
		}	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -