透明CEdit控件滚动更新字体重叠解决方案

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

 

猜你喜欢

转载自www.cnblogs.com/xsad2012/p/9264845.html