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

📄 winproc.cpp

📁 实现了windows Xp 中自带的扫雷的基本全部功能
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		return 0;
	case WM_LBUTTONDOWN:								//左键按下
		SetCapture(hWnd);								//捕获鼠标
		NowMousePos=getMousePosition(hWnd,hInstance,LOWORD(lParam),HIWORD(lParam));			//得到鼠标位置信息
		if (wParam&MK_RBUTTON)							//同时右键已经按下
			NowMousePos.mButtonMode=BTN_DBBUTTONDOWN;	//处理双键按下消息
		else 
			NowMousePos.mButtonMode=BTN_LBUTTONDOWN;
		mStartMousePos=NowMousePos.mNowPostion;
		OnMouseClick(hWnd,hInstance,NowMousePos,mStartMousePos);
		return 0;
	case WM_LBUTTONUP:									//左键弹起
		ReleaseCapture();								//释放鼠标捕获
		NowMousePos=getMousePosition(hWnd,hInstance,LOWORD(lParam),HIWORD(lParam));			//得到鼠标位置信息
		if (wParam&MK_RBUTTON||NowMousePos.mButtonMode==BTN_DBBUTTONDOWN)							//同时右键已经按下
			NowMousePos.mButtonMode=BTN_DBBUTTONUP;		//处理双键按下消息
		else 
			NowMousePos.mButtonMode=BTN_LBUTTONUP;
		OnMouseClick(hWnd,hInstance,NowMousePos,mStartMousePos);
		return 0;
	case WM_MOUSEMOVE:			//鼠标移动
		NowMousePos=getMousePosition(hWnd,hInstance,LOWORD(lParam),HIWORD(lParam));			//得到鼠标位置信息
		if (wParam&MK_LBUTTON){
			if (wParam&MK_RBUTTON)
				NowMousePos.mButtonMode=BTN_DBBUTTONMOVING;
			else
				NowMousePos.mButtonMode=BTN_LBUTTONMOVING;			
			OnMouseClick(hWnd,hInstance,NowMousePos,mStartMousePos);
		}
		return 0;
	case WM_RBUTTONDOWN:		//鼠标右键按下
		NowMousePos=getMousePosition(hWnd,hInstance,LOWORD(lParam),HIWORD(lParam));			//得到鼠标位置信息
		if (wParam&MK_LBUTTON)							//同时右键已经按下
			NowMousePos.mButtonMode=BTN_DBBUTTONDOWN;	//处理双键按下消息
		else
			NowMousePos.mButtonMode=BTN_RBUTTONDOWN;
		mStartMousePos=NowMousePos.mNowPostion;
		OnMouseClick(hWnd,hInstance,NowMousePos,mStartMousePos);		
		return 0;
	case WM_RBUTTONUP:			//鼠标右键弹起
		ReleaseCapture();
		NowMousePos=getMousePosition(hWnd,hInstance,LOWORD(lParam),HIWORD(lParam));			//得到鼠标位置信息
		if (wParam&MK_LBUTTON||NowMousePos.mButtonMode==BTN_DBBUTTONDOWN)							//同时右键已经按下
			NowMousePos.mButtonMode=BTN_DBBUTTONUP;		//处理双键按下消息
		else 
			NowMousePos.mButtonMode=BTN_RBUTTONUP;
		OnMouseClick(hWnd,hInstance,NowMousePos,mStartMousePos);
		return 0;
	case WM_TIMER:				//计时器消息
		timeCount++;			//时间增加
		//得到计时器大小,刷新该区域
		GetClientRect(hWnd,&rcWnd);
		rcRefresh=CreateRect(rcWnd.right-TIME_RIGHTSTND-TIME_WIDTH,TIME_TOPPOS,TIME_WIDTH,TIME_HEIGHT,FALSE);
		InvalidateRect(hWnd,&rcRefresh,FALSE);
		if (flagState & 0x0010){		//如果播放声音
			hrWare=FindResource(hInstance,MAKEINTRESOURCE(IDW_WAVE_TIME),TEXT("WAVE"));
			hGlobal=LoadResource(hInstance,hrWare);
			PlaySoundW((LPCWSTR)LockResource(hGlobal),NULL,SND_MEMORY|SND_ASYNC);
			DeleteObject(hrWare);
			DeleteObject(hGlobal);
		}
		return 0;
	case WM_ACTIVATEAPP:
		if (!wParam) KillTimer(hWnd,FLAG_TIMECOUNT);
			else if ((flagState &0x0001)&&(flagState&0x0002)) SetTimer(hWnd,FLAG_TIMECOUNT,1000,NULL);
		break;
	case WM_DESTROY:			//程序关闭时
		//写注册表,没有的键值同时创建
		if (RegOpenKeyEx(HKEY_CURRENT_USER,keyWinMine,0,KEY_ALL_ACCESS,&hKey)!=ERROR_SUCCESS) 
			RegCreateKey(HKEY_CURRENT_USER,keyWinMine,&hKey);
		RegSetValueEx(hKey,TEXT("Height"),NULL,REG_DWORD,(LPBYTE)&mineLineNum,dwSize1);
		RegSetValueEx(hKey,TEXT("Width"),NULL,REG_DWORD,(LPBYTE)&mineRowNum,dwSize1);
		RegSetValueEx(hKey,TEXT("Mines"),NULL,REG_DWORD,(LPBYTE)&mineBomb,dwSize1);
		dwTemp=(flagState&0x0f00)/0x0100;
		RegSetValueEx(hKey,TEXT("Difficulty"),NULL,REG_DWORD,(LPBYTE)&dwTemp,dwSize1);
		dwTemp=(flagState&0x0008)/0x0008;
		RegSetValueEx(hKey,TEXT("Mark"),NULL,REG_DWORD,(LPBYTE)&dwTemp,dwSize1);
		dwTemp=(flagState&0x0004)/0x0004;
		RegSetValueEx(hKey,TEXT("Color"),NULL,REG_DWORD,(LPBYTE)&dwTemp,dwSize1);
		dwTemp=(flagState&0x0010)/0x0010;
		RegSetValueEx(hKey,TEXT("Sound"),NULL,REG_DWORD,(LPBYTE)&dwTemp,dwSize1);
		dwTemp=(flagState&0x0001)/0x0001;
		RegSetValueEx(hKey,TEXT("AlreadyPlayed"),NULL,REG_DWORD,(LPBYTE)&dwTemp,dwSize1);
		dwTemp=getLevelWindowSize(hWnd).left;
		RegSetValueEx(hKey,TEXT("Xpos"),NULL,REG_DWORD,(LPBYTE)&dwTemp,dwSize1);
		dwTemp=getLevelWindowSize(hWnd).top;
		RegSetValueEx(hKey,TEXT("Ypos"),NULL,REG_DWORD,(LPBYTE)&dwTemp,dwSize1);
		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,dwType1,(LPBYTE)&dwTemp,dwSize1);
				RegCloseKey(hKeySub);
			}
			if (RegOpenKeyEx(hKey,lpsName[ix],NULL,KEY_WRITE,&hKeySub)!=ERROR_SUCCESS){		
				RegSetValueEx(hKey,lpsName[ix],NULL,dwType2,(LPBYTE)&lpAnonymity,dwSize2);
				RegCloseKey(hKeySub);
			}
		}
		RegCloseKey(hKey);
		PostQuitMessage (0) ;
		return 0 ;
	}
	return DefWindowProc (hWnd, message, wParam, lParam) ;
}

