📄 fiveplusdlg.cpp
字号:
//DEL void CFivePlusDlg::OnButton1()
//DEL {
//DEL // TODO: Add your control notification handler code here
//DEL
//DEL }
void CFivePlusDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if ( m_rectPlayArea.PtInRect(point)
&& !m_bIsMoving
&& !m_bIsDisappearing ){
CPoint ptMap = this->MapCoord(point);
switch (m_gameModel.ClickPoint(ptMap)) {
case MOVE_CHESSMAN:
m_ptMoveTo = ptMap;
m_bIsMoving = TRUE;
m_nTimerMoving = SetTimer(MOVE_SELECT, m_gameModel.m_nMoveInterval, 0);
break;
case SELECT_CHESSMAN:
InvalidateGrid();
m_nBlendSelect = MIN_ALPHA ;
m_nDirection = CHANGE_STEP;
break;
}
}
CDialog::OnLButtonDown(nFlags, point);
}
CPoint CFivePlusDlg::MapCoord(CPoint point, BOOL bDirection)
{
CPoint result;
if ( bDirection ){
result.x = (point.x - m_rectPlayArea.left)/(GRID_WIDTH + 2);
result.y = (point.y - m_rectPlayArea.top)/(GRID_HEIGHT + 2);
}else{
result.x = point.x * (2 + GRID_WIDTH) + m_rectPlayArea.left + 1;
result.y = point.y * (2 + GRID_HEIGHT) + m_rectPlayArea.top + 1;
}
return result;
}
BOOL CFivePlusDlg::InvalidateGrid(){
POSITION pos = m_gameModel.
m_lstInvalidPoint.GetHeadPosition();
while ( pos ){
CPoint point = m_gameModel.
m_lstInvalidPoint.GetNext(pos);
InvalidateRect(CRect(point.x * (GRID_WIDTH + 2) + 1,
PLAY_AREA_TOP + point.y * (GRID_HEIGHT + 2) + 1,
point.x * (GRID_WIDTH + 2) + 1 + GRID_WIDTH,
PLAY_AREA_TOP + point.y * (GRID_HEIGHT + 2) + 1 + GRID_HEIGHT));
}
return TRUE;
}
void CFivePlusDlg::DrawScore(CDC *dc)
{
int score = m_gameModel.GetScore();
for ( int i = 0; i < 4; i++){
int remain = score;
for ( int j = 0; j < (4-i-1); j++){
remain /= 10;
}
remain = remain%10;
dc->BitBlt(4 + i*30, 2, 24, 42, &m_dcNumber,
remain*24, 0, SRCCOPY);
}
}
void CFivePlusDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
switch(nIDEvent){
case FLASH_SELECT:
this->FlashSelect();
break;
case MOVE_SELECT:
this->FlashMove();
break;
case DISAPPEAR:
this->FlashDisappear();
break;
case SHOWING:
this->FlashShow();
break;
}
CDialog::OnTimer(nIDEvent);
}
void CFivePlusDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
KillTimer(m_nTimerSelected);
}
void CFivePlusDlg::OnAboutbox()
{
// TODO: Add your command handler code here
CAboutDlg dlg;
dlg.DoModal();
}
BOOL CFivePlusDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if ( !m_hAccel )
return FALSE;
HWND hwnd = this->GetSafeHwnd();
return ::TranslateAccelerator(hwnd, m_hAccel, pMsg);
//return CDialog::PreTranslateMessage(pMsg);
}
int CFivePlusDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
m_hAccel = ::LoadAccelerators(
::AfxGetResourceHandle(),
MAKEINTRESOURCE(IDR_ACCEL_COMMANDS));
return 0;
}
void CFivePlusDlg::OnGameScore()
{
// TODO: Add your command handler code here
CHighScoreDlg dlg(this, &(m_gameModel.m_scoreModel));
dlg.DoModal();
}
void CFivePlusDlg::FlashSelect()
{
if (m_gameModel.m_bHasSel){
m_bfSelect.SourceConstantAlpha = m_nBlendSelect;
CRect rect(1 + m_gameModel.m_ptSel.x*(GRID_WIDTH+2),
PLAY_AREA_TOP + 1 + m_gameModel.m_ptSel.y*(GRID_HEIGHT+2),
1 + m_gameModel.m_ptSel.x*(GRID_WIDTH+2) + GRID_WIDTH,
PLAY_AREA_TOP + 1 + m_gameModel.m_ptSel.y*(GRID_HEIGHT+2) + GRID_HEIGHT);
m_dcOneGrid.BitBlt(0, 0, rect.Width(), rect.Height(),
&m_dcGrid, (m_gameModel.m_grid[m_gameModel.m_ptSel.x][m_gameModel.m_ptSel.y] - 1)*GRID_WIDTH,
0, SRCCOPY);
BOOL result = ::AlphaBlend(m_dcOneGrid.m_hDC,
0,
0,
rect.Width(),
rect.Height(),
m_dcGrid.m_hDC,
(m_gameModel.m_grid[m_gameModel.m_ptSel.x][m_gameModel.m_ptSel.y] - 1)*GRID_WIDTH,
GRID_HEIGHT,
GRID_WIDTH,
GRID_HEIGHT,
m_bfSelect);
if (!result)
AfxMessageBox("can't blend");
CClientDC dc(this);
dc.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
&m_dcOneGrid, 0, 0, SRCCOPY);
if (m_nBlendSelect <= MIN_ALPHA)
m_nDirection = CHANGE_STEP;
if (m_nBlendSelect >= MAX_ALPHA )
m_nDirection = -CHANGE_STEP;
m_nBlendSelect += m_nDirection;
if ( m_nBlendSelect >= MAX_ALPHA )
m_nBlendSelect = MAX_ALPHA ;
if ( m_nBlendSelect <= MIN_ALPHA )
m_nBlendSelect = MIN_ALPHA;
}
}
void CFivePlusDlg::FlashMove()
{
if ( m_bIsMoving ){
if ( !m_posCurMove ){
m_posCurMove = m_gameModel.m_lstPathPoint.GetHeadPosition();
}else{
CPoint ptTopLeft = this->MapCoord(m_ptCurMove, FALSE);
InvalidateRect(CRect(ptTopLeft.x, ptTopLeft.y,
ptTopLeft.x + GRID_WIDTH,
ptTopLeft.y + GRID_HEIGHT));
}
m_ptCurMove = m_gameModel.m_lstPathPoint.GetNext(m_posCurMove);
CPoint cur = this->MapCoord(m_ptCurMove, FALSE);
CClientDC dc(this);
dc.BitBlt(cur.x, cur.y, GRID_WIDTH, GRID_HEIGHT,
&m_dcGrid,
(m_gameModel.m_grid[m_ptMoveTo.x][m_ptMoveTo.y] - 1)*GRID_WIDTH,
0, SRCCOPY);
if ( !m_posCurMove ){
m_bIsMoving = FALSE;
KillTimer(m_nTimerMoving);
int score = m_gameModel.CheckPoint(m_ptMoveTo, FALSE);
if ( score ){
BeginDisappear();
}else{
if ( m_gameModel.NextStep() ){
m_bIsDisappearing = TRUE;
m_nBlendDisappear = 0;
m_nTimerShow = SetTimer(SHOWING, m_gameModel.m_nShowInterval, 0);
}
if ( m_gameModel.IsFill() ) {
AfxMessageBox("游戏结束");
OnGameNew();
}
}
}
}
}
void CFivePlusDlg::FlashDisappear()
{
if (m_bIsDisappearing){
if (m_nBlendDisappear <= 0){
m_gameModel.ClearInvalid();
m_bIsDisappearing = FALSE;
KillTimer(m_nTimerDisappear);
InvalidateRect(&m_rectScore);
}else{
m_nBlendDisappear -= 8;
if (m_nBlendDisappear < 0)
m_nBlendDisappear = 0;
m_bfDisappear.SourceConstantAlpha = m_nBlendDisappear;
this->DrawInvalid();
}
}
}
void CFivePlusDlg::BeginDisappear()
{
m_bIsDisappearing = TRUE;
m_nBlendDisappear = 255;
m_nTimerDisappear = SetTimer(DISAPPEAR, m_gameModel.m_nShowInterval, 0);
}
void CFivePlusDlg::FlashShow()
{
if (m_bIsDisappearing){
if (m_nBlendDisappear >= 255){
m_bIsDisappearing = FALSE;
KillTimer(m_nTimerShow);
InvalidateRect(&m_rectNextBalls);
int score = m_gameModel.CheckNewPoint();
if ( score ){
BeginDisappear();
}
}else{
m_nBlendDisappear += 8;
if (m_nBlendDisappear > 255)
m_nBlendDisappear = 255;
m_bfDisappear.SourceConstantAlpha = m_nBlendDisappear;
this->DrawInvalid();
}
}
}
void CFivePlusDlg::DrawInvalid(){
POSITION pos = m_gameModel.m_lstInvalidPoint.GetHeadPosition();
CClientDC dc(this);
while(pos){
CPoint ptCur = m_gameModel.m_lstInvalidPoint.GetNext(pos);
CPoint ptCurMap = this->MapCoord(ptCur, FALSE);
m_dcOneGrid.BitBlt(0, 0, GRID_WIDTH, GRID_HEIGHT,
&m_dcBK, ptCurMap.x, ptCurMap.y, SRCCOPY);
AlphaBlend(m_dcOneGrid.m_hDC, 0, 0, GRID_WIDTH, GRID_HEIGHT,
m_dcGrid.m_hDC, (m_gameModel.m_grid[ptCur.x][ptCur.y] - 1)*GRID_WIDTH,
0, GRID_WIDTH, GRID_HEIGHT, m_bfDisappear);
dc.BitBlt(ptCurMap.x, ptCurMap.y, GRID_WIDTH, GRID_HEIGHT,
&m_dcOneGrid, 0, 0, SRCCOPY);
}
}
void CAboutDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CWnd* wndEmail = GetDlgItem(IDC_STATIC_EMAIL);
CRect rect;
wndEmail->GetClientRect(rect);
CPoint copy = point;
MapWindowPoints(wndEmail, ©, 1);
if ( rect.PtInRect(copy) ){
ShellExecute(m_hWnd, NULL, "mailto:whbjiaozuo@263.net", NULL, NULL, SW_SHOW);
}
CDialog::OnLButtonDown(nFlags, point);
}
BOOL CAboutDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
CPoint point;
GetCursorPos(&point);
CWnd* wndEmail = GetDlgItem(IDC_STATIC_EMAIL);
CRect rect;
wndEmail->GetClientRect(rect);
wndEmail->ScreenToClient(&point);
if ( rect.PtInRect(point) ){
HCURSOR cursor = AfxGetApp()->LoadCursor(IDC_HAND);
SetCursor(cursor);
return TRUE;
}else{
return CDialog::OnSetCursor(pWnd, nHitTest, message);
}
}
//DEL void CAboutDlg::OnHelpHowToPlay()
//DEL {
//DEL // TODO: Add your command handler code here
//DEL ShellExecute(m_hWnd,"open","file://E:/game/FivePlus/res/Five+ Manual.htm",NULL,NULL,SW_SHOW);
//DEL }
void CFivePlusDlg::OnHelpHowToPlay()
{
// TODO: Add your command handler code here
CFivePlusApp* theApp = (CFivePlusApp*)::AfxGetApp();
ShellExecute(m_hWnd,"open",theApp->m_szWorkPath + "/res/Five+ Manual.htm",NULL,NULL,SW_SHOW); // TODO: Add your message handler code here and/or call default
}
BOOL CFivePlusDlg::OnHelpInfo(HELPINFO* pHelpInfo)
{
this->OnHelpHowToPlay();
return TRUE;
//return CDialog::OnHelpInfo(pHelpInfo);
}
void CFivePlusDlg::OnToolSetting()
{
// TODO: Add your command handler code here
CSettingDlg dlg;
dlg.m_nExtraScore = m_gameModel.m_nExtraScore;
dlg.m_nCommonFreq = m_gameModel.m_nCommon;
dlg.m_nAnyFreq = m_gameModel.m_nAny;
dlg.m_nCrackFreq = m_gameModel.m_nCrack;
dlg.m_nSelect = m_gameModel.m_nSelectInterval;
dlg.m_nShow = m_gameModel.m_nShowInterval;
dlg.m_nMove = m_gameModel.m_nMoveInterval;
int result = dlg.DoModal();
if ( result == IDOK )
{
m_gameModel.m_nExtraScore = dlg.m_nExtraScore;
m_gameModel.m_nCommon = dlg.m_nCommonFreq;
m_gameModel.m_nAny = dlg.m_nAnyFreq;
m_gameModel.m_nCrack = dlg.m_nCrackFreq;
m_gameModel.m_nSelectInterval = dlg.m_nSelect;
m_gameModel.m_nShowInterval = dlg.m_nShow;
m_gameModel.m_nMoveInterval = dlg.m_nMove;
m_gameModel.ResetRandom();
//this->OnGameNew();
//重新设置参数,开始新游戏。
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -