⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scoredlg.cpp

📁 经典的俄罗斯方块游戏的在VC++中的实现
💻 CPP
字号:
/////////////////////////////////////////////////////////////////////////////
// This file is part of the completely free tetris clone "CGTetris".
//
// This is free software.
// You may redistribute it by any means providing it is not sold for profit
// without the authors written consent.
//
// No warrantee of any kind, expressed or implied, is included with this
// software; use at your own risk, responsibility for damages (if any) to
// anyone resulting from the use of this software rests entirely with the
// user.
/////////////////////////////////////////////////////////////////////////////


// ScoreDlg.cpp : implementation file
//

#include "stdafx.h"
#include "tetris.h"
#include "ScoreDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CScoreDlg property page

IMPLEMENT_DYNCREATE(CScoreDlg, CBitmapPropPage)

CScoreDlg::CScoreDlg() : CBitmapPropPage(CScoreDlg::IDD, IDS_TitleScorePage)
{
	m_ScoreArray.reserve(MAXSCORE);
	m_bCanEditName = FALSE;
	//{{AFX_DATA_INIT(CScoreDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	m_psp.dwFlags &= ~PSP_HASHELP;
}

CScoreDlg::~CScoreDlg()
{
}

void CScoreDlg::DoDataExchange(CDataExchange* pDX)
{
	CBitmapPropPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CScoreDlg)
	DDX_Control(pDX, IDC_ListScore, m_ctrlScore);
	//}}AFX_DATA_MAP
}


BOOL CScoreDlg :: IsHiScore(UINT uScore) const {
	if( m_ScoreArray.size() < (MAXSCORE-1) )
		return TRUE;
	else {
		const_iterator itend(m_ScoreArray.end());
		for(const_iterator it(m_ScoreArray.begin()); it != itend; ++it)
			if( uScore > it->m_uScore )
				return TRUE;
	}
	return FALSE;
}


void CScoreDlg :: AddHiScore(UINT uScore, UINT uLevel) {
	int index = 0;
	const_iterator itend(m_ScoreArray.end());
	iterator it(m_ScoreArray.begin());
	for(; it != itend; ++it, ++index)
		if( uScore > it->m_uScore )
			break;

	CString strName;
	TCHAR name[256];
	DWORD dwSize = 255;
	::ZeroMemory(PVOID(name), 256);
	if( ::GetUserName(name, &dwSize) ) {
		name[dwSize] = TEXT('\0');
		strName = name;
	}

	m_ScoreArray.insert(it, ScoreTag(strName, uScore, uLevel));
	if( m_ScoreArray.size() >= MAXSCORE )
		m_ScoreArray.resize(MAXSCORE);

	VERIFY(AddHiScore(index, strName, uScore, uLevel) == index);

	m_bCanEditName = TRUE;
	CEdit * pEdit =	m_ctrlScore.EditLabel(index);
	ASSERT(pEdit != 0);
	pEdit->LimitText(30);	// that should be enough ...
}


int CScoreDlg :: AddHiScore(int nIndex, const CString & strName, UINT uScore, UINT uLevel) {
	ASSERT(nIndex < MAXSCORE);

	CString strScore, strLevel;
	strScore.Format("%u", uScore);
	strLevel.Format("%u", uLevel);

	VERIFY(m_ctrlScore.InsertItem(LVIF_TEXT, nIndex, strName, 0, 0, 0, 0) == nIndex );
	VERIFY(m_ctrlScore.SetItem(nIndex, 1, LVIF_TEXT, strScore, 0, 0, 0, 0));
	VERIFY(m_ctrlScore.SetItem(nIndex, 2, LVIF_TEXT, strLevel, 0, 0, 0, 0));

	return nIndex;
}


void CScoreDlg :: SaveHiScore() const {
	for( register size_type i = 0; i < m_ScoreArray.size(); ++i )
		theApp.WriteHiScore(int(i), m_ScoreArray[i].m_strName, m_ScoreArray[i].m_uScore, m_ScoreArray[i].m_uLevel);
}

void CScoreDlg :: RestoreHiScore() {
	for( register int i = 0; i < MAXSCORE; ++i ) {
		ScoreTag sc;
		if( ! theApp.GetHiScore(i, sc.m_strName, sc.m_uScore, sc.m_uLevel) )
			break;	// no more scores saved
		m_ScoreArray.push_back(sc);
	}
}


void CScoreDlg :: LoadAllStrings() {
	VERIFY(CLanguage::LoadString(m_strName, IDS_HeaderName));
	VERIFY(CLanguage::LoadString(m_strScore, IDS_HeaderScore));
	VERIFY(CLanguage::LoadString(m_strLevel, IDS_HeaderLevel));

	LV_COLUMN col;
	memset(PVOID(&col), 0, sizeof(LV_COLUMN));

	if( m_ctrlScore.GetColumn(0, &col) ) {
		// columns already exist.
		m_ctrlScore.DeleteColumn(2);
		m_ctrlScore.DeleteColumn(1);
		m_ctrlScore.DeleteColumn(0);
	}
	CRect rect;
	m_ctrlScore.GetClientRect(rect);
	m_ctrlScore.InsertColumn(0, m_strName, LVCFMT_LEFT, rect.Width()/2, 0);
	m_ctrlScore.InsertColumn(1, m_strScore, LVCFMT_LEFT, rect.Width()/4, 1);
	m_ctrlScore.InsertColumn(2, m_strLevel, LVCFMT_LEFT, rect.Width()/4, 2);
}


BEGIN_MESSAGE_MAP(CScoreDlg, CBitmapPropPage)
	//{{AFX_MSG_MAP(CScoreDlg)
	ON_NOTIFY(LVN_BEGINLABELEDIT, IDC_ListScore, OnBeginLabelEdit)
	ON_NOTIFY(LVN_ENDLABELEDIT, IDC_ListScore, OnEndLabelEdit)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CScoreDlg message handlers

BOOL CScoreDlg::OnInitDialog() 
{
	CBitmapPropPage::OnInitDialog();

	LoadAllStrings();

	int index = 0;
	const_iterator itend(m_ScoreArray.end());
	iterator it(m_ScoreArray.begin());
	for(; it != itend; ++it, ++index)
		AddHiScore(index, it->m_strName, it->m_uScore, it->m_uLevel);

	return TRUE;  // return TRUE unless you set the focus to a control
}


void CScoreDlg::OnBeginLabelEdit(NMHDR* pNMHDR, LRESULT* pResult) 
{
	*pResult = m_bCanEditName ? 0 : 1;
}

void CScoreDlg::OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult) 
{
	LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;

	size_type index = pDispInfo->item.iItem;
	ASSERT(index < MAXSCORE);

	LPCTSTR pszText = pDispInfo->item.pszText;

	if( pszText )
		m_ScoreArray[index].m_strName = pszText;

	m_bCanEditName = FALSE;

#ifdef _DEBUG
	{
		const_iterator itend(m_ScoreArray.end());
		iterator it(m_ScoreArray.begin());
		TRACE("\nscore list:\n");
		index=0;
		for(; it != itend; ++it, ++index)
			TRACE("%u.: %s, %u, %u\n", unsigned(index), LPCTSTR(it->m_strName), it->m_uScore, it->m_uLevel);
		TRACE("-----------------\n");
	}
#endif

	*pResult = pszText ? 1 : 0;
}

BOOL CScoreDlg::OnKillActive() 
{
	SaveHiScore();
	return CBitmapPropPage::OnKillActive();
}

void CScoreDlg::OnOK() 
{
	SaveHiScore();
	CBitmapPropPage::OnOK();
}

void CScoreDlg::OnCancel() 
{
	SaveHiScore();
	CBitmapPropPage::OnCancel();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -