这段程序怎么用??

ayqlj 2003-08-31 09:09:54
为了避免刷新时屏幕闪烁,从别人那里学了一个类,在别人的程序中不闪烁,而我不管怎么用他都闪烁,我自己实在看不出有什么毛病,请教各位.
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));

}
...全文
67 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
atEleven 2003-08-31
  • 打赏
  • 举报
回复
在WM_PAINT消息发送之前,需要先确定是否刷新背景以及用什么Brush刷新背景.这就是WM_ERASEBKGRD消息.

因为你是使用MEMDC的位图直接复制到当前DC的,返回TRUE,表示不刷新窗口背景.

ayqlj 2003-08-31
  • 打赏
  • 举报
回复
atEleven 你说的是对的。
你能解释一下为什么 OnEraseBkgrd消息直接返回TRUE 屏幕就不在闪烁吗?
ayqlj 2003-08-31
  • 打赏
  • 举报
回复
这是在ATL中,楼上的我不太清楚你的意思能解释一下吗?
atEleven 2003-08-31
  • 打赏
  • 举报
回复
需要处理

OnEraseBkgrd消息直接返回TRUE;
紫郢剑侠 2003-08-31
  • 打赏
  • 举报
回复
UP

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