2013-05-12 48 views
1

我有點新使用MFC和VC++,但我將它作爲課程的一部分,我必須堅持使用VC++。在基於MFC的應用程序上顯示文本

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

這是我一直在下面做一個簡單的samegame教程。但是,當我嘗試顯示分數時,即使在調用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

如果您將'rcScore.top'硬編碼爲您知道在窗口內的某個值,會發生什麼情況?例如'rcScore.top = 100;' – olevegard 2013-05-12 19:52:35

+0

@olevegard然後它不顯示。從試錯中,我發現分數顯示在窗口背後。在這種情況下,遊戲畫面。 – Xellos 2013-05-18 14:03:36

回答

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創建一個DC。設置你想繪製的變量(例如你的點或分數),將它們存儲爲類成員,並將它們繪製在CView :: OnDraw中。 不要使用updateScore方法繪製圖形。 有意義嗎?掛在那裏!

+0

我嘗試了你的建議。 但現在我最終得分顯示在我的窗口附近的某處。每當我將主窗口移到任何地方時,它都會改變它的位置。我希望將它固定在一個地方,以免它出現。 – Xellos 2013-05-18 14:30:08

+0

我不確定你的具體應用程序,但開始將rcScore.top放在類似於50的東西上,看看它的外觀,而不是做你正在做的計算。但是,如果它是一個滾動視圖,您將不得不調整其向下滾動量的上限等。這有幫助嗎? – edtheprogrammerguy 2013-05-18 19:29:45

+0

看看鏈接,圖片基本上是我的屏幕的樣子。我只是試圖將分數函數添加到該函數中。所做的計算,我用來調整我的工作屏幕的初始窗口,所以我很確定他們的工作。 感謝您的幫助。 – Xellos 2013-05-19 05:01:48

相關問題