Убрать мерцание при изменении размеров окна

  • Автор темы BFS
  • Дата начала
B
#1
Когда я изменяю размер окна(например перетаскивая правый нижний край моего окна), то GetClipBox всё-равно считает, что обновлять нужно ВСЁ окно! вот с этим я хочу бороться, а так из-за наслоения фигур мерцания видны. Слышал, что такое исправляется переопределением OnEraseBkgnd, но каким образом..? Там явно недостаточно лишь того, что она будет возвращать значение true. Подскажите, как всё сделать, чтобы было красиво :)
 
B
#3
Pasha, а каким образом следует её определить, чтобы всё нормально работало?
у меня функция
Код:
BOOL CLastView::OnEraseBkgnd(CDC *pDC)
{
return (false);
}
описана в C*View, в сообщения я дописал ON_WM_ERASEBKGND(). соотвествтвенно в *.h файле у меня
Код:
afx_msg BOOL OnEraseBkgnd(
CDC* pDC 
);
OnEraseBkgnd принимает это сообщения, но вне зависимости, от значения, которое она возвращает(true/false), я наблюдаю одну и ту же картину: моё окно не обновляется вообще :) То есть вот я запускаю на выполнение программу(из вижлы), а в окне представление - мой код :)

Подскажите пожалуйста, как правильно всё сделать!
 
D

Dimmuborgir

#4
если хочешь чтоб не моргало, рисуй Битмапками.
Код:
class CMemDC : public CDC {
private:	  
CBitmap	m_bitmap;		
CBitmap*  m_oldBitmap;	 
CDC*	  m_pDC;		  
CRect	 m_rect;		 
BOOL	  m_bMemDC;  
public:

CMemDC(CDC* pDC, const CRect* pRect = NULL);

~CMemDC(); 

// Allow usage as a pointer	
CMemDC* operator->();

// Allow usage as a pointer	
operator CMemDC*();

};


CMemDC::CMemDC(CDC* pDC, const CRect* pRect) : CDC()
{
ASSERT(pDC != NULL); 

// Some initialization
m_pDC = pDC;
m_oldBitmap = NULL;

m_bMemDC = !pDC->IsPrinting();
// Get the rectangle to draw
if (pRect == NULL) 
{
pDC->GetClipBox(&m_rect);
} 
else 
{
m_rect = *pRect;
}

if (m_bMemDC) 
{
// Create a Memory DC
CreateCompatibleDC(pDC);
pDC->LPtoDP(&m_rect);

m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(),m_rect.Height());
m_oldBitmap = SelectObject(&m_bitmap);

SetMapMode(pDC->GetMapMode());

SetWindowExt(pDC->GetWindowExt());
SetViewportExt(pDC->GetViewportExt());

pDC->DPtoLP(&m_rect);
SetWindowOrg(m_rect.left, m_rect.top);
} 
else 
{
// Make a copy of the relevent parts of the current 
// DC for printing
m_bPrinting = pDC->m_bPrinting;
m_hDC	  = pDC->m_hDC;
m_hAttribDC = pDC->m_hAttribDC;

}
// Fill background 
FillSolidRect(m_rect, pDC->GetBkColor());
}


CMemDC::~CMemDC()	 
{		 
if (m_bMemDC) 
{
// Copy the offscreen bitmap onto the screen
m_pDC->BitBlt(m_rect.left, m_rect.top, 
m_rect.Width(), m_rect.Height(),
this, m_rect.left, m_rect.top,SRCCOPY);			
//Swap back the original bitmap.
SelectObject(m_oldBitmap);		
} 
else 
{
// All we need to do is replace the DC with an illegal
// value, this keeps us from accidentally deleting the 
// handles associated with the CDC that was passed to 
// the constructor.			 
m_hDC = m_hAttribDC = NULL;
}	  
}

CMemDC*
CMemDC::operator->() 
{
return this;
} 

CMemDC::operator CMemDC*() 
{
return this;
}
все.
дальше вместо своего контекста используешь контекст CMemDC следующим образом
CDC _dc(this);
CMemDC dc(&dc);
//рисуй