📄 winproc.cpp
字号:
/*//////////////////////文件说明//////////////////////////
// //
//文件名: WinProc.cpp //
//功 能: 功能函数的定义和实现 //
//作 者: //
// //
////////////////////////////////////////////////////////*/
#include "WinProc.h"
/*###########################################################
功能:主窗口的消息处理回调函数
参数:
返回值:
###########################################################*/
LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hDC,hDCMem;
static HICON hIcon; //程序图标句柄
static HINSTANCE hInstance; //程序实例句柄
static HMENU hMenu; //程序主菜单句柄
PAINTSTRUCT ps;
HBRUSH hBrush;
HPEN hPen;
HBITMAP hBmp;
int ix=0,iy=0;
RECT rcWnd,rcRefresh; //窗口区域和刷新区域
static tagMouseState NowMousePos; //鼠标状态结构体
static int mStartMousePos;
HRSRC hrWare; //wave资源句柄
HGLOBAL hGlobal;
LPCTSTR keyWinMine=TEXT("Software\\Microsoft\\winmine\\"); //注册表主键
HKEY hKey,hKeySub; //注册表键句柄
DWORD dwTemp; //临时变量
LPCTSTR lpsTime[3]={TEXT("Time1"),TEXT("Time2"),TEXT("Time3")};
LPCTSTR lpsName[3]={TEXT("Name1"),TEXT("Name2"),TEXT("Name3")};
TCHAR lpAnonymity[255]; //临时变量
DWORD dwSize1=sizeof(DWORD),dwType1=REG_DWORD,dwType2=REG_SZ,dwSize2=sizeof(lpAnonymity);
//###########################################################################################################
switch (message)
{
case WM_CREATE:
hDC=GetDC(hWnd);
hInstance=((LPCREATESTRUCT)lParam)->hInstance;
hMenu=((LPCREATESTRUCT)lParam)->hMenu;
//注册表读取已保存的信息,如果相关键值不存在则创建
if (RegOpenKeyEx(HKEY_CURRENT_USER,keyWinMine,0,KEY_ALL_ACCESS,&hKey)!=ERROR_SUCCESS){
RegCreateKey(HKEY_CURRENT_USER,keyWinMine,&hKey);
}
if (RegQueryValueEx(hKey,TEXT("Height"),NULL,&dwType1,(LPBYTE)&mineLineNum,&dwSize1)!=ERROR_SUCCESS){
mineLineNum=BEGINER_LN_NUM;
RegSetValueEx(hKey,TEXT("Height"),NULL,REG_DWORD,(LPBYTE)&mineLineNum,dwSize1);
}
if (RegQueryValueEx(hKey,TEXT("Width"),NULL,&dwType1,(LPBYTE)&mineRowNum,&dwSize1)!=ERROR_SUCCESS){
mineRowNum=BEGINER_COL_NUM;
RegSetValueEx(hKey,TEXT("Width"),NULL,REG_DWORD,(LPBYTE)&mineRowNum,dwSize1);
}
if (RegQueryValueEx(hKey,TEXT("Mines"),NULL,&dwType1,(LPBYTE)&mineBomb,&dwSize1)!=ERROR_SUCCESS){
mineBomb=BEGINER_BOMB_NUM;
RegSetValueEx(hKey,TEXT("Mines"),NULL,REG_DWORD,(LPBYTE)&mineBomb,dwSize1);
}
if (RegQueryValueEx(hKey,TEXT("Sound"),NULL,&dwType1,(LPBYTE)&dwTemp,&dwSize1)!=ERROR_SUCCESS){
dwTemp=0;
RegSetValueEx(hKey,TEXT("Sound"),NULL,REG_DWORD,(LPBYTE)&dwTemp,dwSize1);
}
flagState=(flagState&0xffef)+dwTemp*FLAG_SOUND;
if (RegQueryValueEx(hKey,TEXT("Difficulty"),NULL,&dwType1,(LPBYTE)&dwTemp,&dwSize1)!=ERROR_SUCCESS){
dwTemp=0;
RegSetValueEx(hKey,TEXT("Difficulty"),NULL,REG_DWORD,(LPBYTE)&dwTemp,dwSize1);
}
flagState=(flagState&0xf0ff)+dwTemp*0x0100;
if (RegQueryValueEx(hKey,TEXT("Mark"),NULL,&dwType1,(LPBYTE)&dwTemp,&dwSize1)!=ERROR_SUCCESS){
dwTemp=1;
RegSetValueEx(hKey,TEXT("Mark"),NULL,REG_DWORD,(LPBYTE)&dwTemp,dwSize1);
}
flagState=(flagState&0xfff7)+dwTemp*FLAG_MARK;
if (RegQueryValueEx(hKey,TEXT("Color"),NULL,&dwType1,(LPBYTE)&dwTemp,&dwSize1)!=ERROR_SUCCESS){
dwTemp=1;
RegSetValueEx(hKey,TEXT("Color"),NULL,REG_DWORD,(LPBYTE)&dwTemp,dwSize1);
}
flagState=(flagState&0xfffb)+dwTemp*FLAG_COLOR;
if (RegQueryValueEx(hKey,TEXT("AlreadyPlayed"),NULL,&dwType1,(LPBYTE)&dwTemp,&dwSize1)!=ERROR_SUCCESS){
dwTemp=1;
RegSetValueEx(hKey,TEXT("AlreadyPlayed"),NULL,REG_DWORD,(LPBYTE)&dwTemp,dwSize1);
}
flagState=(flagState&0xfffe)+1*FLAG_ALREADPLAYED; 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,REG_DWORD,(LPBYTE)&dwTemp,dwSize1);
RegCloseKey(hKeySub);
}
if (RegOpenKeyEx(hKey,lpsName[ix],NULL,KEY_WRITE,&hKeySub)!=ERROR_SUCCESS){
RegSetValueEx(hKey,lpsName[ix],NULL,REG_SZ,(LPBYTE)&lpAnonymity,dwSize2);
RegCloseKey(hKeySub);
}
}//初始化窗口信息
IinitializeMapInfo(hWnd,(flagState&0x0f00)/0x0100,mineRowNum,mineLineNum,mineBomb);
CheckMenuItem(hMenu,IDM_MARK,((flagState&0x0008)==FLAG_MARK) ? MF_CHECKED:MF_UNCHECKED);
CheckMenuItem(hMenu,IDM_COLOR,((flagState&0x0004)==FLAG_COLOR) ? MF_CHECKED:MF_UNCHECKED);
CheckMenuItem(hMenu,IDM_SOUND,((flagState&0x0010)==FLAG_SOUND) ? MF_CHECKED:MF_UNCHECKED);
OnCheckLevelMenu(hMenu,(flagState&0x0f00)/0x0100);
rcWnd=getLevelWindowSize(hWnd);//计算窗口大小,初始化地图数据
if (RegQueryValueEx(hKey,TEXT("Xpos"),NULL,&dwType1,(LPBYTE)&dwTemp,&dwSize1)==ERROR_SUCCESS) rcWnd.left=dwTemp;
if (RegQueryValueEx(hKey,TEXT("Ypos"),NULL,&dwType1,(LPBYTE)&dwTemp,&dwSize1)==ERROR_SUCCESS) rcWnd.top=dwTemp;
CreateRandomMap(hWnd);
MoveWindow(hWnd,rcWnd.left,rcWnd.top,rcWnd.right,rcWnd.bottom,TRUE);
RegCloseKey(hKey);
ReleaseDC(hWnd,hDC);
hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDC_APPICON)) ;
return 0;
case WM_PAINT:
hDC = BeginPaint (hWnd, &ps);
hDCMem= CreateCompatibleDC(hDC);
GetClientRect(hWnd,&rcWnd);
hPen=(HPEN)GetStockObject(NULL_PEN);
SelectObject(hDC,hPen);
hBrush=CreateSolidBrush(RGB(192,192,192));
SelectObject(hDC,hBrush);
Rectangle(hDC,3,3,rcWnd.right+1,rcWnd.bottom+1);//绘制底层背景
DeleteObject(hBrush);
hBrush=CreateSolidBrush(RGB(8+(flagState&0x0004)*30,8+(flagState&0x0004)*30,8+(flagState&0x0004)*30));
SelectObject(hDC,hBrush);
Rectangle(hDC,MAIN_LEFTSTND+(mineRowNum*MINE_BITMAP_WIDTH-FACE_BITMAP_WIDTH)/2-1,(MAIN_TOPSTND-FACE_BITMAP_HEIGHT)/2-1,MAIN_LEFTSTND+(mineRowNum*MINE_BITMAP_WIDTH-FACE_BITMAP_WIDTH)/2+FACE_BITMAP_WIDTH+2,(MAIN_TOPSTND-FACE_BITMAP_HEIGHT)/2+FACE_BITMAP_HEIGHT+2); //绘制表情背景
DeleteObject(hBrush);
DeleteObject(hPen);
//表情贴图
hBmp=LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_SMILE_BLACK+(flagState&0x0004)/0x0004));
SelectObject(hDCMem,hBmp);
BitBlt(hDC,MAIN_LEFTSTND+(mineRowNum*MINE_BITMAP_WIDTH-FACE_BITMAP_WIDTH)/2,(MAIN_TOPSTND-FACE_BITMAP_HEIGHT)/2,FACE_BITMAP_WIDTH,FACE_BITMAP_HEIGHT,hDCMem,0, ((flagState & 0xf000)/0x1000) *FACE_BITMAP_HEIGHT,SRCCOPY);
DeleteObject(hBmp);
//计雷器贴图
hBmp=LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_NUM_BLACK+(flagState&0x0004)/0x0004));
SelectObject(hDCMem,hBmp);
BitBlt(hDC,COUNT_LEFTPOS,COUNT_TOPPOS,NUM_BITMAP_WIDTH,NUM_BITMAP_HEIGHT,hDCMem,0,NUM_BITMAP_HEIGHT*(bombCount<0?0:11-(int)floor(bombCount/100)),SRCCOPY);
BitBlt(hDC,COUNT_LEFTPOS+NUM_BITMAP_WIDTH,COUNT_TOPPOS,NUM_BITMAP_WIDTH,NUM_BITMAP_HEIGHT,hDCMem,0,NUM_BITMAP_HEIGHT*(11-(int)floor((abs(bombCount)-(int)floor(abs(bombCount)/100)*100)/10)),SRCCOPY);
BitBlt(hDC,COUNT_LEFTPOS+NUM_BITMAP_WIDTH*2,COUNT_TOPPOS,NUM_BITMAP_WIDTH,NUM_BITMAP_HEIGHT,hDCMem,0,NUM_BITMAP_HEIGHT*(11-(abs(bombCount)-(int)floor(abs(bombCount)/10)*10)),SRCCOPY);
//计时器贴图
BitBlt(hDC,rcWnd.right-TIME_RIGHTSTND-TIME_WIDTH,TIME_TOPPOS,NUM_BITMAP_WIDTH,NUM_BITMAP_HEIGHT,hDCMem,0,NUM_BITMAP_HEIGHT*(11-(timeCount<1000?(int)floor(timeCount/100):9)),SRCCOPY);
BitBlt(hDC,rcWnd.right-TIME_RIGHTSTND-TIME_WIDTH+NUM_BITMAP_WIDTH,TIME_TOPPOS,NUM_BITMAP_WIDTH,NUM_BITMAP_HEIGHT,hDCMem,0,NUM_BITMAP_HEIGHT*(11-(timeCount<1000?(int)floor((timeCount-(int)floor(timeCount/100)*100)/10):9)),SRCCOPY);
BitBlt(hDC,rcWnd.right-TIME_RIGHTSTND-TIME_WIDTH+NUM_BITMAP_WIDTH*2,TIME_TOPPOS,NUM_BITMAP_WIDTH,NUM_BITMAP_HEIGHT,hDCMem,0,NUM_BITMAP_HEIGHT*(11-(timeCount<1000?(timeCount-(int)floor(timeCount/10)*10):9)),SRCCOPY);
DeleteObject(hBmp);
//立体边框描绘
rcRefresh=CreateRect(MAIN_LEFTSTND-LINE_LIGHTEN_THICK,MAIN_TOPSTND-LINE_LIGHTEN_THICK,rcWnd.right-MAIN_RIGHTSTND-MAIN_LEFTSTND+2*LINE_LIGHTEN_THICK,rcWnd.bottom-MAIN_TOPSTND-MAIN_BOTTOMSTND+2*LINE_LIGHTEN_THICK,FALSE);
DrawSolidFrame(hDC,rcRefresh,LINE_LIGHTEN_THICK);
rcRefresh=CreateRect(FUN_LEFTPOS-LINE_LIGHTEN_THICK,FUN_TOPPOS-LINE_LIGHTEN_THICK,rcWnd.right-FUN_LEFTPOS-FUN_RIGHTSTND+2*LINE_LIGHTEN_THICK,MAIN_TOPSTND-FUN_TOPPOS-FUN_BOTTOMSTND+2*LINE_LIGHTEN_THICK,FALSE);
DrawSolidFrame(hDC,rcRefresh,LINE_LIGHTEN_NORMAL);
rcRefresh=CreateRect(COUNT_LEFTPOS-LINE_LIGHTEN_THIN,COUNT_TOPPOS-LINE_LIGHTEN_THIN,COUNT_WIDTH+2*LINE_LIGHTEN_THIN,COUNT_HEIGHT+2*LINE_LIGHTEN_THIN,FALSE);
DrawSolidFrame(hDC,rcRefresh,LINE_LIGHTEN_THIN);
rcRefresh=CreateRect(rcWnd.right-TIME_RIGHTSTND-TIME_WIDTH-LINE_LIGHTEN_THIN,TIME_TOPPOS-LINE_LIGHTEN_THIN,TIME_WIDTH+2*LINE_LIGHTEN_THIN,TIME_HEIGHT+2*LINE_LIGHTEN_THIN,FALSE);
DrawSolidFrame(hDC,rcRefresh,LINE_LIGHTEN_THIN);
//雷区贴图
hBmp=LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_MINE_BLACK+(flagState&0x0004)/0x0004));
SelectObject(hDCMem,hBmp);
for(ix=0;ix<mineRowNum;ix++)
for(iy=0;iy<mineLineNum;iy++) BitBlt(hDC,MAIN_LEFTSTND+MINE_BITMAP_WIDTH*ix,MAIN_TOPSTND+MINE_BITMAP_HEIGHT*iy,MINE_BITMAP_WIDTH,MINE_BITMAP_HEIGHT,hDCMem,0,MINE_BITMAP_HEIGHT* (btLandmineMapinfo[ix][iy]%0x10),SRCCOPY);
DeleteObject(hBmp);
ReleaseDC(hWnd,hDCMem);
DeleteObject(hDCMem);
EndPaint (hWnd, &ps) ;
return 0 ;
case WM_COMMAND:
switch(LOWORD(wParam)) {
case IDM_BEGIN: //开始
IinitializeMapInfo(hWnd,(flagState & 0x0f00)/0x0100,mineRowNum,mineLineNum,mineBomb); //??
CreateRandomMap(hWnd);
InvalidateRect(hWnd,NULL,TRUE);
break;
case IDM_BEGINNER: //初级
IinitializeMapInfo(hWnd,0x0000,BEGINER_COL_NUM,BEGINER_LN_NUM,BEGINER_BOMB_NUM); //??
rcWnd=getLevelWindowSize(hWnd);
CreateRandomMap(hWnd);
MoveWindow(hWnd,rcWnd.left,rcWnd.top,rcWnd.right,rcWnd.bottom,TRUE);
OnCheckLevelMenu(hMenu,LEVEL_BEGINNER);
break;
case IDM_INTERMEDIATE: //中级
IinitializeMapInfo(hWnd,0x0001,INTER_COL_NUM,INTER_LN_NUM,INTER_BOMB_NUM); //??
rcWnd=getLevelWindowSize(hWnd);
CreateRandomMap(hWnd);
MoveWindow(hWnd,rcWnd.left,rcWnd.top,rcWnd.right,rcWnd.bottom,TRUE);
OnCheckLevelMenu(hMenu,LEVEL_INTER);
break;
case IDM_ADVANCED: //高级
IinitializeMapInfo(hWnd,0x0002,ADVANCED_COL_NUM,ADVANCED_LN_NUM,ADVANCED_BOMB_NUM); //??
rcWnd=getLevelWindowSize(hWnd);
CreateRandomMap(hWnd);
MoveWindow(hWnd,rcWnd.left,rcWnd.top,rcWnd.right,rcWnd.bottom,TRUE);
OnCheckLevelMenu(hMenu,LEVEL_ADVANCED);
break;
case IDM_CUSTOMDEFINE: //自定义等级自定义窗口
if (DialogBox(hInstance,MAKEINTRESOURCE(IDD_CUSTOMDLG),hWnd,WinDlgProc)){ //如果返回是 TRUE,即"确定"
IinitializeMapInfo(hWnd,0x0003,mineRowNum,mineLineNum,mineBomb); //??
rcWnd=getLevelWindowSize(hWnd);
CreateRandomMap(hWnd);
MoveWindow(hWnd,rcWnd.left,rcWnd.top,rcWnd.right,rcWnd.bottom,TRUE);
OnCheckLevelMenu(hMenu,LEVEL_CUSTOM);
}
break;
case IDM_MARK: //设置标记 flagState & FLAG_MARK == FLAG_MARK 为标记
flagState=(((flagState&0x0008)==FLAG_MARK)?0:0x0008)+(flagState&0xfff7);
CheckMenuItem(hMenu,IDM_MARK,((flagState&0x0008)==FLAG_MARK) ? MF_CHECKED:MF_UNCHECKED);
break;
case IDM_COLOR: //设置颜色 flagState & FLAG_COLOR == FLAG_COLOR 为彩色
flagState=(((flagState&0x0004)==FLAG_COLOR)?0:0x0004)+(flagState&0xfffb);
CheckMenuItem(hMenu,IDM_COLOR,((flagState&0x0004)==FLAG_COLOR) ? MF_CHECKED:MF_UNCHECKED);
InvalidateRect(hWnd,NULL,TRUE);
break;
case IDM_SOUND: //设置声音 flagState & FLAG_SOUND == FLAG_SOUND 为发声
flagState=(((flagState&0x0010)==FLAG_SOUND)?0:0x0030)+(flagState&0xffef);
CheckMenuItem(hMenu,IDM_SOUND,((flagState&0x0010)==FLAG_SOUND) ? MF_CHECKED:MF_UNCHECKED);
break;
case IDM_HEROLIST: //显示排行榜
DialogBox(hInstance,MAKEINTRESOURCE(IDD_HEROLISTDLG),hWnd,WinDlgProc);
break;
case IDM_EXIT: //退出
SendMessage(hWnd,WM_DESTROY,wParam,lParam);
break;
case IDM_ABOUT: //关于
LoadString(hInstance,IDS_AUTHER,lpAnonymity,sizeof(lpAnonymity));
ShellAbout(hWnd,TEXT("扫雷 ..."),lpAnonymity,hIcon);
break;
case IDM_CONTENTS: //帮助:目录
LoadString(hInstance,IDS_HELPFILEPATH_WIN,lpAnonymity,sizeof(lpAnonymity));
if (HtmlHelp(NULL,lpAnonymity,HH_DISPLAY_TOC,NULL)==0){ //系统帮助不存在,在当前目录寻找
GetCurrentDirectory(sizeof(lpAnonymity),lpAnonymity);
strcat(lpAnonymity,TEXT("\\help\\winmine.chm"));
if (HtmlHelp(NULL,lpAnonymity,HH_DISPLAY_TOC,NULL)==0) //仍然无法打开,显示错误消息
MessageBox(hWnd,TEXT("Sorry!\r\nYou have not the help file of \"WinMine.chm\"\t\r\n"),TEXT("Help Information"),MB_ICONINFORMATION);
}
break;
case IDM_SEARCHHELP: //帮助:索引
LoadString(hInstance,IDS_HELPFILEPATH_WIN,lpAnonymity,sizeof(lpAnonymity));
if (HtmlHelp(NULL, lpAnonymity, HH_DISPLAY_INDEX,0)==0){
GetCurrentDirectory(sizeof(lpAnonymity),lpAnonymity);
strcat(lpAnonymity,TEXT("\\help\\winmine.chm"));
if (HtmlHelp(NULL,lpAnonymity,HH_DISPLAY_INDEX,NULL)==0)
MessageBox(hWnd,TEXT("Sorry!\r\nYou have not the help file of \"winmine.chm\"\t\r\n"),TEXT("Help Information"),MB_ICONINFORMATION);
}
break;
case IDM_USEHELP: //帮助: 使用帮助
LoadString(hInstance,IDS_HELPFILEPATH_HELP,lpAnonymity,sizeof(lpAnonymity));
if (HtmlHelp(NULL, lpAnonymity, HH_DISPLAY_TOC,0)==0){
GetCurrentDirectory(sizeof(lpAnonymity),lpAnonymity);
strcat(lpAnonymity,TEXT("\\help\\nthelp.chm"));
if (HtmlHelp(NULL,lpAnonymity,HH_DISPLAY_INDEX,NULL)==0)
MessageBox(hWnd,TEXT("Sorry!\r\nYou have not the help file of \"nthelp.chm\"\t\r\n"),TEXT("Help Information"),MB_ICONINFORMATION);
}
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -