• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы BFS
  • Дата начала
B

BFS

Когда я изменяю размер окна(например перетаскивая правый нижний край моего окна), то GetClipBox всё-равно считает, что обновлять нужно ВСЁ окно! вот с этим я хочу бороться, а так из-за наслоения фигур мерцания видны. Слышал, что такое исправляется переопределением OnEraseBkgnd, но каким образом..? Там явно недостаточно лишь того, что она будет возвращать значение true. Подскажите, как всё сделать, чтобы было красиво :)
 
B

BFS

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

если хочешь чтоб не моргало, рисуй Битмапками.
Код:
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);
//рисуй
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!