在使用VC进行绘图时,最郁闷的就是屏幕闪烁问题。有时只能使用双缓冲去解决,当然更多的时候是去忍受。有没有什么这种的方法?有,那就是重载OnEraseBkgnd()函数。该函数控制重绘图的背景刷新,默认将窗口用系统背景颜色填充,即用白色将窗口刷一遍。这就产生的严重的闪烁效果,有时看到屏幕白的一条一闪而过,非常不爽。如果将该函数返回值设为TRUE,即不进行背景重绘,虽然屏幕的刷新仍然会闪烁,但是就不会像原来那么严重了。因为窗口的颜色通常与白色反差加大,所以闪烁比较严重。而不进行背景重绘,由于大部分区域新画的颜色与旧颜色相同,就不会有严重的闪烁效果了。这样做有没有什么不好的后果呢?通常情况是没有的,因为一般都是执行整个窗口的重绘,即使用白色刷了背景,也是没有任何作用的。除非你刷新整个屏幕,但只重绘一小部分,这种情况可能么?有可能,比如你通过点击一个按钮来刷新整个窗口,重新绘制的有效区域要比刷新之前小,这些不重叠的区域在重载OnEraseBkgnd()函数之前会变作白色,而重载之后会保持原来的样子。
下面说两种重载OnEraseBkgnd()函数的方法:
1)手工重载
在要重载的类(通常为CView的子类)声明部分(.h文件)添加虚函数的声明:
virtual BOOL OnEraseBkgnd(CDC* pDC);
注意添加在//{{AFX_VIRTUAL(CMyView)和//}}AFX_VIRTUAL之间。
在类的定义文件(.cpp)中的MESSAFE_MAP部分,//{{AFX_MSG_MAP(CMyView)和 //}}AFX_MSG_MAP之间添加ON_WM_ERASEBKGND()。
然后在函数体添加:
BOOL CMyView::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
这样就搞定了。
2)使用Classwizard
或者使用Classwizard来进行,省去了写代码。通过菜单View->ClassWizard(或者ctrl+W)->Class name中选你的view。然后在Class Info选项卡中,将Message Filter设为Child Window。重新切换到Message Map选项卡,在Messages中找到WM_ERASEBKGND,双击就添加成功了。点击右边的Edit Code,将函数体改为return TRUE,搞定。这种方法不需要记忆,简单省事,强烈推荐。
相关推荐
另外,可以重载 OnEraseBkgnd(CDC* pDC) 函数直接返回 TRUE,这样背景没有了,结果图形显示的确不闪了。 双缓存方法可以解决闪烁问题,即除了在屏幕上有图形进行显示以外,在内存中也有图形在绘制。我们可以把要...
2. **OnEraseBkgnd** 事件处理:在ListCtrlEx中,可以通过重载`OnEraseBkgnd`函数,阻止系统默认的背景擦除行为,减少不必要的重绘操作,进一步减轻闪烁。 3. **RedrawWindow** 和 `UpdateWindow` 函数的使用:适当...
1.重载了OnEraseBkgnd函数,它是用来在每次重绘之前用空白位图擦除背景的函数,我们让它每次用我们自定义的位图来作为背景 2.我们使用了双缓存的结构,即先把背景图形绘制在内存中,绘制好了一起显示出去
- 为了减少闪烁,通常需要覆盖`OnEraseBkgnd`和`OnPaint`这两个MFC窗口类的虚函数。 - `OnEraseBkgnd`函数负责清除背景,在实现双缓冲时通常返回`TRUE`以避免背景被清除,从而减少闪烁。 - `OnPaint`函数则负责...
另一种方法是重载`OnEraseBkgnd`函数并直接返回`TRUE`,从而跳过背景绘制过程。 2. **采用双缓冲技术**:双缓冲是一种常用的技术,它可以在内存中先绘制好图形,然后再一次性地将图形复制到屏幕上。这种方法可以...
3. **处理WM_ERASEBKGND消息**:透明效果的实现还需要覆盖`OnEraseBkgnd`函数,返回`TRUE`,防止系统默认的擦除背景操作,因为这可能导致不透明。 4. **设置透明区域**:在`OnCreate`或者`OnNcCalcSize`等适当的...
1. 使用OnEraseBkgnd函数:重载此函数,返回TRUE,阻止默认的背景擦除操作,以减少闪烁。 2. 实现双缓冲:在内存中创建一个位图,将图像绘制到位图上,然后一次性将位图绘制到窗口上,避免了多次重绘。 3. 使用 ...
- 重载`OnEraseBkgnd`函数,返回TRUE,阻止系统默认的背景清除。 然而,仅仅去掉背景绘制会导致新旧图形叠加,显示混乱。为了解决这个问题,可以采用**双缓冲技术**。双缓冲是指在内存中完成图形的绘制,然后一次...
3. **重载`OnEraseBkgnd`**:通过重载`OnEraseBkgnd`函数并直接返回TRUE来禁止背景清除。 ```cpp BOOL CMyView::OnEraseBkgnd(CDC *pDC) { return TRUE; } ``` 然而,这些方法虽然消除了闪烁,但也可能导致...
同时,还可以结合OnEraseBkgnd()函数的重写,返回TRUE来阻止系统默认的背景清除,进一步优化性能。 Windows消息处理是MFC应用程序的核心部分。每个窗口都有一个消息队列,用于存储待处理的消息。当用户与窗口交互,...
5. 可能会有的虚函数重写,如`OnEraseBkgnd`,以防止闪烁或实现自定义背景效果。 `labelex.cpp`文件则是`CLabelEx`类的实现部分,主要包括: 1. 类的构造函数和析构函数,可能包含初始化或清理工作。 2. 上述...
4. **响应WM_ERASEBKGND消息**:为了避免闪烁,我们还需要重载`OnEraseBkgnd()`函数,清除背景并避免系统默认的擦除操作。 5. **自定义样式**:通过自绘,我们可以实现各种定制的样式,例如改变进度条的形状(如...
在对话框的类定义中,还需要重载`OnEraseBkgnd`函数,防止系统默认的擦除背景操作导致的闪烁问题。通常,这个函数会返回`TRUE`,表示对话框自己处理背景擦除。 除了基本的对话框,还可以为对话框中的控件应用XP风格...
为了防止在Tab控件背景被擦除时出现闪烁,我们需要为`CMyTabCtrl`类添加`OnEraseBkgnd()`消息处理函数。在这个函数中,我们可以填充控件的背景颜色,以保持一致的视觉效果。 ```cpp BOOL CMyTabCtrl::...
例如,使用CLayoutView或CFormView进行控件的布局管理,使用OnEraseBkgnd防止闪烁,以及使用OnPaint优化显示效果。此外,对于复杂的交互,可能需要结合其他控件如列表视图(CListViewCtrl)、编辑框(CEdit)等,以及...
此外,可能还需要实现OnEraseBkgnd()函数,以处理背景清除,防止出现闪烁现象。同时,可能还会涉及消息映射,以处理按钮的各种消息,如BN_CLICKED,以便在按钮被点击时执行相应的动作。 在描述中提到的"演示截图",...
在MFC中,背景颜色可以通过重载OnEraseBkgnd()函数并使用CBrush类填充背景。至于画布大小,一般由窗口大小决定,但也可以提供缩放功能,这可能需要通过重绘整个画布并在适当比例下重新绘制所有图形来实现。 4. **...
可以通过重载`OnEraseBkgnd()`函数并返回`TRUE`来阻止系统默认的背景擦除。 6. **消息处理**: - 要注意处理WM_NCPAINT消息,因为这是系统绘制非客户区(包括标题栏、边框等)的部分。同样,我们可能需要自定义...
你还可以通过覆盖`OnEraseBkgnd`来避免闪烁,提高用户体验。 在MFC项目中使用`hoverbutton`,你需要: 1. 定义`CHoverButton`类,继承自`CButton`,并实现上述的重载函数。 2. 在资源编辑器中添加新的按钮控件,...
为了防止闪烁,可以重写`OnEraseBkgnd()`,避免系统默认的背景清除操作。 ```cpp BOOL CMyStatic::OnEraseBkgnd(CDC* pDC) { return TRUE; // 表示已处理背景擦除,阻止系统默认行为 } ``` 4. **应用自定义样式*...