我对使用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);
}
感谢您的帮助,如果问题没有意义或含糊不清,我很抱歉。
答案 0 :(得分: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方法中进行绘图。
合理?挂在那里!