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

0

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

Изображение 174551

Как я могу получить его так, что после изменения размера окна нет оставшихся красок?

Вот мой код 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
    Как выглядит ваш код OnSize?
  • 0
    @MarkRansom Я обновил свой вопрос с помощью кода
Теги:
mfc
invalidate

1 ответ

0

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

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

  • 0
    Я сделал изменение с GetWindowRect на GetClientRect, прежде чем я InvalidateRect, и конечная краска все еще происходит: /
  • 0
    @ Riptyde4 как выглядит ваш OnEraseBkgnd?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню