📄 winproc.cpp
字号:
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 + -