MFC OnSize () проблема с недействительным

Я только начинаю изучать основы MFC, поэтому я написал небольшую тренировочную программу, которая просто отслеживает координаты относительно окна и экрана при каждом движении и изменяет размер, все отлично работает, кроме этого:

введите описание изображения здесь

Как сделать так, чтобы при изменении размера окна не оставалось задних красок?

Вот мой код onSize ():

void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);

// TODO: Add your message handler code here

// Get the window
CDC* dc;
dc = GetDC();
CRect rect;
GetWindowRect(rect);
InvalidateRect(rect);

// This if statement just makes sure new red text coordinates are not printed immediately upon starting the program
if (numSizeCalls > 1){
// Set up the font for future text output
CFont myfont;
VERIFY(myfont.CreateFont(
20, // nHeight in points
0,  // nWidth
0,  // nEscapement
0,  // nOrientation
FW_NORMAL,  // nWeight
TRUE,   // bItalic
FALSE,  // bUnderline
0,  // cStrikeOut
ANSI_CHARSET,   // nCharSet
OUT_DEFAULT_PRECIS,        // nOutPrecision
CLIP_DEFAULT_PRECIS,        // nClipPrecision
DEFAULT_QUALITY,              // nQuality
DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
_T("Arial")));  // lpszFacename
dc->SetTextColor(RGB(255, 0, 0));
dc->SelectObject(myfont);
DeleteObject(myfont);

// Set window coordinates relative to client area
ScreenToClient(&rect);

// Format them for TextOut
CString tl;
tl.Format(L"%d %d ; ", rect.top, rect.left);
CString tr;
tr.Format(L"%d %d ; ", rect.top, rect.right);
CString bl;
bl.Format(L"%d %d ; ", rect.bottom, rect.left);
CString br;
br.Format(L"%d %d", rect.bottom, rect.right);

// Get position for TextOut
TextOutYPosition += 20;

// Print them
dc->TextOut(5, TextOutYPosition, tl + tr + bl + br, _tcslen(tl) + _tcslen(tr) + _tcslen(bl) + _tcslen(br));

// Set coords relative to the screen
GetWindowRect(&rect);

// Format them for TextOut
tl.Format(L"%d %d ; ", rect.top, rect.left);
tr.Format(L"%d %d ; ", rect.top, rect.right);
bl.Format(L"%d %d ; ", rect.bottom, rect.left);
br.Format(L"%d %d", rect.bottom, rect.right);

// Get position for TextOut
TextOutYPosition += 20;

// Print them
dc->TextOut(5, TextOutYPosition, tl + tr + bl + br, _tcslen(tl) + _tcslen(tr) + _tcslen(bl) + _tcslen(br));
}
numSizeCalls++;
}

0

Решение

InvalidateRect занимает прямоугольник в клиент координаты. Вы передаете это результаты GetWindowRect, который возвращает экран координаты. Окно не становится недействительным должным образом, поэтому не стирается.

Обратите внимание, что при удалении окна рисунок, который вы выполняете в функции OnSize, также будет удален. Вы должны действительно зарезервировать всю свою живопись для функции OnPaint, чтобы предотвратить эту проблему.

0

Другие решения


По вопросам рекламы [email protected]