龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

VC防止窗口和控件闪烁的方法(3)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
1)宏 ERASE_BKGND_BEGIN 和 ERASE_BKGND_END(pDC, clBrushColor) 搭配使用。 2)宏 ADD_NOERASE_CONTROL(IDC) 和 ADD_NOERASE_RECT(noEraseRect) 根据需要放在上面两个宏的中间,用来添加不

  1)宏 ERASE_BKGND_BEGIN 和 ERASE_BKGND_END(pDC, clBrushColor) 搭配使用。

  2)宏 ADD_NOERASE_CONTROL(IDC) 和 ADD_NOERASE_RECT(noEraseRect) 根据需要放在上面两个宏的中间,用来添加不需要重绘背景的区域(正是这些区域导致了闪烁),使用次数不限。其中参数noEraseRect是一个屏幕坐标系的RECT类型或CRect类型。

  使用举例1:

  在当前窗体的类中重写WM_ERASEBKGND消息处理函数如下:

BOOL CMyWnd::OnEraseBkgnd(CDC* pDC)
{
  ERASE_BKGND_BEGIN;
  ADD_NOERASE_RGN(IDC_BUTTON2);
  ADD_NOERASE_RGN(IDC_BUTTON1);
  ADD_NOERASE_RGN(IDC_LIST_STAT);
  ERASE_BKGND_END(pDC, GetSysColor(COLOR_3DFACE));
  return false;
}
  上面的IDC_BUTTON2,IDC_BUTTON1,IDC_LIST_STAT即窗体上的控件。

  你可以指定其他已存在的控件。本文发表于http://bianceng.cn(编程入门网)

  这样,窗口在擦除背景时,将只对上述控件以后的”空白区域“使用系统色重绘,有效避免了闪烁。

  备注:

  重载WM_ERASEBKGND消息处理函数OnEraseBkgnd的方法,选择View->ClassWizard->classinfo选项卡:message filter下拉框:

  选择window,然后再选择message maps选项卡,在messages下拉框应该可以找到wm_erasebkgnd.双击添加.

  使用举例2:防止CListCtrl在拉动窗口时闪烁。

/* * No further full-erasing is required,
* to prevent screen flashing caused by background erase and view repaint.
* Only erase the blank area.
*/
BOOL CExListCtrl::OnEraseBkgnd(CDC* pDC) {
  //compute the holding-data-items area of this list control CRect rect;
  CPoint dataRgnTopLeftPoint;
  CPoint dataRgnBottomRightPoint;
  GetItemPosition(0 , &dataRgnTopLeftPoint);
  GetItemPosition(GetItemCount() , &dataRgnBottomRightPoint);
  if(!GetHeaderCtrl()->GetItemRect(GetHeaderCtrl()->GetItemCount()-1, rect)) return
  CListCtrl::OnEraseBkgnd(pDC);
  dataRgnBottomRightPoint.x = rect.right;
  rect.SetRect(dataRgnTopLeftPoint, (CPoint)(dataRgnBottomRightPoint - CPoint(2,2)));
  ClientToScreen(dataRgnRect);
  //compute and erase the blank area. Using the Marco. ERASE_BKGND_BEGIN;
  ADD_NOERASE_RECT(dataRgnRect);
  ERASE_BKGND_END(pDC, GetBkColor());
  return false;
}

  说明:CListCtrl在拉动的时候,会前以背景色重刷背景,再在上面绘制有数据的Items, 而没有数据的区域则保持背景色。因此,如果在BOOL CExListCtrl::OnEraseBkgnd(CDC* pDC) 函数中简单的return false,那么没有数据的区域将显示不正常。 故举例2中先计算出有数据的items的区域,这是不需要以背景重刷的区域。 再使用本文的宏,就可以有效避免CListCtrl在拉动时候的闪烁。

精彩图集

赞助商链接