Размер контекста устройства иногда уменьшается во время рисования - PullRequest
0 голосов
/ 13 февраля 2020

У нас есть приложение в MF C.

Мы столкнулись с проблемой контекста устройства. Ситуация такая - у нас есть окно отображения информации, которое имеет переменный размер и положение. Во время сценария с изменением размера и положения ios рисуется только часть окна, как будто вырезается часть окна.

Мы сомневались, что существует разница между прямоугольником в контексте устройства и прямоугольником, возвращаемым из Функция GetWindowRect. Итак, мы зарегистрировали и проверили размер прямоугольника окна, который рисуется из контекста устройства, а также прямоугольника окна памяти D C, который используется для рисования во время сценария проблемы.

Но оба вернулись маленький размер окна прямоугольника. То есть контекст устройства имеет только частичную информацию о прямоугольнике в то время.

  • Мы не вызывали UpdateWindow () или Invalidate ().
  • Когда мы фокусировали окно, используя WinSpy, все окно присутствует, но рисуется только эта небольшая часть.
  • Мы поместили, а затем удалили другое окно над этим окном, чтобы проверить, не произойдет ли перерисовка. Но проблема не устранена.

Может кто-нибудь помочь исправить эту проблему?

Привет, наш код такой.
BOOL InfoDisplayWindow :: OnEraseBkgnd (CD C * pD C) {

CBitmap m_bitmap; // Offscreen bitmap
CBitmap* m_oldBitmap; // bitmap originally found
CRect m_rect; // Rectangle of drawing area.

HDC hDC = CreateCompatibleDC(pDC->m_hDC);
CDC* pTmpDC = CDC::FromHandle(hDC);
pDC->GetClipBox(&m_rect);
m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
m_oldBitmap = pTmpDC->SelectObject(&m_bitmap);
pTmpDC->SetWindowOrg(m_rect.left, m_rect.top);

CRect rc;
GetClientRect(&rc);
pTmpDC->FillSolidRect(&rc, COLOR_KEY);

DrawFunction();// Text is displayed in this function

CPen pen(PS_SOLID, SOLID_BORDER_WIDTH, BORDER_COLOR);
CPen *old_pen = pTmpDC->SelectObject(&pen);

// Drawing the 4 boarders of the window here.
pTmpDC->MoveTo(rc.left, rc.bottom - 1);
pTmpDC->LineTo(rc.left, rc.top);
pTmpDC->LineTo(rc.right - 1, rc.top);
pTmpDC->LineTo(rc.right - 1, rc.bottom - 1);
pTmpDC->LineTo(rc.left, rc.bottom - 1);
pTmpDC->SelectObject(old_pen);

// Copy the offscreen bitmap onto the screen.
pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
  pTmpDC, m_rect.left, m_rect.top, SRCCOPY);
//Swap back the original bitmap.
pTmpDC->SelectObject(m_oldBitmap);

return TRUE;

}

1 Ответ

0 голосов
/ 14 февраля 2020

Полагаю, вы получаете контекст устройства (D C) либо из BeginPaint (или используя MF C с использованием CPaintD C), либо из GetD C. Все эти варианты дают вам D C для клиентской области вашего окна, которая не включает границы и строку заголовка. Соответствующий прямоугольник возвращается GetClientRect. GetWindowRect соответствует GetWindowD C, что позволяет рисовать во всей области. Помните, что GetWindowRect дает вам экранные координаты, поэтому вы должны преобразовать их с помощью ScreenToClient, прежде чем применять их к вашему D C.

...