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);