MFC 1) создаём в своём оконном классе пустой обработчик сообщения WM_ERASEBKGND:
Цитата | BOOL CViewListing::OnEraseBkgnd(CDC* pDC) { return FALSE; } |
2) в начало и конец функции обработки рисования (OnDraw или OnPaint) добавляем макросы PREPARE_BLIT_DC и DRAW_BLIT_DC:
Цитата | CMyView::OnDraw(CDC *pDC) { PREPARE_BLIT_DC(pDC);
// ... обычные функции рисования, например pDC->TextOut(...)
DRAW_BLIT_DC(pDC); } |
Тексты макросов:
Цитата | // создаем контекст, совместимый с данным, очищаем его и подменяем указатель на контекст #define PREPARE_BLIT_DC(pDCDest) CDC dcMem;\ dcMem.CreateCompatibleDC(pDCDest);\ CBitmap *pPrevBmpMem=dcMem.GetCurrentBitmap();\ CRect rCl; GetClientRect(rCl); CBitmap BmpNewMem;\ BmpNewMem.CreateCompatibleBitmap(pDCDest, rCl.Width(), rCl.Height());\ dcMem.SelectObject(&BmpNewMem);\ dcMem.FillSolidRect(rCl, RGB(255,255,255)); \ CDC *pDCTemp=pDCDest; pDCDest=&dcMem;
// обратная подмена, переносим изображение на исходный контекст #define DRAW_BLIT_DC(pDCDest) pDCDest=pDCTemp;\ pDCDest->BitBlt(rCl.left, rCl.top, rCl.Width(), rCl.Height(), &dcMem,\ rCl.left, rCl.top, SRCCOPY);\ dcMem.SelectObject(pPrevBmpMem); |
|