当前位置:C++技术网 > 资讯 > 完美记事项目:10 CRichEditCtrl的背景重绘

完美记事项目:10 CRichEditCtrl的背景重绘

更新时间:2015-06-26 19:07:49浏览次数:1+次

    CRichEditCtrl 背景问题


    现在还在想怎么处理闪屏问题,先把在控件上绘制背景的部分跟大家分享下:
    OnEraseBkgnd、OnPaint与画面重绘
    窗体在重绘时,由于过频的刷新会引起闪烁现象,窗体在刷新时,总要有一个擦除原来图象的过程。OnEraseBkgnd利用背景色填充窗体绘图区,然后在调用新的绘图代码进行重绘,这样一擦一写造成了图象颜色的反差。当WM_PAINT的响应很频繁的时候,这种反差也就越发明显。
    当窗口整体需要重绘时,系统依次发送WM_NCPAINT、WM_ERASEBKGND、WM_PAINT三个独立的消息,即先绘制框架部分,再绘制客户区背景,最后绘制客户区,根据需要也可能只产生其中某一个消息响应。任何一个window组件的绘图,都是放在OnPaint、OnEraseBkgnd中。在设定上 OnEraseBkgnd是用来画底图的而OnPaint是用来画主要对象的。
 
    举例说明:一个按钮是灰色的,上面还有文字,则OnEraseBkgnd所做的事就是把按钮画成灰色,而OnPaint()所做的事就是画上文字
 
    重载OnEraseBkgnd 先绘出控件背景
    示例代码:

CDC memdc; 
memdc.CreateCompatibleDC(pDC); 
CBitmap bmp; 
CBitmap *pOldBmp; 
BITMAP bm; 
CRect rct; 
bmp.LoadBitmap(IDB_RICHTEXT);//加载资源 
bmp.GetBitmap(&bm); 
GetWindowRect(&rct); //获得window区域 
ScreenToClient(&rct); 
  
pOldBmp = (CBitmap *)memdc.SelectObject(&bmp); 
SetStretchBltMode(pDC->m_hDC,STRETCH_HALFTONE);//防止BMP图片放大缩小失真 
pDC->StretchBlt(0 ,0,rct.Width(),rct.Height(),&memdc,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY); 
memdc.SelectObject(pOldBmp); 
memdc.DeleteDC(); 
SetWindowLong(m_hWnd, GWL_EXSTYLE,WS_EX_TRANSPARENT);