描述:
为了避免刷新时屏幕闪烁,从别人那里学了一个类,在别人的程序中不闪烁,而我不管怎么用他都闪烁,我自己实在看不出有什么毛病,请教各位.
class CMemDC
{
public:
CMemDC();
CMemDC(HDC hdc,RECT rc)
{
m_hDCold = hdc;
m_hDCMem = CreateCompatibleDC(hdc);
// GetClipBox(hdc,&m_rect);
m_rect = rc;
//
// Create a bitmap big enough for our client rect
//
m_hBMMem = CreateCompatibleBitmap(hdc,
m_rect.right-m_rect.left,
m_rect.bottom-m_rect.top);
//
// Select the bitmap into the off-screen dc
//
m_hBMOld = (HBITMAP) SelectObject(m_hDCMem, m_hBMMem);
SIZE sz;
SetWindowExtEx(m_hDCMem,m_rect.left, m_rect.top,&sz);
}
virtual ~CMemDC()
{
BitBlt(m_hDCold,
m_rect.left, m_rect.top,
m_rect.right-m_rect.left,
m_rect.bottom-m_rect.top,
m_hDCMem,
0, 0,
SRCCOPY);
//
// Done with off screen bitmap and dc
//
SelectObject(m_hDCMem, m_hBMOld);
DeleteObject(m_hBMMem);
DeleteDC(m_hDCMem);
}
HDC GetDC() {return m_hDCMem;}
private:
HDC m_hDCold,m_hDCMem;
HBITMAP m_hBMMem, m_hBMOld;
RECT m_rect;
};
HRESULT OnDraw(ATL_DRAWINFO& di)
{
RECT rc;
GetClientRect(&rc);
CMemDC dc(di.hdcDraw,rc);
DrawAll(dc.GetDC(),rc);
return S_OK;
}
void CLtlGrid::DrawAll(HDC hDC, RECT rc)
{
Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom);
SetTextAlign(hDC, TA_CENTER|TA_BASELINE);
LPCTSTR pszText = _T("ATL 3.0 : LtlGrid");
TextOut(hDC,
(rc.left + rc.right) / 2,
(rc.top + rc.bottom) / 2,
pszText,
lstrlen(pszText));
}
解决方案1:
需要处理
OnEraseBkgrd消息直接返回TRUE;