Invalidate、OnPaint、OnEraseBkgnd函数
来源:互联网 发布:ubuntu 记事本 编辑:程序博客网 时间:2024/06/05 10:02
Invalidate
OnPaint()与OnEraseBkgnd()区别与联系
在MFC中 任何一个window组件的绘图 都是放在这两个member function中
在设定上 OnEraseBkgnd()是用来画底图的 而OnPaint()是用来画主要对象的
举例说明 一个按钮是灰色的 上面还有文字
则OnEraseBkgnd()所做的事就是把按钮画成灰色
而OnPaint()所做的事就是画上文字
既然这两个member function都是用来画出组件的
那为何还要分OnPaint() 与 OnEraseBkgnd() 呢
其实OnPaint() 与 OnEraseBkgnd() 特性是有差的:
1. OnEraseBkgnd()的要求是快速 在里面的绘图程序最好是不要太耗时间因为每当window组件有任何小变动 都会马上呼叫OnEraseBkgnd()
2. OnPaint() 是只有在程序有空闲的时候才会被呼叫
3. OnEraseBkgnd() 是在 OnPaint() 之前呼叫的
所以 OnPaint()被呼叫一次之前 可能会呼叫OnEraseBkgnd()好几次
如果我们是一个在做图形化使用者接口的人,常需要把一张美美的图片设为我们dialog的底图,把绘图的程序代码放在OnPaint() 之中,可能会常碰到一些问题,比方说拖曳一个窗口在我们做的dialog上面一直移动,则dialog会变成灰色直到动作停止才恢复,这是因为每次需要重绘的时候 程序都会马上呼叫OnEraseBkgnd(), OnEraseBkgnd()就把dialog画成灰色而只有动作停止之后 程序才会呼叫OnPaint() 这时才会把我们要画的底图贴上去这个问题的解法 比较差点的方法是把OnEraseBkgnd() 改写成不做事的function如下所示:
BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
以上本来是会呼叫CDialog::OnEraseBkgnd() 但是如果我们不呼叫的话程序便不会画上灰色的底色了比较好的做法是直接将绘图的程序从OnPaint()移到OnEraseBkgnd()来做如下所示:
// m_bmpBKGND 為一CBitmap物件且事先早已載入我們的底圖
// 底圖的大小與我們的視窗client大小一致
BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)
{
CRect rc;
GetUpdateRect(&rc);
CDC srcDC;
srcDC.CreateCompatibleDC(pDC);
srcDC.SelectObject(m_bmpBKGND);
pDC->BitBlt(rc.left,rc.top,rc.GetWidth(),
rc.GetHeight(),&srcDC,rc.left,rc.top,SRCCOPY);
return TRUE;
}
每当重新绘画窗口的一个无效区域时,Windows就给窗口传递一条WM_ERASEBKGND消息。当窗口没有处理给消息时,DefWindowProc()就自动擦除窗口的背景,使用的是与该窗口关联的WNDCLASS结构中的hbrBackground字段确定的刷子。
这样,在自己的代码中处理WM_ERASEBKGND消息,我们可以动态的选择窗口背景的颜色。
- Invalidate、OnPaint、OnEraseBkgnd函数
- Invalidate、OnPaint、OnEraseBkgnd函数
- ONERASEBKGND OnPaint OnDraw
- OnEraseBkGnd和OnPaint
- OnPaint()与OnEraseBkgnd()
- OnPaint、OnEraseBkgnd及CtlColor
- OnPaint()与OnEraseBkgnd()
- OnEraseBkgnd与OnPaint
- OnPaint()和OnEraseBkgnd()
- OnEraseBkGnd与OnPaint
- OnCtlColor(),OnEraseBkgnd(),OnPaint()
- OnEraseBkGnd与OnPaint
- OnPaint 和OnEraseBkGnd区别
- OnPaint()与OnEraseBkgnd()的差异
- OnPaint和OnEraseBkgnd的区别
- OnPaint()与OnEraseBkgnd()的差异
- OnPaint OnEraseBkgnd的调用关系
- OnEraseBkGnd与OnPaint的联系
- 应答代码
- SPOJ 694 求不同子串数 后缀数组
- MFC自绘入门之(三)
- mysql 简单外键操作
- ssh通道技术
- Invalidate、OnPaint、OnEraseBkgnd函数
- 商业化APP的蓝海市场
- VMDebugger导致VS2005无法启动
- 多彩化的商业模式洪潮
- Xcode 5的新特性
- Unity3D 初探(1)
- oracle11g安装
- 影响分布式系统性能的3个方面
- 如何用VS2010打开并编译和生成VS2012编写的工程