У нас есть приложение в 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;
}