winmine.c

来自「应用win32编写的一个扫雷程序」· C语言 代码 · 共 857 行 · 第 1/3 页

C
857
字号
                                        hdcMem6,0,16,SRCCOPY);  //  显示正确标记雷按钮状态 
							   else  
							   {
								   if(NumLTBob[i][j][1]==-3&&NumLTBob[i][j][0]==-1)
								   {
									   BitBlt(hdc,10+i*cxBitmap1,50+j*cyBitmap1,cxBitmap6,cyBitmap6, 
                                                hdcMem6,0,80,SRCCOPY);  //  把显示状态问号的改成雷
                                    }
							  
							      else 
								  {
								      if(NumLTBob[i][j][0]==-1&&NumLTBob[i][j][1]==0)
									  {
										  BitBlt(hdc,10+i*cxBitmap1,50+j*cyBitmap1,cxBitmap6,cyBitmap6, 
                                               hdcMem6,0,80,SRCCOPY);
                                           NumLTBob[i][j][1]==-1;
									  }
								  
							       else 
								   {
									   if((NumLTBob[i][j][0]>=1&&NumLTBob[i][j][0]<=8)&&(NumLTBob[i][j][1]==0))
									   {
										   BitBlt(hdc,10+i*cxBitmap1,50+j*cyBitmap1,cxBitmap6,cyBitmap6, 
                                              hdcMem6,0,256-(NumLTBob[i][j][0]+1)*16,SRCCOPY);
                                           NumLTBob[i][j][1]=NumLTBob[i][j][0];
									   }
							         else 
									 {
										 if(NumLTBob[i][j][0]==0&&NumLTBob[i][j][1]==0)
										 {
											 BitBlt(hdc,10+i*cxBitmap1,50+j*cyBitmap1,cxBitmap6,cyBitmap6, 
                                              hdcMem6,0,240,SRCCOPY);
                                             NumLTBob[i][j][1]=9;
										 }
								    else  numofBob=0; //恢复判断是否雷已挖完的标志,重新置零
							   }} }}
						 }
					    }
				      KillTimer(hwnd,ID_TIMER1);
					    countime=0;upcount=0;
					 }
				  }
				}
			  }
			 SetRect(&rect1, cxClient/2-15,14,cxClient/2-15+cxBitmap5,14+cyBitmap5);
				  if(PtInRect(&rect1,pt)) 
				  {
					 BitBlt(hdc,cxClient/2-15,14,cxBitmap5,cyBitmap5,hdcMem5,0,96,SRCCOPY);// 恢复脸谱
				     initialBob(NumLTBob,100,100);
					 InvalidateRect(hwnd,NULL,NULL);
					 KillTimer(hwnd,ID_TIMER1);
					 iCountcopy=iCount;flag=0;
					 countime=0;upcount=0;flag1=0;finish=0;
					 numofBob=0; //恢复判断是否雷已挖完的标志,重新置零
				  }
			  singledown=0;  //up时恢复0,以备后用
        if(doubledown==1)
		  {
             BitBlt(hdc,rect.left,rect.top,cxBitmap1,cyBitmap1,hdcMem1,0,16,SRCCOPY);//中间恢复 
			  for(m=-1;m<=1;m+=2)	           //恢复了左右键被砖块同时按下的情况
			     for(n=1;n>=-1;n-=2)
				{ 
			         pt1.x=rect.left+m*cxBitmap1;pt1.y=rect.top+n*cyBitmap1;
					 if(PtInRect(&rect2,pt1)&&NumLTBob[cxPostion+m][cyPostion+n][1]==0)
			           BitBlt(hdc, rect.left+m*cxBitmap1,rect.top+n*cyBitmap1 ,cxBitmap1,cyBitmap1, 
                              hdcMem1,0, 16,SRCCOPY); 
                     pt1.x=rect.left+n*cxBitmap1;pt1.y=rect.top+m*cyBitmap1;
					 if(PtInRect(&rect2,pt1)&&NumLTBob[cxPostion+n][cyPostion+m][1]==0)
			           BitBlt(hdc, rect.left+n*cxBitmap1,rect.top+m*cyBitmap1 ,cxBitmap1,cyBitmap1, 
                           hdcMem1,0,16,SRCCOPY);
					 pt1.x=rect.left-n*cxBitmap1;pt1.y=rect.top;
					 if(PtInRect(&rect2,pt1)&&NumLTBob[cxPostion-n][cyPostion][1]==0)
				         BitBlt(hdc, rect.left-n*cxBitmap1,rect.top,cxBitmap1,cyBitmap1, 
                           hdcMem1,0,16,SRCCOPY); 
					 pt1.x=rect.left;pt1.y=rect.top+n*cyBitmap1;
					 if(PtInRect(&rect2,pt1)&&NumLTBob[cxPostion][cyPostion+n][1]==0)
				        BitBlt(hdc, rect.left,rect.top+n*cyBitmap1 ,cxBitmap1,cyBitmap1, 
                                 hdcMem1,0, 16,SRCCOPY); 
				}
              doubledown=0;
		  }
	
      }
	  if(wParam==MK_RBUTTON)     
	  {
		  if(NumLTBob[cxPostion][cyPostion][1]==-2)
			  BitBlt(hdc, rect.left,rect.top ,cxBitmap6,cyBitmap6, 
                    hdcMem6,0,16,SRCCOPY); 
		  if(NumLTBob[cxPostion][cyPostion][1]==-3)
			   BitBlt(hdc, rect.left,rect.top ,cxBitmap6,cyBitmap6, 
                    hdcMem6,0,32,SRCCOPY); 
		  if((NumLTBob[cxPostion][cyPostion][1]>=1&&NumLTBob[cxPostion][cyPostion][1]<=8)
					                 &&NumLTBob[cxPostion][cyPostion][1]!=0)  //数字
				 BitBlt(hdc,rect.left,rect.top,cxBitmap6,cyBitmap6, 
                       hdcMem6,0,256-(NumLTBob[cxPostion][cyPostion][0]+1)*16,SRCCOPY);
	  }
		ReleaseDC(hwnd,hdc);
          return 0;
      
	 
	 case WM_COMMAND:
          hMenu = GetMenu (hwnd) ;

          switch (LOWORD (wParam))
          {
          case IDM_BEGIN:
			    
			    initialBob(NumLTBob,100,100);
			    InvalidateRect(hwnd,NULL,NULL);
				iCountcopy=iCount;flag=0;
				upcount=0;finish=0;
                countime=0; flag1=0;
				numofBob=0; //恢复判断是否雷已挖完的标志,重新置零
				KillTimer(hwnd,ID_TIMER1);
				break;

          case IDM_BEGINNER:
		  case IDM_INTERMEDIATE:                                            // fall through
          case IDM_ADVANCED:

			   KillTimer(hwnd,ID_TIMER1);
			   upcount=0;
               countime=0;finish=0;
			   CheckMenuItem (hMenu, ilevel, MF_UNCHECKED) ;
               ilevel= LOWORD (wParam) ;
               CheckMenuItem (hMenu, ilevel, MF_CHECKED) ;
               if(ilevel==IDM_INTERMEDIATE) 
			   {iWidth=16;iHeight=16;iCount=40; }         //作为自定义雷区的默认值
			   if(ilevel==IDM_ADVANCED) 
			   {iWidth=30;iHeight=16;iCount=99; }         //作为自定义雷区的默认值
			   if(ilevel==IDM_BEGINNER) 
			   {iWidth=9;iHeight=9;iCount=10; } 
			   iCountcopy=iCount;
			   flag=0;flag1=0;
			   initialBob(NumLTBob,100,100);
			   MoveWindow(hwnd,200,200,16*(iWidth+1.625),16*(iHeight+7.125),TRUE);
			   InvalidateRect(hwnd,NULL,NULL);
                break;
         
		  case  IDM_CUSTOMDEFINE:          //自定义对话框
			    CheckMenuItem (hMenu, ilevel, MF_UNCHECKED) ;
                ilevel = LOWORD (wParam) ;
                CheckMenuItem (hMenu, ilevel, MF_CHECKED) ;
			    DialogBox(hInstance,TEXT("custom"),hwnd,CustomDlgProc); //显示自定义对话框
			    break; 
         
		  	case IDM_ABOUT:				//关于
				
				LoadString(hInstance,IDS_AUTHER,lpAnonymity,sizeof(lpAnonymity));
				ShellAbout(hwnd,TEXT("扫雷 ..."),lpAnonymity,hIcon);
				break;

			case IDM_CONTENTS:			//帮助:目录
				//打开系统的帮助,调用htmlhelp api函数
				LoadString(hInstance,IDS_HELPFILEPATH_WIN,lpAnonymity,sizeof(lpAnonymity));
				if (HtmlHelp(NULL,lpAnonymity,HH_DISPLAY_TOPIC,NULL)==0)
				{	//系统帮助不存在,在当前目录寻找
					GetCurrentDirectory(sizeof(lpAnonymity),lpAnonymity);
					strcat(lpAnonymity,TEXT("\\help\\winmine.chm"));
					if (HtmlHelp(NULL,lpAnonymity,HH_DISPLAY_TOPIC,NULL)==0)
						//仍然无法打开,显示错误消息
						MessageBox(hwnd,TEXT("产生一个错误:\r\n应用程序无法找到帮助文件\"WinMine.chm\"\t\r\n请确认文件存在,或者重新安装程序。"),TEXT("错误信息"),MB_ICONERROR);
				}
				break;
			
			case IDM_SEARCHHELP:		//帮助:索引
				LoadString(hInstance,IDS_HELPFILEPATH_WIN,lpAnonymity,sizeof(lpAnonymity));
				if (HtmlHelp(NULL, lpAnonymity,HH_DISPLAY_TOPIC,0)==0)
				{
					GetCurrentDirectory(sizeof(lpAnonymity),lpAnonymity);
					strcat(lpAnonymity,TEXT("\\help\\winmine.chm"));
					if (HtmlHelp(NULL,lpAnonymity,HH_DISPLAY_TOPIC,NULL)==0)
						MessageBox(hwnd,TEXT("产生一个错误:\r\n应用程序无法找到帮助文件\"WinMine.chm\"\t\r\n请确认文件存在,或者重新安装程序。"),TEXT("错误信息"),MB_ICONERROR);
				}				
				break;
		
			case IDM_USEHELP:			//帮助: 使用帮助
				LoadString(hInstance,IDS_HELPFILEPATH_HELP,lpAnonymity,sizeof(lpAnonymity));
				if (HtmlHelp(NULL, lpAnonymity, HH_DISPLAY_TOPIC,0)==0)
				{
					GetCurrentDirectory(sizeof(lpAnonymity),lpAnonymity);
					strcat(lpAnonymity,TEXT("\\help\\nthelp.chm"));
					if (HtmlHelp(NULL,lpAnonymity,HH_DISPLAY_TOPIC,NULL)==0)
						MessageBox(hwnd,TEXT("产生一个错误:\r\n应用程序无法找到帮助文件\"NThelp.chm\"\t\r\n请确认文件存在,或者重新安装程序。"),TEXT("错误信息"),MB_ICONERROR);
				}	
				break;
	
             case IDM_EXIT:
			  SendMessage(hwnd,WM_DESTROY,0,0);
			  break;

          }
          return 0 ;

	case WM_CUSTOM:    //接收从自定义对话框的消息,显示和刷新窗口
        
		iWidth=HIWORD(lParam);
		iHeight=LOWORD(lParam);
		iCount=wParam;flag1=flag=0;
		countime=0;finish=0;
		iCountcopy=iCount;
		MoveWindow(hwnd,200,200,16*(HIWORD(lParam)+1.625),16*(LOWORD(lParam)+7.125),TRUE);
		initialBob(NumLTBob,100,100);
		InvalidateRect(hwnd,NULL,NULL);
		upcount=0;
		return 0;
     case WM_PAINT:
          
		hdc = BeginPaint (hwnd, &ps) ;
	    StretchBlt(hdc,7, 7,cxBitmap3*iWidth/9-(iWidth/16)*7.625, cyBitmap3,hdcMem3, 
				   0,0,cxBitmap3,cyBitmap3, SRCCOPY); 
        StretchBlt(hdc,9,7,5,cyBitmap3,hdcMem3, 
					5,0,5,cyBitmap3,SRCCOPY);
        k=iCount/100;
		j=(iCount%100)/10;
		i=iCount%10;
		BitBlt(hdc,14,14,cxBitmap4,cyBitmap4,hdcMem4,0,276-(k+1)*23,SRCCOPY);
		BitBlt(hdc,27,14,cxBitmap4,cyBitmap4,hdcMem4,0,276-(j+1)*23,SRCCOPY); 
		BitBlt(hdc,40,14,cxBitmap4,cyBitmap4,hdcMem4,0,276-(i+1)*23,SRCCOPY);
        BitBlt(hdc,cxClient/2-15,14,cxBitmap5,cyBitmap5,hdcMem5,0,96,SRCCOPY);
	    BitBlt(hdc,cxClient-60,14,cxBitmap4,cyBitmap4,hdcMem4,0,253,SRCCOPY);
		BitBlt(hdc,cxClient-47,14,cxBitmap4,cyBitmap4,hdcMem4,0,253,SRCCOPY);
	    BitBlt(hdc,cxClient-34,14,cxBitmap4,cyBitmap4,hdcMem4,0,253,SRCCOPY);
		StretchBlt(hdc,7,47,cxBitmap2*iWidth/10+iWidth+4, cyBitmap2*iHeight/10+iHeight+4, hdcMem2,
				  0,0,cxBitmap2, cyBitmap2, SRCCOPY);
	  for (x =10,i=0 ; x<cxClient-20 ; x+=cxBitmap1,i++)
		 {
			for (y =50,j=0 ;y<cyClient-20 ;y+=cyBitmap1,j++)
			 {
				 /* if(i==cxPostion&&j==cyPostion&&finish)
                     BitBlt(hdc,10+i*cxBitmap1,50+j*cyBitmap1,cxBitmap6,cyBitmap6, 
                              hdcMem6,0,48,SRCCOPY);           //显示按下的状态*/
				 /*else*/ if(NumLTBob[i][j][1]==9)
                     BitBlt(hdc,10+i*cxBitmap1,50+j*cyBitmap1,cxBitmap6,cyBitmap6, hdcMem6,0,240,SRCCOPY);
				 else if(NumLTBob[i][j][1]>=1&&NumLTBob[i][j][1]<=8)
                     BitBlt(hdc,10+i*cxBitmap1,50+j*cyBitmap1,cxBitmap6,cyBitmap6, 
                            hdcMem6,0,256-(NumLTBob[i][j][0]+1)*16,SRCCOPY);
				 else if(NumLTBob[i][j][1]==-2&&NumLTBob[i][j][0]!=-1&&finish)
                         BitBlt(hdc,10+i*cxBitmap1,50+j*cyBitmap1,cxBitmap6,cyBitmap6, 
                         hdcMem6,0,64,SRCCOPY);
				 else if(NumLTBob[i][j][1]==-2&&NumLTBob[i][j][0]!=-1&&!finish)
                         BitBlt(hdc,10+i*cxBitmap1,50+j*cyBitmap1,cxBitmap6,cyBitmap6, 
                         hdcMem6,0,16,SRCCOPY);
				 else if(NumLTBob[i][j][1]==-2&&NumLTBob[i][j][0]==-1&&finish)
                        BitBlt(hdc,10+i*cxBitmap1,50+j*cyBitmap1,cxBitmap6,cyBitmap6, 
                              hdcMem6,0,16,SRCCOPY);  //  显示正确标记雷按钮状态 
			     else if(NumLTBob[i][j][1]==-1&&NumLTBob[i][j][0]==-1)
                        BitBlt(hdc,10+i*cxBitmap1,50+j*cyBitmap1,cxBitmap6,cyBitmap6, 
                              hdcMem6,0,80,SRCCOPY);  
			    else if (NumLTBob[i][j][1]==-3&&NumLTBob[i][j][0]==-1&&finish)
                         BitBlt(hdc,10+i*cxBitmap1,50+j*cyBitmap1,cxBitmap6,cyBitmap6, 
                               hdcMem6,0,80,SRCCOPY);  //  把显示状态问号的改成雷
				 else if (NumLTBob[i][j][1]==-3&&NumLTBob[i][j][0]==-1&&!finish)
                         BitBlt(hdc,10+i*cxBitmap1,50+j*cyBitmap1,cxBitmap6,cyBitmap6, 
                               hdcMem6,0,32,SRCCOPY);  
				else if(NumLTBob[i][j][1]==-3&&NumLTBob[i][j][0]==0)
                         BitBlt(hdc,10+i*cxBitmap1,50+j*cyBitmap1,cxBitmap6,cyBitmap6, 
                                hdcMem6,0,32,SRCCOPY); 
				else 
		        BitBlt (hdc, x, y, cxBitmap1, cyBitmap1, 
                        hdcMem1, 0, cyBitmap1, SRCCOPY);
			}
		 }
          EndPaint (hwnd, &ps) ;
          return 0 ;

     case WM_DESTROY:
          DeleteDC (hdcMem1) ;
		  DeleteDC (hdcMem2) ;
		  DeleteDC (hdcMem3) ;
		  DeleteDC (hdcMem4) ;
		  DeleteDC (hdcMem5) ;
		  DeleteDC (hdcMem6) ;
          DeleteObject (hBitmap1) ;
          DeleteObject (hBitmap3) ;
          DeleteObject (hBitmap2) ;
		  DeleteObject (hBitmap4) ;
          DeleteObject (hBitmap5) ;
		  DeleteObject (hBitmap6) ;
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}

⌨️ 快捷键说明

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