/*###########################################################
//功能:对话框消息处理
//参数:
//返回值:
//#########################################################*/
BOOL CALLBACK WinDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){
	int						width,height,bomb;
	static HINSTANCE		hInstance;
	LPCSTR					keyWinMine=TEXT("Software\\Microsoft\\winmine\\");
	HKEY					hKey;
	DWORD					dwTime;
	TCHAR					lpBuff[255],lpAnonymity[255],lpOutput[255],lpFormat[255];
	LPCTSTR					lpsTime[3]={TEXT("Time1"),TEXT("Time2"),TEXT("Time3")};
	LPCTSTR					lpsName[3]={TEXT("Name1"),TEXT("Name2"),TEXT("Name3")};
	int						i;
	DWORD 					dwSize1=sizeof(DWORD),dwType1=REG_DWORD,dwType2=REG_SZ,dwSize2=sizeof(lpBuff);
	switch (message){
	case WM_CREATE:			//创建
		hInstance=((LPCREATESTRUCT)lParam)->hInstance;	//实例句柄
		break;
	case WM_INITDIALOG:		//初始化
		//初始化 自定义对话框 为当前数据
		SetDlgItemInt(hDlg,IDC_CUSTOM_HEIGHT,mineRowNum,TRUE);	
		SetDlgItemInt(hDlg,IDC_CUSTOM_WIDTH,mineLineNum,TRUE);
		SetDlgItemInt(hDlg,IDC_CUSTOM_BOMB,mineBomb,TRUE);
		//初始化排行榜为注册表保存数据,如果没有键值 设置默认
		LoadString(hInstance,IDS_SECOND,lpFormat,sizeof(lpFormat));
		if (RegOpenKeyEx(HKEY_CURRENT_USER,keyWinMine,0,KEY_READ,&hKey)==ERROR_SUCCESS){
			for (i=0;i<3;i++){
				if (RegQueryValueEx(hKey,lpsTime[i],NULL,&dwType1,(LPBYTE)&dwTime,&dwSize1)!=ERROR_SUCCESS)//时间
					dwTime=999;
				sprintf(lpOutput,lpFormat,dwTime);			//格式化
				SetDlgItemText(hDlg,IDC_BEGINER_TIME+i,(LPCSTR)lpOutput);		//显示时间到排行榜对话框	
				if (RegQueryValueEx(hKey,lpsName[i],NULL,&dwType2,(LPBYTE)&lpBuff,&dwSize2)!=ERROR_SUCCESS)//姓名
					LoadString(hInstance,IDS_NORMAL_NAME,lpBuff,sizeof(lpBuff));			
				SetDlgItemText(hDlg,IDC_BEGINER_NAME+i,(LPCSTR)lpBuff);			//显示姓名到排行榜对话框
			}
			RegCloseKey(hKey);
		}
		//初始化输入新纪录对话框
		LoadString(hInstance,IDS_RECORD_BEGINER+(flagState&0x0f00)/0x0100,lpBuff,sizeof(lpBuff));
		SetDlgItemText(hDlg,IDC_RECORD_MSG,lpBuff);
		LoadString(hInstance,IDS_NORMAL_NAME,lpBuff,sizeof(lpBuff));
		SetDlgItemText(hDlg,IDC_RECORD_NAME,lpBuff);
		break;
	case WM_COMMAND:		//控件消息处理
		switch(LOWORD(wParam)){
		case IDC_CUSTOM_OK:		//自定义确认
			//设置长、宽、雷为对话框输入,如果越界设为最值
			width=(GetDlgItemInt(hDlg,IDC_CUSTOM_WIDTH,FALSE,TRUE)<MAX_LN_NUM)?GetDlgItemInt(hDlg,IDC_CUSTOM_WIDTH,FALSE,TRUE):MAX_LN_NUM;
			mineLineNum=width>MIN_LN_NUM?width:MIN_LN_NUM;
			height=GetDlgItemInt(hDlg,IDC_CUSTOM_HEIGHT,FALSE,TRUE)<MAX_COL_NUM?GetDlgItemInt(hDlg,IDC_CUSTOM_HEIGHT,FALSE,TRUE):MAX_COL_NUM;
			mineRowNum=height>MIN_COL_NUM?height:MIN_COL_NUM;
			bomb=GetDlgItemInt(hDlg,IDC_CUSTOM_BOMB,FALSE,TRUE)<MAX_BOMB_NUM?GetDlgItemInt(hDlg,IDC_CUSTOM_BOMB,FALSE,TRUE):MAX_BOMB_NUM;
			mineBomb=bomb>MIN_BOMB_NUM?bomb:MIN_BOMB_NUM;
			mineBomb=mineBomb<(mineRowNum*mineLineNum*0.8)?mineBomb:(int)floor(mineRowNum*mineLineNum*0.8);
			EndDialog(hDlg,TRUE);
			break;
		case IDC_CUSTOM_CANCEL:	//自定义取消,不处理,关闭
			EndDialog(hDlg,FALSE);
			break;
		case IDC_HEROLIST_OK:	//排行榜确定,不处理,关闭
			EndDialog(hDlg,TRUE);
			break;
		case IDC_HEROLIST_RENEW:	//排行榜重置,并写入注册表
			LoadString(hInstance,IDS_NORMAL_NAME,lpAnonymity,sizeof(lpAnonymity));
			if (RegOpenKeyEx(HKEY_CURRENT_USER,keyWinMine,0,KEY_WRITE,&hKey)==ERROR_SUCCESS){			
				for (i=0;i<3;i++){	
					dwTime=999;
					RegSetValueEx(hKey,lpsTime[i],NULL,dwType1,(LPBYTE)&dwTime,dwSize1);
					RegSetValueEx(hKey,lpsName[i],NULL,dwType2,(LPBYTE)&lpAnonymity,dwSize2);
				}
				RegCloseKey(hKey);
				SendMessage(hDlg,WM_INITDIALOG,wParam,lParam);
			}
			break;
		case IDC_RECORD_OK:			//输入新纪录确定
			GetDlgItemText(hDlg,IDC_RECORD_NAME,lpBuff,sizeof(lpBuff));
			if (strlen(lpBuff)>0){	//输入不为空		
				if (RegOpenKeyEx(HKEY_CURRENT_USER,keyWinMine,0,KEY_WRITE,&hKey)==ERROR_SUCCESS){
					RegSetValueEx(hKey,lpsTime[(flagState&0x0f00)/0x0100],NULL,dwType1,(LPBYTE)&timeCount,dwSize1);
					RegSetValueEx(hKey,lpsName[(flagState&0x0f00)/0x0100],NULL,dwType2,(LPBYTE)&lpBuff,dwSize2);
					RegCloseKey(hKey);
				}
			}
			EndDialog(hDlg,TRUE);			
			break;
		}
	}
	return FALSE;				//不处理的消息返回FALSE
}

/*###########################################################
功能:初始化地图基本信息
参数:窗口句柄、等级、宽、高、雷、标志数、时间计数标志、表情标志
返回值:成功 返回TRUE
###########################################################*/

BOOL IinitializeMapInfo(HWND hWnd,int level,int col,int ln,int bomb){	
	mineRowNum=(col<MAX_COL_NUM) ? col:MAX_COL_NUM;		//越界设为最值
	mineRowNum=(col>MIN_COL_NUM) ? col:MIN_COL_NUM;
	mineLineNum=(ln<MAX_LN_NUM) ? ln:MAX_LN_NUM;
	mineLineNum=(ln>MIN_LN_NUM) ? ln:MIN_LN_NUM;
	mineBomb=(bomb<MAX_BOMB_NUM) ? bomb:MAX_BOMB_NUM;
	mineBomb=(bomb>MIN_BOMB_NUM) ? bomb:MIN_BOMB_NUM;	
	flagState=(flagState & 0xf0ff)+level*0x0100;		//设置标志位
	flagState=(flagState & 0xfffe)+0x0001;
	flagState=flagState & 0xfffd;
	flagState=(flagState & 0x0fff)+0x4000;
	bombCount=bomb;
	timeCount=0;
	openCount=mineRowNum*mineLineNum-mineBomb;	
	KillTimer(hWnd,FLAG_TIMECOUNT);						//停止当前已有的计时器
	return TRUE; 
}
/*###########################################################
//功能:生成随机地图
//参数:窗口句柄
//返回值:
//###########################################################*/
BOOL CreateRandomMap(HWND hWnd){
	btLandmineMapinfo[0][0]=(BYTE)0;
	DWORD ixMine,iyMine,iMineBomb,icBomb=0,x,y;
	RECT rcMine;	
	for(int i=0;i<mineRowNum;i++)//初始为0
		for(int j=0;j<mineLineNum;j++) btLandmineMapinfo[i][j]=(BYTE)0;
	ixMine=(int)floor(mineRowNum/2);	//分4部分
	iyMine=(int)floor(mineLineNum/2);
	iMineBomb=(int)floor(mineBomb/4);
    srand((unsigned)time(NULL));		//得到时间随机	
	while (icBomb<iMineBomb) {//设置左上
		x=rand()%ixMine;
		y=rand()%iyMine;
		if (btLandmineMapinfo[x][y]!=0x10) {
			btLandmineMapinfo[x][y]=(BYTE)0x10;
			icBomb++;
		}	 
	}
	icBomb=0;	
	while (icBomb<iMineBomb) {//设置右上
		x=rand()%(mineRowNum-ixMine)+ixMine;
		y=rand()%iyMine;

⌨️ 快捷键说明

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