1

我对使用 MFC 和 VC++ 本身有点陌生,但我将其作为课程的一部分,我必须坚持使用 VC++。

http://www.cprogramming.com/tutorial/game_programming/same_game_part1.html

这是我一直在遵循的制作简单相同游戏的教程。但是,当我尝试显示分数时,分数会显示在我的应用程序窗口下方或外部,即使我在调用 updateWindow() 之前已经显示了分数。我尝试了各种方法,但我有点迷失在这里。

这是我用来显示分数的代码:

void CSameGameView::updateScore()
{
CSameGameDoc* pDoc = GetDocument();
CRect rcClient, rcWindow;
GetClientRect(&rcClient);
GetParentFrame()->GetWindowRect(&rcWindow);

int nHeightDiff = rcWindow.Height() - rcClient.Height();

rcScore.top=rcWindow.top + pDoc->GetHeight() * pDoc->GetRows() + nHeightDiff;
rcScore.left=rcWindow.left + 50;
rcScore.right=rcWindow.left + pDoc->GetWidth() - 50;
rcScore.bottom=rcScore.top + 20;

CString str;
double points = Score::getScore();
str.Format(_T("Score: %0.2f"), points);

HDC hDC=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
COLORREF clr = pDoc->GetBoardSpace(-1, -1); //this return background colour

pDC->FillSolidRect(&rcScore, clr);
DrawText(hDC, (LPCTSTR) str, -1, (LPRECT) &rcScore, DT_CENTER);
}

感谢您的帮助,如果问题没有意义或模棱两可,我很抱歉。

4

1 回答 1

2

您的代码有几个问题:
1. 您正在创建的 hDC 将具有相对于桌面窗口的坐标。要在窗口中绘制文本,请像这样使用 CClientDC: CClientDC dc(this); (请参阅http://msdn.microsoft.com/en-US/library/s8kx4w44%28v=vs.80%29.aspx
2. 每次调用该函数时,您拥有的代码都会泄漏一个 DC。#1中的方法将解决这个问题。
3. 你的绘制代码应该在 CView::OnDraw 中完成。在那里你会得到一个 DC 传递给你,你不必担心用 CClientDC 创建一个。设置你想要绘制的变量(例如你的分数或分数),将它们存储为类成员并在 CView::OnDraw 中绘制它们。不要在 updateScore 方法中进行绘图。说得通?挂在那里!

于 2013-05-13T02:45:23.917 回答