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

📄 winproc.cpp

📁 实现了windows Xp 中自带的扫雷的基本全部功能
💻 CPP
📖 第 1 页 / 共 4 页
字号:
						temp=btLandmineMapinfo[mineRowNum-nowMouse.mXpos-i][mineLineNum-nowMouse.mYpos-i];
						btLandmineMapinfo[mineRowNum-nowMouse.mXpos-i][mineLineNum-nowMouse.mYpos-i]=btLandmineMapinfo[nowMouse.mXpos][nowMouse.mYpos];
						btLandmineMapinfo[nowMouse.mXpos][nowMouse.mYpos]=temp;
						i++;
					}while (btLandmineMapinfo[nowMouse.mXpos][nowMouse.mYpos]>=0x10);		
				}
				flagState = (flagState & 0xfffd)+0x0002; //开始计时器
			}
			RefreshSmileFaceBmp(hWnd,FACE_TYPE_SMILE_POP);
			OnChangeMineInfo(hWnd,hInstance,nowMouse);			//改变地图信息
			break;
		case BTN_RBUTTONDOWN:
			if (btLandmineMapinfo[nowMouse.mXpos][nowMouse.mYpos]%0x10>0x02)	break;//已经翻开,返回
			if ((btLandmineMapinfo[nowMouse.mXpos][nowMouse.mYpos]%0x10)<0x01+(flagState & 0x0008)/0x0008) 
				btLandmineMapinfo[nowMouse.mXpos][nowMouse.mYpos]++;//如果标记:未翻开 -〉棋子-〉问号;如果不标记:未翻开 -〉棋子
			else if ((btLandmineMapinfo[nowMouse.mXpos][nowMouse.mYpos]%0x10)==0x01+(flagState & 0x0008)/0x0008)
				btLandmineMapinfo[nowMouse.mXpos][nowMouse.mYpos]-=(1+(flagState & 0x0008)/0x0008);//返回为未翻开的状态
			else if (btLandmineMapinfo[nowMouse.mXpos][nowMouse.mYpos]%0x10==0x02&&(flagState & 0x0008)==0)	{
				btLandmineMapinfo[nowMouse.mXpos][nowMouse.mYpos]-=2;
				bombCount--;
			}
			bombCount=bombCount-((btLandmineMapinfo[nowMouse.mXpos][nowMouse.mYpos]%0x10)%2)*(0x01+(((flagState & 0x0008)/0x0008+0x01)%0x02))+(btLandmineMapinfo[nowMouse.mXpos][nowMouse.mYpos]%0x10)/0x02+((flagState & 0x0008)/0x0008+0x01)%0x02;
			rcRefresh=CreateRect(nowMouse.mXpos,nowMouse.mYpos,1,1,TRUE);
			InvalidateRect(hWnd,&rcRefresh,FALSE);
			rcRefresh=CreateRect(COUNT_LEFTPOS,COUNT_TOPPOS,COUNT_WIDTH,COUNT_HEIGHT,FALSE);
			InvalidateRect(hWnd,&rcRefresh,FALSE);
		    break;			
		case BTN_DBBUTTONDOWN:
			OnChangeMineDown(hWnd,nowMouse.mXpos,nowMouse.mYpos,1);
			break;
		case BTN_DBBUTTONUP:
			OnChangeMineUpon(hWnd,nowMouse.mXpos,nowMouse.mYpos,1);	
			RefreshSmileFaceBmp(hWnd,FACE_TYPE_SMILE_POP);
			if (btLandmineMapinfo[nowMouse.mXpos][nowMouse.mYpos]%0x10>6){		//如果是翻开的数字		
				if (getRoundFlagNum(hWnd,nowMouse.mXpos,nowMouse.mYpos)==getRoundMineNum(hWnd,nowMouse.mXpos,nowMouse.mYpos)){	//两者相等
					for (int i=0;i<3;i++)								//翻开周围9格(会递归){
						for (int j=0;j<3;j++){								
							tempMouse.mXpos=nowMouse.mXpos-1+i;
							tempMouse.mYpos=nowMouse.mYpos-1+j;
							OnChangeMineInfo(hWnd,hInstance,tempMouse);
						}
					}
				}

			break;
		case BTN_LBUTTONMOVING:
			if (lastXpos!=nowMouse.mXpos||lastYpos!=nowMouse.mYpos){
				OnChangeMineUpon(hWnd,lastXpos,lastYpos,0);
				OnChangeMineDown(hWnd,nowMouse.mXpos,nowMouse.mYpos,0);
				lastXpos=nowMouse.mXpos;
				lastYpos=nowMouse.mYpos;
			}	
		    break;
		case BTN_DBBUTTONMOVING:
			if (lastXpos!=nowMouse.mXpos||lastYpos!=nowMouse.mYpos){
				OnChangeMineUpon(hWnd,lastXpos,lastYpos,1);
				OnChangeMineDown(hWnd,nowMouse.mXpos,nowMouse.mYpos,1);
				lastXpos=nowMouse.mXpos;
				lastYpos=nowMouse.mYpos;
			}	
			break;
		}
		break;
/////////////////////////////////////////////
	case MOUSE_ON_FACE:
	    switch(nowMouse.mButtonMode)
		{
		case BTN_LBUTTONDOWN:
			lastFace=(flagState&0xf000)/0x1000;
			RefreshSmileFaceBmp(hWnd,FACE_TYPE_SMILE_PUSH);			
			break;
		case BTN_LBUTTONUP:	
		case BTN_DBBUTTONUP:
			if (flagState&0x0001==0x0000)			//游戏未开始则开始
				flagState=(flagState&0xfffe)+0x0001;
			RefreshSmileFaceBmp(hWnd,FACE_TYPE_SMILE_POP);
			IinitializeMapInfo(hWnd,(flagState&0x0f00)/0x0100,mineRowNum,mineLineNum,mineBomb); //??
			CreateRandomMap(hWnd);
			InvalidateRect(hWnd,NULL,FALSE);
			lastFace=0x0004;
			break;
		}
	    break;
/////////////////////////////////////////////
	case MOUSE_ON_OTHER:

		if (startMouse==MOUSE_ON_FACE){
			RefreshSmileFaceBmp(hWnd,lastFace);
			return FALSE;
		}
		if (!(flagState&0x0001)) return 0;
	    switch(nowMouse.mButtonMode)
		{
		case BTN_LBUTTONDOWN:
		case BTN_DBBUTTONDOWN:
			RefreshSmileFaceBmp(hWnd,FACE_TYPE_EXCLAIM);			
			break;
		case BTN_RBUTTONUP:
		case BTN_LBUTTONUP:			
			RefreshSmileFaceBmp(hWnd,FACE_TYPE_SMILE_POP);
			break;
		case BTN_LBUTTONMOVING:
			if (lastXpos!=nowMouse.mXpos||lastYpos!=nowMouse.mYpos){
				OnChangeMineUpon(hWnd,lastXpos,lastYpos,0);
				OnChangeMineDown(hWnd,nowMouse.mXpos,nowMouse.mYpos,0);
				lastXpos=nowMouse.mXpos;
				lastYpos=nowMouse.mYpos;
			}	
		    break;
		case BTN_DBBUTTONMOVING:
			if (lastXpos!=nowMouse.mXpos||lastYpos!=nowMouse.mYpos){
				OnChangeMineUpon(hWnd,lastXpos,lastYpos,1);
				OnChangeMineDown(hWnd,nowMouse.mXpos,nowMouse.mYpos,1);
				lastXpos=nowMouse.mXpos;
				lastYpos=nowMouse.mYpos;
			}	
			break;
		}
		break;
	}
	if (openCount==0) setGameSucceed(hWnd,hInstance);	//判断结束:空格为0,剩下的都是雷(标记和为标记旗子的)处理游戏成功
	return FALSE;
}

/*###########################################################
功能:设置等级改变后菜单的check
参数:菜单句柄、等级
返回值:
###########################################################*/
BOOL OnCheckLevelMenu(HMENU hMenu,int level){
	CheckMenuItem(hMenu,IDM_ADVANCED,MF_UNCHECKED);//所有未打钩
	CheckMenuItem(hMenu,IDM_INTERMEDIATE,MF_UNCHECKED);
	CheckMenuItem(hMenu,IDM_BEGINNER,MF_UNCHECKED);
	CheckMenuItem(hMenu,IDM_CUSTOMDEFINE,MF_UNCHECKED);
	CheckMenuItem(hMenu,IDM_BEGINNER+level,MF_CHECKED); //钩选当前等级
	flagState=((flagState&0xf0ff)+level*0x0100);		//改变状态
	return TRUE;
}
/*###########################################################
功能:处理游戏成功
参数:
返回值:
###########################################################*/

BOOL setGameSucceed(HWND hWnd,HINSTANCE hInstance){
	RECT			rcRefresh;	
	LPCTSTR			keyWinMine=TEXT("Software\\Microsoft\\winmine\\");
	LONG			lErrorID=0;
	DWORD 			dwSize=sizeof(DWORD);
	HKEY			hKey;
	DWORD			dwTime;											
	LPCTSTR			lpsLevel[3]={TEXT("Time1"),TEXT("Time2"),TEXT("Time3")};
	openCount=-1;							//重置空格计数
	bombCount=0;
	rcRefresh=CreateRect(COUNT_LEFTPOS,COUNT_TOPPOS,COUNT_WIDTH,COUNT_HEIGHT,FALSE);	InvalidateRect(hWnd,&rcRefresh,FALSE);
	KillTimer(hWnd,FLAG_TIMECOUNT);		//结束计数
	if ((flagState&0x0010)!=0){
		HRSRC			hrWare=FindResource(hInstance,MAKEINTRESOURCE(IDW_WAVE_DONE),TEXT("WAVE")); //播放声音资源
		HGLOBAL			hGlobal=LoadResource(hInstance,hrWare);
		PlaySoundW((LPCWSTR)LockResource(hGlobal),NULL,SND_MEMORY|SND_ASYNC);
	}
	flagState=flagState& 0xfffe;				//设置结束状态,未计时
	RefreshSmileFaceBmp(hWnd,FACE_TYPE_COOL);	//表情-酷
	for (int i=0;i<mineRowNum;i++){				//标记未标记的雷为棋子
		for (int j=0;j<mineLineNum;j++){		
			if (btLandmineMapinfo[i][j]>=0x10)
			{
				btLandmineMapinfo[i][j]=0x11;
				rcRefresh=CreateRect(i,j,1,1,TRUE);
				InvalidateRect(hWnd,&rcRefresh,FALSE);
			}
		}
	}
	if ((flagState&0x0f00)>0x0200)	return FALSE;//如果登记为自定义,返回,不处理排行和注册表
	lErrorID=RegOpenKeyEx(HKEY_CURRENT_USER,keyWinMine,0,KEY_READ,&hKey);//读取当前保存消息
	if (lErrorID==ERROR_SUCCESS){
		lErrorID=RegQueryValueEx(hKey,lpsLevel[(flagState&0x0f00)/0x0100],NULL,NULL,(LPBYTE)&dwTime,&dwSize);
		if (lErrorID==ERROR_SUCCESS){
			if (timeCount<(int)dwTime)DialogBox(hInstance,MAKEINTRESOURCE(IDD_RECORDDLG),hWnd,WinDlgProc);   //破纪录了//输入新纪录
		} 
		else ErrorMessageBox(hWnd,hInstance,IDS_ERRORID,lErrorID);	
	}else ErrorMessageBox(hWnd,hInstance,IDS_ERRORID,lErrorID);
	RegCloseKey(hKey);
	return TRUE;
}

/*###########################################################
功能:错误消息对话框
参数:窗口句柄、实例句柄、消息、消息id
返回值:
###########################################################*/

BOOL ErrorMessageBox(HWND hWnd,HINSTANCE hInstance,UINT IDMessage,UINT IDError){
	TCHAR lpFormat[255],lpOutput[255];
	if (IDError!=0){
		LoadString(hInstance,IDMessage,lpFormat,sizeof(lpFormat));
		sprintf(lpOutput,lpFormat,IDError);
	}
	else LoadString(hInstance,IDMessage,lpOutput,sizeof(lpOutput));
	MessageBox(hWnd,lpOutput,"错误",MB_ICONERROR);
	return TRUE;
}

/*###########################################################
功能:是方格显示为按下的状态
参数:鼠标位置结构体
返回值:
###########################################################*/

BOOL OnChangeMineDown(HWND hWnd,int xPos,int yPos,int mNum){
	RECT rcRefresh;
	for (int i=xPos-mNum;i<=xPos+mNum;i++){
		for (int j=yPos-mNum;j<=yPos+mNum;j++){
			if (i>=0&&i<mineRowNum&&j>=0&&j<mineLineNum&&btLandmineMapinfo[i][j]<0x20){ //越界,不处理
				if (btLandmineMapinfo[i][j]%0x10==0) btLandmineMapinfo[i][j]+=0x2f;		//0x2f 显示为 0的状态 0x
				if (btLandmineMapinfo[i][j]%0x10==2) btLandmineMapinfo[i][j]+=0x24;
				rcRefresh=CreateRect(i,j,mNum+1,mNum+1,TRUE);
				InvalidateRect(hWnd,&rcRefresh,FALSE);
			}
		}
	}
	return TRUE;
}

/*###########################################################
功能:还原显示为按下状态的方格
参数:鼠标位置结构体
返回值:
###########################################################*/

BOOL OnChangeMineUpon(HWND hWnd,int xPos,int yPos,int mNum){
	RECT rcRefresh;
	for (int i=xPos-mNum;i<=xPos+mNum;i++){
		for (int j=yPos-mNum;j<=yPos+mNum;j++){
			if (i>=0&&i<mineRowNum&&j>=0&&j<mineLineNum){ //越界,不处理			
				if (btLandmineMapinfo[i][j]>=0x20){					
					if (btLandmineMapinfo[i][j]%0x10==0x0f)	btLandmineMapinfo[i][j]-=0x2f;		//0x2f 显示为 0的状态 0x
					if (btLandmineMapinfo[i][j]%0x10==0x06) btLandmineMapinfo[i][j]-=0x24;
					rcRefresh=CreateRect(i,j,mNum+1,mNum+1,TRUE);
					InvalidateRect(hWnd,&rcRefresh,FALSE);
				}
			}
		}
	}
	return TRUE;
}

⌨️ 快捷键说明

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