📄 minewnd.cpp
字号:
{
rectClick.left = MINE_AREA_X + pos%uWidth*16;
rectClick.right = rectClick.left + 16;
rectClick.top = MINE_AREA_Y + pos/uWidth*16;
rectClick.bottom = rectClick.top + 16;
InvalidateRect(&rectClick);
}
void CMineWnd::ProcessLeftButtonUp( int pos )
{
if( bFirstClick ) // first clicked
{
bFirstClick = FALSE;
SetMine( pos );
SetNumbers();
GetEmptyAreas(); // set empty area flag
}
if( pMines[pos].uState >= STATE_NUMBER_8 &&
pMines[pos].uState <= STATE_NUMBER_1 &&
pMines[pos].uDraw != DRAW_FLAG ) // flag number
{
ClickNumber++;
pMines[pos].uDraw = pMines[pos].uState;
pMines[pos].uState = STATE_OPENED;
RECT rectClick;
MyInvalidateRect( rectClick, nNewPos );
Victory(); // victory?
}
else if( pMines[pos].uState == STATE_MINE )
{
if( pMines[pos].uDraw == DRAW_QUESTION_MARK ||
pMines[pos].uDraw == DRAW_EMPTY) // dead
{
sndPlaySound((LPCSTR)LockResource(pBlastWavMem),
SND_MEMORY | SND_ASYNC | SND_NODEFAULT);
uGameState = DEAD;
KillTimer( ID_TIMER_EVENT );
m_nTimer = 0;
CRect rectButton(uButtonPos[1],15,uButtonPos[2],42);
uButtonState = BUTTON_DEAD;
InvalidateRect(rectButton);
pMines[pos].uDraw = DRAW_BLAST;
FlagAllMine();
}
}
else if( pMines[pos].uState >= EMPTY_AREA_START )
{
DrawEmptyArea( pMines[pos].uState ); // flag empty area
Victory(); // is victory
}
}
void CMineWnd::ProcessLeftRightButtonUp( int pos )
{
// compute round
int around[10];
GetAroundPos( pos, around );
if( pMines[ pos ].uDraw >= DRAW_NUMBER_8 &&
pMines[ pos ].uDraw <= DRAW_NUMBER_1 &&
pMines[ pos ].uState == STATE_OPENED )
{
UINT trueFlag = 0;
UINT falseFlag = 0;
UINT flag = 0;
UINT error[8];
UINT errorNum = 0;
for(UINT i=0; i<(UINT)around[8]; i++)
{
if( pMines[around[i]].uState == STATE_MINE &&
pMines[around[i]].uDraw == DRAW_FLAG )//
{
trueFlag++;
flag++;
}
else if( pMines[around[i]].uState == STATE_MINE &&
pMines[around[i]].uDraw != DRAW_FLAG ) //
{
falseFlag++;
error[errorNum++] = around[i];
}
else if(pMines[around[i]].uState != STATE_MINE &&
pMines[around[i]].uDraw == DRAW_FLAG) //
{
flag++;
falseFlag++;
}
}
if( trueFlag == flag && falseFlag == 0 ) //
{
RECT rectClick;
for( i=0; i<(UINT)around[8]; i++)
{
if( pMines[around[i]].uState != STATE_OPENED )
{
if( pMines[around[i]].uState >= STATE_NUMBER_8 &&
pMines[around[i]].uState <= STATE_NUMBER_1 )
{
pMines[around[i]].uDraw = pMines[around[i]].uState;
ClickNumber++;
pMines[around[i]].uState = STATE_OPENED;
MyInvalidateRect( rectClick, around[i] );
}
else if( pMines[around[i]].uState >= EMPTY_AREA_START )
{
// get and flag empty area
DrawEmptyArea( pMines[around[i]].uState );
}
}
}
Victory(); // is victory
}
else if( falseFlag > 0 ) //
{
if( DRAW_NUMBER_1 - pMines[pos].uDraw +1 == flag)
{
sndPlaySound((LPCSTR)LockResource(pBlastWavMem),
SND_MEMORY | SND_ASYNC | SND_NODEFAULT);
uGameState = DEAD;
KillTimer( ID_TIMER_EVENT );
m_nTimer = 0;
CRect rectButton(uButtonPos[1],15,uButtonPos[2],42);
uButtonState = BUTTON_DEAD;
InvalidateRect(rectButton);
for( i=0; i<errorNum; i++)
{
pMines[error[i]].uDraw = DRAW_BLAST;
}
FlagAllMine(); //
}
else //
{
SetMineUpEx(around,around[8]-1);
}
}
}
else
{
int num = around[8];
around[num] = nNewPos;
SetMineUpEx(around,num);
}
}
void CMineWnd::MyCheckMenuItem()
{
if( pSubMenu )
{
pSubMenu->CheckMenuItem(ID_MENU_PRIMARY, MF_UNCHECKED | MF_BYCOMMAND);
pSubMenu->CheckMenuItem(ID_MENU_SECONDARY, MF_UNCHECKED | MF_BYCOMMAND);
pSubMenu->CheckMenuItem(ID_MENU_ADVANCED, MF_UNCHECKED | MF_BYCOMMAND);
pSubMenu->CheckMenuItem(ID_MENU_CUSTOM, MF_UNCHECKED | MF_BYCOMMAND);
switch(theApp.uGameLevel)
{
case LEVEL_PRIMARY:
pSubMenu->CheckMenuItem(ID_MENU_PRIMARY, MF_CHECKED | MF_BYCOMMAND);
break;
case LEVEL_SECONDARY:
pSubMenu->CheckMenuItem(ID_MENU_SECONDARY, MF_CHECKED | MF_BYCOMMAND);
break;
case LEVEL_ADVANCED:
pSubMenu->CheckMenuItem(ID_MENU_ADVANCED, MF_CHECKED | MF_BYCOMMAND);
break;
case LEVEL_CUSTOM:
pSubMenu->CheckMenuItem(ID_MENU_CUSTOM, MF_CHECKED | MF_BYCOMMAND);
break;
default:
break;
}
}
}
void CMineWnd::SetWindowSize()
{
UINT uWindowWidth = theApp.uFrameWidth + uWidth*MINE_WIDTH +
LINE_WIDTH_0*3 + SIDE_WIDTH_0 + SIDE_WIDTH_1;
UINT uWindowHeight = theApp.uFrameHeight + uHeight*MINE_HEIGHT +
LINE_WIDTH_0*3 + SIDE_WIDTH_1 + SIDE_WIDTH_0*2 + RECT_HEIGHT_0;
SetWindowPos(&CWnd::wndBottom,0,0,uWindowWidth,uWindowHeight,
SWP_NOZORDER|SWP_NOMOVE|SWP_NOCOPYBITS );
SetPosition();
}
void CMineWnd::SetPosition()
{
GetClientRect(&rect);
// NUMBER pos
uNumPos[0] = rect.right-55;
uNumPos[1] = rect.right-15;
uNumPos[2] = rect.right-54;
uNumPos[3] = rect.right-41;
uNumPos[4] = rect.right-28;
// BUTTON POS
uButtonPos[0] = rect.right/2-12;
uButtonPos[1] = rect.right/2-13;
uButtonPos[2] = rect.right/2+12;
// Rectangle POS
uRectPosX[0] = rect.right-14;
uRectPosX[1] = rect.right-16;
uRectPosX[2] = rect.right-18;
uRectPosX[3] = rect.right-6;
uRectPosX[4] = rect.right-7;
uRectPosX[5] = rect.right-8;
uRectPosX[6] = RECT_X_0+1;
uRectPosX[7] = RECT_X_1+1;
uRectPosX[8] = RECT_X_1+2;
uRectPosX[9] = rect.right;
uRectPosY[0] = rect.bottom-RECT_Y_1-5;
uRectPosY[1] = rect.bottom-RECT_Y_1-7;
uRectPosY[2] = rect.bottom-RECT_Y_1-9;
uRectPosY[3] = rect.bottom-8;
uRectPosY[4] = rect.bottom-7;
uRectPosY[5] = rect.bottom-6;
uRectPosY[6] = RECT_Y_0+1;
uRectPosY[7] = RECT_Y_1+1;
uRectPosY[8] = RECT_Y_1+2;
uRectPosY[9] = rect.bottom;
}
void CMineWnd::MyDrawNumber( CPaintDC& dc )
{
dc.Draw3dRect(16,15,41,25,darkColor,COLOR_WHITE);
dc.Draw3dRect(uNumPos[0],15,41,25,darkColor,COLOR_WHITE);
dc.SetPixel(56,15,COLOR_GRAY);
dc.SetPixel(16,39,COLOR_GRAY);
dc.SetPixel(uNumPos[1],15,COLOR_GRAY);
dc.SetPixel(uNumPos[0],39,COLOR_GRAY);
CDC cdc;
cdc.CreateCompatibleDC(&dc);
cdc.SelectObject(BMP_NUMBER);
UINT num;
// darw remain mine number
if(theApp.uRemainMines < 0)
num = 11;
else
num = theApp.uRemainMines/100;
dc.StretchBlt(17,16,13,23,&cdc,0,253-23*num,13, 23, SRCCOPY);
num = abs(theApp.uRemainMines)/10%10;
dc.StretchBlt(30,16,13,23,&cdc,0,253-23*num,13, 23, SRCCOPY);
num = abs(theApp.uRemainMines)%10;
dc.StretchBlt(43,16,13,23,&cdc,0,253-23*num,13, 23, SRCCOPY);
// draw remain seconds
num = theApp.uSecends/100;
dc.StretchBlt(uNumPos[2],16,13,23,&cdc,0,253-23*num,13, 23, SRCCOPY);
num = theApp.uSecends/10%10;
dc.StretchBlt(uNumPos[3],16,13,23,&cdc,0,253-23*num,13, 23, SRCCOPY);
num = theApp.uSecends%10;
dc.StretchBlt(uNumPos[4],16,13,23,&cdc,0,253-23*num,13, 23, SRCCOPY);
}
void CMineWnd::MyDrawButton( CPaintDC& dc )
{
CDC cdc;
cdc.CreateCompatibleDC(&dc);
cdc.SelectObject(BMP_BUTTON);
dc.StretchBlt(uButtonPos[0],16,24,24,&cdc,0,24*uButtonState,24,24, SRCCOPY);
dc.Draw3dRect(uButtonPos[1],15,26,26,darkColor,darkColor);
dc.SetPixel(uButtonPos[1],40,COLOR_GRAY);
dc.SetPixel(uButtonPos[2],15,COLOR_GRAY);
}
void CMineWnd::MyDrawMineArea( CPaintDC& dc )
{
CDC cdc;
cdc.CreateCompatibleDC(&dc);
cdc.SelectObject(BMP_MINEAREA);
for(UINT i=0; i<uHeight; i++)
for(UINT j=0; j<uWidth; j++)
{
dc.StretchBlt(MINE_AREA_X+16*j,MINE_AREA_Y+16*i,
16,16,&cdc,0,16*pMines[i*uWidth+j].uDraw,16,16, SRCCOPY);
}
}
void CMineWnd::MyDrawRectangle( CPaintDC& dc )// Draw frame
{
// draw side
dc.FillSolidRect(0,0,uRectPosX[9],LINE_WIDTH_0,COLOR_WHITE);
dc.FillSolidRect(0,0,LINE_WIDTH_0,uRectPosY[9],COLOR_WHITE);
//draw small rectangle
dc.Draw3dRect(RECT_X_0, RECT_Y_0, uRectPosX[0],37,
darkColor,COLOR_WHITE);
dc.Draw3dRect(uRectPosX[6],uRectPosY[6],uRectPosX[1],35,
darkColor,COLOR_WHITE);
dc.SetPixel(RECT_X_1, 45,COLOR_GRAY);
dc.SetPixel(uRectPosX[6],44,COLOR_GRAY);
dc.SetPixel(uRectPosX[3],RECT_Y_0, COLOR_GRAY);
dc.SetPixel(uRectPosX[4],uRectPosY[6],COLOR_GRAY);
// draw big rectangle
dc.Draw3dRect(RECT_X_1, RECT_Y_1, uRectPosX[0],
uRectPosY[0],darkColor,COLOR_WHITE);
dc.Draw3dRect(uRectPosX[7],uRectPosY[7],uRectPosX[1],
uRectPosY[1],darkColor,COLOR_WHITE);
dc.Draw3dRect(uRectPosX[8],uRectPosY[8],uRectPosX[2],
uRectPosY[2],darkColor,COLOR_WHITE);
dc.SetPixel(uRectPosX[3],RECT_Y_1, COLOR_GRAY);
dc.SetPixel(uRectPosX[4],uRectPosY[7],COLOR_GRAY);
dc.SetPixel(uRectPosX[5],uRectPosY[8],COLOR_GRAY);
dc.SetPixel(RECT_X_1, uRectPosY[5],COLOR_GRAY);
dc.SetPixel(uRectPosX[7],uRectPosY[4],COLOR_GRAY);
dc.SetPixel(uRectPosX[8],uRectPosY[3],COLOR_GRAY);
}
void CMineWnd::SetBitmap()
{
if(theApp.bColor)
{
BMP_MINEAREA.DeleteObject();
BMP_MINEAREA.LoadBitmap(IDB_BITMAP10);
BMP_NUMBER.DeleteObject();
BMP_NUMBER.LoadBitmap(IDB_BITMAP20);
BMP_BUTTON.DeleteObject();
BMP_BUTTON.LoadBitmap(IDB_BITMAP30);
}
else
{
BMP_MINEAREA.DeleteObject();
BMP_MINEAREA.LoadBitmap(IDB_BITMAP11);
BMP_NUMBER.DeleteObject();
BMP_NUMBER.LoadBitmap(IDB_BITMAP21);
BMP_BUTTON.DeleteObject();
BMP_BUTTON.LoadBitmap(IDB_BITMAP31);
}
}
BEGIN_MESSAGE_MAP(CMineWnd, CWnd)
//{{AFX_MSG_MAP(CMineWnd)
ON_COMMAND(ID_MENU_ABOUT, OnMenuAbout)
ON_COMMAND(ID_MENU_HELP_LIST, OnMenuHelpList)
ON_COMMAND(ID_MENU_HELP_USE, OnMenuHelpUse)
ON_COMMAND(ID_MENU_HELP_FIND, OnMenuHelpFind)
ON_COMMAND(ID_MENU_GAMESTART, OnMenuGameStart)
ON_COMMAND(ID_MENU_EXIT, OnMenuExit)
ON_WM_KEYDOWN()
ON_COMMAND(ID_MENU_PRIMARY, OnMenuPrimary)
ON_COMMAND(ID_MENU_SECONDARY, OnMenuSecondary)
ON_COMMAND(ID_MENU_MARK, OnMenuMark)
ON_COMMAND(ID_MENU_ADVANCED, OnMenuAdvanced)
ON_COMMAND(ID_MENU_COLOR, OnMenuColor)
ON_COMMAND(ID_MENU_CUSTOM, OnMenuCustom)
ON_COMMAND(ID_MENU_SOUND, OnMenuSound)
ON_COMMAND(ID_MENU_HERO_LIST, OnMenuHeroList)
ON_WM_INITMENU()
ON_WM_PAINT()
ON_WM_TIMER()
ON_WM_CLOSE()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_RBUTTONDOWN()
ON_WM_RBUTTONUP()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMineWnd message handlers
void CMineWnd::OnMenuAbout()
{
::ShellAbout(this->m_hWnd,theApp.sResource[5],
theApp.sResource[6],theApp.LoadIcon(IDR_MAINFRAME));
}
void CMineWnd::OnMenuHelpList() //?
{
::WinExec("HH winmine.chm", SW_SHOW);
}
void CMineWnd::OnMenuHelpFind() //?
{
::WinExec("HH WINMINE.CHM", SW_SHOW);
}
void CMineWnd::OnMenuHelpUse() //?
{
::WinExec("HH NTHelp.chm", SW_SHOW);
}
void CMineWnd::OnMenuGameStart()
{
ReAssign();
GameInit();
Invalidate();
}
void CMineWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if( nChar == VK_F1 )
{
OnMenuHelpList();
}
else if( nChar == VK_F2 )
{
OnMenuGameStart();
}
CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CMineWnd::OnMenuPrimary()
{
theApp.uGameLevel = LEVEL_PRIMARY;
uHeight = PRIMARY_HEIGHT;
uWidth = PRIMARY_WIDTH;
theApp.uCustomMineNum = PRIMARY_MINE_NUM;
MyCheckMenuItem();
SetWindowSize();
ReAssign();
GameInit();
Invalidate();
}
void CMineWnd::OnMenuSecondary()
{
theApp.uGameLevel = LEVEL_SECONDARY;
uHeight = SECONDARY_HEIGHT;
uWidth = SECONDARY_WIDTH;
theApp.uCustomMineNum = SECONDARY_MINE_NUM;
MyCheckMenuItem();
SetWindowSize();
ReAssign();
GameInit();
Invalidate();
}
void CMineWnd::OnMenuAdvanced()
{
theApp.uGameLevel = LEVEL_ADVANCED;
uWidth = ADVANCED_WIDTH;
uHeight = ADVANCED_HEIGHT;
theApp.uCustomMineNum = ADVANCED_MINE_NUM;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -