Я только начинаю изучать основы 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++;
}
InvalidateRect
занимает прямоугольник в клиент координаты. Вы передаете это результаты GetWindowRect
, который возвращает экран координаты. Окно не становится недействительным должным образом, поэтому не стирается.
Обратите внимание, что при удалении окна рисунок, который вы выполняете в функции OnSize, также будет удален. Вы должны действительно зарезервировать всю свою живопись для функции OnPaint, чтобы предотвратить эту проблему.