CEdit控件设置透明背景后,多行字体动态更新时会有重叠现象,重叠原因其实是就背景刷的问题,解决这个问题直接上代码,同样其它控件也适合。
新建一个CBmpEdit类,继承CEdit ,我们只要重写OnEnChange,OnEraseBkgnd,CtlColor,OnEnVscroll方法就可以了,具体代码如下:
// BmpEdit.cpp : 实现文件 void CBmpEdit::OnEnChange() { Invalidate(); // TODO: 在此添加控件通知处理程序代码 } BOOL CBmpEdit::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息处理程序代码和/或调用默认值 PaintBk(pDC); //return CEdit::OnEraseBkgnd(pDC); return TRUE; } HBRUSH CBmpEdit::CtlColor(CDC* pDC, UINT nCtlColor) { // TODO: 在此更改 DC 的任何特性 pDC->SetBkMode(TRANSPARENT); //字体色彩 pDC->SetTextColor(RGB(248, 227, 192)); //空的画笔 return (HBRUSH)GetStockObject(HOLLOW_BRUSH); // TODO: 如果不应调用父级的处理程序,则返回非 null 画笔 return NULL; } void CBmpEdit::PaintBk(CDC* pDC) { CClientDC clDC(GetParent()); CRect rect; CRect rect1; GetClientRect(rect); GetWindowRect(rect1); GetParent()->ScreenToClient(rect1); if (m_dcBk.m_hDC == NULL) { m_dcBk.CreateCompatibleDC(&clDC); m_bmpBk.CreateCompatibleBitmap(&clDC, rect.Width(), rect.Height()); m_pbmpOldBk = m_dcBk.SelectObject(&m_bmpBk); m_dcBk.BitBlt(0, 0, rect.Width(), rect.Height(), &clDC, rect1.left, rect1.top, SRCCOPY); } // if pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &m_dcBk, 0, 0, SRCCOPY); } // End of PaintBk void CBmpEdit::OnEnVscroll() { // TODO: 在此添加控件通知处理程序代码 Invalidate(); }