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