2个回答
展开全部
OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中。OnPaint()是CWnd的类成员,负责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数,没有响应消息的功能.当视图变得无效时(包括大小的改变,移动,被遮盖等等),Windows发送WM_PAINT消息。该视图的OnPaint 处理函数通过创建CPaintDC类的DC对象来响应该消息并调用视图的OnDraw成员函数.OnPaint最后也要调用OnDraw,因此一般在OnDraw函数中进行绘制。
ONERASEBKGND实现双缓冲绘图,擦除背景的。
ONERASEBKGND实现双缓冲绘图,擦除背景的。
追问
谢谢大大,屏幕闪烁的话是因为没用ONERASEBKGND吧?双缓冲技术不太明白啊。。
追答
ONERASEBKGND避免闪烁的。首先当然是去掉MFC
提供的背景绘制过程了。实现的方法很多,
* 可以在窗口形成时给窗口的注册类的背景刷付NULL
* 也可以在形成以后修改背景
static CBrush brush(RGB(255,0,0));
SetClassLong(this->m_hWnd,GCL_HBRBACKGROUND,(LONG)(HBRUSH)brush);
* 要简单也可以重载OnEraseBkgnd(CDC* pDC)直接返回TRUE
这样背景没有了,结果图形显示的确不闪了,但是变得一团乱。怎么办?这就要用到双缓存的方法了。双缓冲就是除了在屏幕上有
图形进行显示以外,在内存中也有图形在绘制。我们可以把要显示的图形先在内存中绘制好,然后再一次性的将内存中的图形按照一个点一个点地覆盖到屏幕上去(这个过程非常快,因为是非常规整的内存拷贝)。这样在内存中绘图时,随便用什么反差大的背景色进行清除都不会闪,因为看不见。当贴到屏幕上时,因为内存中最终的图形与屏幕显示图形差别很小(如果没有运动,当然就没有差别),这样看起来就不会闪。
展开全部
我是在OnEraseBkgnd中做的,下边有段代码,不知道对你能不能有帮助。
BOOL CDeskShortDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
BITMAP BmpInfo;
CBitmap mpBitmap;
mpBitmap.LoadBitmap(IDB_KEHUDI);
mpBitmap.GetBitmap(&BmpInfo);
CBitmap* pOldBitmap;
CDC pDisplayMemDC;
pDisplayMemDC.CreateCompatibleDC(pDC);
pOldBitmap=(CBitmap*)pDisplayMemDC.SelectObject(&mpBitmap);
CRect hhhh;
GetClientRect(&hhhh);
pDC->StretchBlt(0,0,hhhh.Width(),hhhh.Height(), &pDisplayMemDC, 0,0,BmpInfo.bmWidth, BmpInfo.bmHeight, SRCCOPY);
//pDC->BitBlt(hhhh.left,hhhh.top,BmpInfo.bmWidth, BmpInfo.bmHeight, &pDisplayMemDC,0, 0, SRCCOPY);
pDisplayMemDC.SelectObject(pOldBitmap);
return TRUE;
}
BOOL CDeskShortDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
BITMAP BmpInfo;
CBitmap mpBitmap;
mpBitmap.LoadBitmap(IDB_KEHUDI);
mpBitmap.GetBitmap(&BmpInfo);
CBitmap* pOldBitmap;
CDC pDisplayMemDC;
pDisplayMemDC.CreateCompatibleDC(pDC);
pOldBitmap=(CBitmap*)pDisplayMemDC.SelectObject(&mpBitmap);
CRect hhhh;
GetClientRect(&hhhh);
pDC->StretchBlt(0,0,hhhh.Width(),hhhh.Height(), &pDisplayMemDC, 0,0,BmpInfo.bmWidth, BmpInfo.bmHeight, SRCCOPY);
//pDC->BitBlt(hhhh.left,hhhh.top,BmpInfo.bmWidth, BmpInfo.bmHeight, &pDisplayMemDC,0, 0, SRCCOPY);
pDisplayMemDC.SelectObject(pOldBitmap);
return TRUE;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询