2013-05-12 2 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

+0

@olevegard, тогда он не отображается. Из проб и ошибок я узнал, что оценка отображается за тем, что есть в окне. В этом случае игровой экран. – Xellos

ответ

2

С кодом есть несколько проблем:
1. Создаваемая вами hDC будет иметь координаты относительно окна рабочего стола. Чтобы нарисовать текст в вашем окне, используйте CClientDC следующим образом: CClientDC dc (this); (см. http://msdn.microsoft.com/en-US/library/s8kx4w44%28v=vs.80%29.aspx)
2. У кода, который у вас есть, будет протекать постоянный ток каждый раз, когда вызывается функция. Метод в # 1 исправит это.
3. Ваш код краски должен быть выполнен в CView :: OnDraw. Там вы получаете DC, переданный вам, и вам не нужно беспокоиться о создании его с помощью CClientDC. Установите переменные, которые вы хотите нарисовать (например, ваши очки или очки), сохраните их как членов класса и нарисуйте их в CView :: OnDraw. Не делайте чертеж в методе updateScore. Имеют смысл? Повесить там!

+0

Я попробовал то, что вы предложили. Но теперь я заканчиваю тем, что показываю где-то около центра мое окно. И он меняет свое положение каждый раз, когда я перемещаю свое главное окно в любом месте. Я хотел бы, чтобы это было зафиксировано в одном месте, чтобы оно не было таким, как таковое. – Xellos

+0

Я не уверен в вашем конкретном приложении, но начну с размещения rcScore.top на чем-то вроде 50 и посмотрим, как это выглядит, вместо того, чтобы делать расчеты, которые вы делаете. Однако, если это представление прокрутки, вам нужно будет отрегулировать верхнюю часть для прокрутки вниз и т. Д. Помогает ли это? – edtheprogrammerguy

+0

Посмотрите на ссылку, на картинке, в основном, на моем экране. Я просто пытаюсь добавить функцию оценки к этому. Сделанные вычисления, я использовал для изменения размера исходного окна на рабочем экране, поэтому я уверен, что они работают. Спасибо за помощь. – Xellos

Смежные вопросы