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 + -
显示快捷键?